]> granicus.if.org Git - icinga2/blob - lib/livestatus/statustable.cpp
Merge pull request #7204 from episodeiv/master
[icinga2] / lib / livestatus / statustable.cpp
1 /* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
2
3 #include "livestatus/statustable.hpp"
4 #include "livestatus/livestatuslistener.hpp"
5 #include "icinga/icingaapplication.hpp"
6 #include "icinga/cib.hpp"
7 #include "icinga/host.hpp"
8 #include "icinga/service.hpp"
9 #include "base/configtype.hpp"
10 #include "base/utility.hpp"
11 #include "base/application.hpp"
12
13 using namespace icinga;
14
15 StatusTable::StatusTable()
16 {
17         AddColumns(this);
18 }
19
20 void StatusTable::AddColumns(Table *table, const String& prefix,
21         const Column::ObjectAccessor& objectAccessor)
22 {
23         table->AddColumn(prefix + "neb_callbacks", Column(&Table::ZeroAccessor, objectAccessor));
24         table->AddColumn(prefix + "neb_callbacks_rate", Column(&Table::ZeroAccessor, objectAccessor));
25
26         table->AddColumn(prefix + "requests", Column(&Table::ZeroAccessor, objectAccessor));
27         table->AddColumn(prefix + "requests_rate", Column(&Table::ZeroAccessor, objectAccessor));
28
29         table->AddColumn(prefix + "connections", Column(&StatusTable::ConnectionsAccessor, objectAccessor));
30         table->AddColumn(prefix + "connections_rate", Column(&StatusTable::ConnectionsRateAccessor, objectAccessor));
31
32         table->AddColumn(prefix + "service_checks", Column(&StatusTable::ServiceChecksAccessor, objectAccessor));
33         table->AddColumn(prefix + "service_checks_rate", Column(&StatusTable::ServiceChecksRateAccessor, objectAccessor));
34
35         table->AddColumn(prefix + "host_checks", Column(&StatusTable::HostChecksAccessor, objectAccessor));
36         table->AddColumn(prefix + "host_checks_rate", Column(&StatusTable::HostChecksRateAccessor, objectAccessor));
37
38         table->AddColumn(prefix + "forks", Column(&Table::ZeroAccessor, objectAccessor));
39         table->AddColumn(prefix + "forks_rate", Column(&Table::ZeroAccessor, objectAccessor));
40
41         table->AddColumn(prefix + "log_messages", Column(&Table::ZeroAccessor, objectAccessor));
42         table->AddColumn(prefix + "log_messages_rate", Column(&Table::ZeroAccessor, objectAccessor));
43
44         table->AddColumn(prefix + "external_commands", Column(&StatusTable::ExternalCommandsAccessor, objectAccessor));
45         table->AddColumn(prefix + "external_commands_rate", Column(&StatusTable::ExternalCommandsRateAccessor, objectAccessor));
46
47         table->AddColumn(prefix + "livechecks", Column(&Table::ZeroAccessor, objectAccessor));
48         table->AddColumn(prefix + "livechecks_rate", Column(&Table::ZeroAccessor, objectAccessor));
49
50         table->AddColumn(prefix + "livecheck_overflows", Column(&Table::ZeroAccessor, objectAccessor));
51         table->AddColumn(prefix + "livecheck_overflows_rate", Column(&Table::ZeroAccessor, objectAccessor));
52
53         table->AddColumn(prefix + "nagios_pid", Column(&StatusTable::NagiosPidAccessor, objectAccessor));
54         table->AddColumn(prefix + "enable_notifications", Column(&StatusTable::EnableNotificationsAccessor, objectAccessor));
55         table->AddColumn(prefix + "execute_service_checks", Column(&StatusTable::ExecuteServiceChecksAccessor, objectAccessor));
56         table->AddColumn(prefix + "accept_passive_service_checks", Column(&Table::OneAccessor, objectAccessor));
57         table->AddColumn(prefix + "execute_host_checks", Column(&StatusTable::ExecuteHostChecksAccessor, objectAccessor));
58         table->AddColumn(prefix + "accept_passive_host_checks", Column(&Table::OneAccessor, objectAccessor));
59         table->AddColumn(prefix + "enable_event_handlers", Column(&StatusTable::EnableEventHandlersAccessor, objectAccessor));
60         table->AddColumn(prefix + "obsess_over_services", Column(&Table::ZeroAccessor, objectAccessor));
61         table->AddColumn(prefix + "obsess_over_hosts", Column(&Table::ZeroAccessor, objectAccessor));
62         table->AddColumn(prefix + "check_service_freshness", Column(&Table::OneAccessor, objectAccessor));
63         table->AddColumn(prefix + "check_host_freshness", Column(&Table::OneAccessor, objectAccessor));
64         table->AddColumn(prefix + "enable_flap_detection", Column(&StatusTable::EnableFlapDetectionAccessor, objectAccessor));
65         table->AddColumn(prefix + "process_performance_data", Column(&StatusTable::ProcessPerformanceDataAccessor, objectAccessor));
66         table->AddColumn(prefix + "check_external_commands", Column(&Table::OneAccessor, objectAccessor));
67         table->AddColumn(prefix + "program_start", Column(&StatusTable::ProgramStartAccessor, objectAccessor));
68         table->AddColumn(prefix + "last_command_check", Column(&Table::ZeroAccessor, objectAccessor));
69         table->AddColumn(prefix + "last_log_rotation", Column(&Table::ZeroAccessor, objectAccessor));
70         table->AddColumn(prefix + "interval_length", Column(&Table::ZeroAccessor, objectAccessor));
71         table->AddColumn(prefix + "num_hosts", Column(&StatusTable::NumHostsAccessor, objectAccessor));
72         table->AddColumn(prefix + "num_services", Column(&StatusTable::NumServicesAccessor, objectAccessor));
73         table->AddColumn(prefix + "program_version", Column(&StatusTable::ProgramVersionAccessor, objectAccessor));
74         table->AddColumn(prefix + "external_command_buffer_slots", Column(&Table::ZeroAccessor, objectAccessor));
75         table->AddColumn(prefix + "external_command_buffer_usage", Column(&Table::ZeroAccessor, objectAccessor));
76         table->AddColumn(prefix + "external_command_buffer_max", Column(&Table::ZeroAccessor, objectAccessor));
77         table->AddColumn(prefix + "cached_log_messages", Column(&Table::ZeroAccessor, objectAccessor));
78         table->AddColumn(prefix + "livestatus_version", Column(&StatusTable::LivestatusVersionAccessor, objectAccessor));
79         table->AddColumn(prefix + "livestatus_active_connections", Column(&Table::ZeroAccessor, objectAccessor));
80         table->AddColumn(prefix + "livestatus_queued_connections", Column(&Table::ZeroAccessor, objectAccessor));
81         table->AddColumn(prefix + "livestatus_threads", Column(&Table::ZeroAccessor, objectAccessor));
82
83         table->AddColumn(prefix + "custom_variable_names", Column(&StatusTable::CustomVariableNamesAccessor, objectAccessor));
84         table->AddColumn(prefix + "custom_variable_values", Column(&StatusTable::CustomVariableValuesAccessor, objectAccessor));
85         table->AddColumn(prefix + "custom_variables", Column(&StatusTable::CustomVariablesAccessor, objectAccessor));
86 }
87
88 String StatusTable::GetName() const
89 {
90         return "status";
91 }
92
93 String StatusTable::GetPrefix() const
94 {
95         return "status";
96 }
97
98 void StatusTable::FetchRows(const AddRowFunction& addRowFn)
99 {
100         Object::Ptr obj = new Object();
101
102         /* Return a fake row. */
103         addRowFn(obj, LivestatusGroupByNone, Empty);
104 }
105
106 Value StatusTable::ConnectionsAccessor(const Value&)
107 {
108         return LivestatusListener::GetConnections();
109 }
110
111 Value StatusTable::ConnectionsRateAccessor(const Value&)
112 {
113         return (LivestatusListener::GetConnections() / (Utility::GetTime() - Application::GetStartTime()));
114 }
115
116 Value StatusTable::HostChecksAccessor(const Value&)
117 {
118         auto timespan = static_cast<long>(Utility::GetTime() - Application::GetStartTime());
119         return CIB::GetActiveHostChecksStatistics(timespan);
120 }
121
122 Value StatusTable::HostChecksRateAccessor(const Value&)
123 {
124         auto timespan = static_cast<long>(Utility::GetTime() - Application::GetStartTime());
125         return (CIB::GetActiveHostChecksStatistics(timespan) / (Utility::GetTime() - Application::GetStartTime()));
126 }
127
128 Value StatusTable::ServiceChecksAccessor(const Value&)
129 {
130         auto timespan = static_cast<long>(Utility::GetTime() - Application::GetStartTime());
131         return CIB::GetActiveServiceChecksStatistics(timespan);
132 }
133
134 Value StatusTable::ServiceChecksRateAccessor(const Value&)
135 {
136         auto timespan = static_cast<long>(Utility::GetTime() - Application::GetStartTime());
137         return (CIB::GetActiveServiceChecksStatistics(timespan) / (Utility::GetTime() - Application::GetStartTime()));
138 }
139
140 Value StatusTable::ExternalCommandsAccessor(const Value&)
141 {
142         return LivestatusQuery::GetExternalCommands();
143 }
144
145 Value StatusTable::ExternalCommandsRateAccessor(const Value&)
146 {
147         return (LivestatusQuery::GetExternalCommands() / (Utility::GetTime() - Application::GetStartTime()));
148 }
149
150 Value StatusTable::NagiosPidAccessor(const Value&)
151 {
152         return Utility::GetPid();
153 }
154
155 Value StatusTable::EnableNotificationsAccessor(const Value&)
156 {
157         return (IcingaApplication::GetInstance()->GetEnableNotifications() ? 1 : 0);
158 }
159
160 Value StatusTable::ExecuteServiceChecksAccessor(const Value&)
161 {
162         return (IcingaApplication::GetInstance()->GetEnableServiceChecks() ? 1 : 0);
163 }
164
165 Value StatusTable::ExecuteHostChecksAccessor(const Value&)
166 {
167         return (IcingaApplication::GetInstance()->GetEnableHostChecks() ? 1 : 0);
168 }
169
170 Value StatusTable::EnableEventHandlersAccessor(const Value&)
171 {
172         return (IcingaApplication::GetInstance()->GetEnableEventHandlers() ? 1 : 0);
173 }
174
175 Value StatusTable::EnableFlapDetectionAccessor(const Value&)
176 {
177         return (IcingaApplication::GetInstance()->GetEnableFlapping() ? 1 : 0);
178 }
179
180 Value StatusTable::ProcessPerformanceDataAccessor(const Value&)
181 {
182         return (IcingaApplication::GetInstance()->GetEnablePerfdata() ? 1 : 0);
183 }
184
185 Value StatusTable::ProgramStartAccessor(const Value&)
186 {
187         return static_cast<long>(Application::GetStartTime());
188 }
189
190 Value StatusTable::NumHostsAccessor(const Value&)
191 {
192         return ConfigType::Get<Host>()->GetObjectCount();
193 }
194
195 Value StatusTable::NumServicesAccessor(const Value&)
196 {
197         return ConfigType::Get<Service>()->GetObjectCount();
198 }
199
200 Value StatusTable::ProgramVersionAccessor(const Value&)
201 {
202         return Application::GetAppVersion();
203 }
204
205 Value StatusTable::LivestatusVersionAccessor(const Value&)
206 {
207         return Application::GetAppVersion();
208 }
209
210 Value StatusTable::LivestatusActiveConnectionsAccessor(const Value&)
211 {
212         return LivestatusListener::GetClientsConnected();
213 }
214
215 Value StatusTable::CustomVariableNamesAccessor(const Value&)
216 {
217         Dictionary::Ptr vars = IcingaApplication::GetInstance()->GetVars();
218
219         ArrayData result;
220
221         if (vars) {
222                 ObjectLock olock(vars);
223                 for (const auto& kv : vars) {
224                         result.push_back(kv.first);
225                 }
226         }
227
228         return new Array(std::move(result));
229 }
230
231 Value StatusTable::CustomVariableValuesAccessor(const Value&)
232 {
233         Dictionary::Ptr vars = IcingaApplication::GetInstance()->GetVars();
234
235         ArrayData result;
236
237         if (vars) {
238                 ObjectLock olock(vars);
239                 for (const auto& kv : vars) {
240                         result.push_back(kv.second);
241                 }
242         }
243
244         return new Array(std::move(result));
245 }
246
247 Value StatusTable::CustomVariablesAccessor(const Value&)
248 {
249         Dictionary::Ptr vars = IcingaApplication::GetInstance()->GetVars();
250
251         ArrayData result;
252
253         if (vars) {
254                 ObjectLock olock(vars);
255                 for (const auto& kv : vars) {
256                         result.push_back(new Array({
257                                 kv.first,
258                                 kv.second
259                         }));
260                 }
261         }
262
263         return new Array(std::move(result));
264 }