1 /* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
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"
13 using namespace icinga;
15 StatusTable::StatusTable()
20 void StatusTable::AddColumns(Table *table, const String& prefix,
21 const Column::ObjectAccessor& objectAccessor)
23 table->AddColumn(prefix + "neb_callbacks", Column(&Table::ZeroAccessor, objectAccessor));
24 table->AddColumn(prefix + "neb_callbacks_rate", Column(&Table::ZeroAccessor, objectAccessor));
26 table->AddColumn(prefix + "requests", Column(&Table::ZeroAccessor, objectAccessor));
27 table->AddColumn(prefix + "requests_rate", Column(&Table::ZeroAccessor, objectAccessor));
29 table->AddColumn(prefix + "connections", Column(&StatusTable::ConnectionsAccessor, objectAccessor));
30 table->AddColumn(prefix + "connections_rate", Column(&StatusTable::ConnectionsRateAccessor, objectAccessor));
32 table->AddColumn(prefix + "service_checks", Column(&StatusTable::ServiceChecksAccessor, objectAccessor));
33 table->AddColumn(prefix + "service_checks_rate", Column(&StatusTable::ServiceChecksRateAccessor, objectAccessor));
35 table->AddColumn(prefix + "host_checks", Column(&StatusTable::HostChecksAccessor, objectAccessor));
36 table->AddColumn(prefix + "host_checks_rate", Column(&StatusTable::HostChecksRateAccessor, objectAccessor));
38 table->AddColumn(prefix + "forks", Column(&Table::ZeroAccessor, objectAccessor));
39 table->AddColumn(prefix + "forks_rate", Column(&Table::ZeroAccessor, objectAccessor));
41 table->AddColumn(prefix + "log_messages", Column(&Table::ZeroAccessor, objectAccessor));
42 table->AddColumn(prefix + "log_messages_rate", Column(&Table::ZeroAccessor, objectAccessor));
44 table->AddColumn(prefix + "external_commands", Column(&StatusTable::ExternalCommandsAccessor, objectAccessor));
45 table->AddColumn(prefix + "external_commands_rate", Column(&StatusTable::ExternalCommandsRateAccessor, objectAccessor));
47 table->AddColumn(prefix + "livechecks", Column(&Table::ZeroAccessor, objectAccessor));
48 table->AddColumn(prefix + "livechecks_rate", Column(&Table::ZeroAccessor, objectAccessor));
50 table->AddColumn(prefix + "livecheck_overflows", Column(&Table::ZeroAccessor, objectAccessor));
51 table->AddColumn(prefix + "livecheck_overflows_rate", Column(&Table::ZeroAccessor, objectAccessor));
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));
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));
88 String StatusTable::GetName() const
93 String StatusTable::GetPrefix() const
98 void StatusTable::FetchRows(const AddRowFunction& addRowFn)
100 Object::Ptr obj = new Object();
102 /* Return a fake row. */
103 addRowFn(obj, LivestatusGroupByNone, Empty);
106 Value StatusTable::ConnectionsAccessor(const Value&)
108 return LivestatusListener::GetConnections();
111 Value StatusTable::ConnectionsRateAccessor(const Value&)
113 return (LivestatusListener::GetConnections() / (Utility::GetTime() - Application::GetStartTime()));
116 Value StatusTable::HostChecksAccessor(const Value&)
118 auto timespan = static_cast<long>(Utility::GetTime() - Application::GetStartTime());
119 return CIB::GetActiveHostChecksStatistics(timespan);
122 Value StatusTable::HostChecksRateAccessor(const Value&)
124 auto timespan = static_cast<long>(Utility::GetTime() - Application::GetStartTime());
125 return (CIB::GetActiveHostChecksStatistics(timespan) / (Utility::GetTime() - Application::GetStartTime()));
128 Value StatusTable::ServiceChecksAccessor(const Value&)
130 auto timespan = static_cast<long>(Utility::GetTime() - Application::GetStartTime());
131 return CIB::GetActiveServiceChecksStatistics(timespan);
134 Value StatusTable::ServiceChecksRateAccessor(const Value&)
136 auto timespan = static_cast<long>(Utility::GetTime() - Application::GetStartTime());
137 return (CIB::GetActiveServiceChecksStatistics(timespan) / (Utility::GetTime() - Application::GetStartTime()));
140 Value StatusTable::ExternalCommandsAccessor(const Value&)
142 return LivestatusQuery::GetExternalCommands();
145 Value StatusTable::ExternalCommandsRateAccessor(const Value&)
147 return (LivestatusQuery::GetExternalCommands() / (Utility::GetTime() - Application::GetStartTime()));
150 Value StatusTable::NagiosPidAccessor(const Value&)
152 return Utility::GetPid();
155 Value StatusTable::EnableNotificationsAccessor(const Value&)
157 return (IcingaApplication::GetInstance()->GetEnableNotifications() ? 1 : 0);
160 Value StatusTable::ExecuteServiceChecksAccessor(const Value&)
162 return (IcingaApplication::GetInstance()->GetEnableServiceChecks() ? 1 : 0);
165 Value StatusTable::ExecuteHostChecksAccessor(const Value&)
167 return (IcingaApplication::GetInstance()->GetEnableHostChecks() ? 1 : 0);
170 Value StatusTable::EnableEventHandlersAccessor(const Value&)
172 return (IcingaApplication::GetInstance()->GetEnableEventHandlers() ? 1 : 0);
175 Value StatusTable::EnableFlapDetectionAccessor(const Value&)
177 return (IcingaApplication::GetInstance()->GetEnableFlapping() ? 1 : 0);
180 Value StatusTable::ProcessPerformanceDataAccessor(const Value&)
182 return (IcingaApplication::GetInstance()->GetEnablePerfdata() ? 1 : 0);
185 Value StatusTable::ProgramStartAccessor(const Value&)
187 return static_cast<long>(Application::GetStartTime());
190 Value StatusTable::NumHostsAccessor(const Value&)
192 return ConfigType::Get<Host>()->GetObjectCount();
195 Value StatusTable::NumServicesAccessor(const Value&)
197 return ConfigType::Get<Service>()->GetObjectCount();
200 Value StatusTable::ProgramVersionAccessor(const Value&)
202 return Application::GetAppVersion();
205 Value StatusTable::LivestatusVersionAccessor(const Value&)
207 return Application::GetAppVersion();
210 Value StatusTable::LivestatusActiveConnectionsAccessor(const Value&)
212 return LivestatusListener::GetClientsConnected();
215 Value StatusTable::CustomVariableNamesAccessor(const Value&)
217 Dictionary::Ptr vars = IcingaApplication::GetInstance()->GetVars();
222 ObjectLock olock(vars);
223 for (const auto& kv : vars) {
224 result.push_back(kv.first);
228 return new Array(std::move(result));
231 Value StatusTable::CustomVariableValuesAccessor(const Value&)
233 Dictionary::Ptr vars = IcingaApplication::GetInstance()->GetVars();
238 ObjectLock olock(vars);
239 for (const auto& kv : vars) {
240 result.push_back(kv.second);
244 return new Array(std::move(result));
247 Value StatusTable::CustomVariablesAccessor(const Value&)
249 Dictionary::Ptr vars = IcingaApplication::GetInstance()->GetVars();
254 ObjectLock olock(vars);
255 for (const auto& kv : vars) {
256 result.push_back(new Array({
263 return new Array(std::move(result));