mirror of https://github.com/Icinga/icinga2.git
IcingaDB: Don't publish useless data to Redis
The Icinga DB daemon processes the data from the `IcingaApplication` type only and Icinga DB Web also uses only those stats. However, before this commit, Icinga DB published all kinds of useless stats to Redis each second, like the number of (un)reachable hosts, services, and so on, which is waste of CPU and some other resources. This commit reduces the published data drastically to only those simple stats coming from the `IcingaApplication` type.
This commit is contained in:
parent
5c651e45a3
commit
6ca0611f3d
|
@ -12,42 +12,15 @@ using namespace icinga;
|
|||
|
||||
Dictionary::Ptr IcingaDB::GetStats()
|
||||
{
|
||||
Dictionary::Ptr stats = new Dictionary();
|
||||
|
||||
//TODO: Figure out if more stats can be useful here.
|
||||
Namespace::Ptr statsFunctions = ScriptGlobal::Get("StatsFunctions", &Empty);
|
||||
|
||||
if (!statsFunctions)
|
||||
Dictionary::Ptr();
|
||||
|
||||
ObjectLock olock(statsFunctions);
|
||||
|
||||
for (auto& kv : statsFunctions)
|
||||
{
|
||||
Function::Ptr func = kv.second.Val;
|
||||
|
||||
if (!func)
|
||||
BOOST_THROW_EXCEPTION(std::invalid_argument("Invalid status function name."));
|
||||
|
||||
Dictionary::Ptr status = new Dictionary();
|
||||
Array::Ptr perfdata = new Array();
|
||||
func->Invoke({ status, perfdata });
|
||||
|
||||
stats->Set(kv.first, new Dictionary({
|
||||
{ "status", status },
|
||||
{ "perfdata", Serialize(perfdata, FAState) }
|
||||
}));
|
||||
}
|
||||
|
||||
typedef Dictionary::Ptr DP;
|
||||
DP app = DP(DP(DP(stats->Get("IcingaApplication"))->Get("status"))->Get("icingaapplication"))->Get("app");
|
||||
Dictionary::Ptr status = new Dictionary();
|
||||
IcingaApplication::StatsFunc(status, nullptr);
|
||||
|
||||
Dictionary::Ptr app(Dictionary::Ptr(status->Get("icingaapplication"))->Get("app"));
|
||||
app->Set("program_start", TimestampToMilliseconds(Application::GetStartTime()));
|
||||
|
||||
auto localEndpoint (Endpoint::GetLocalEndpoint());
|
||||
if (localEndpoint) {
|
||||
if (auto localEndpoint(Endpoint::GetLocalEndpoint()); localEndpoint) {
|
||||
app->Set("endpoint_id", GetObjectIdentifier(localEndpoint));
|
||||
}
|
||||
|
||||
return stats;
|
||||
return new Dictionary{{ "IcingaApplication", new Dictionary{{"status", status}}}};
|
||||
}
|
||||
|
|
|
@ -143,7 +143,7 @@ private:
|
|||
Dictionary::Ptr SerializeState(const Checkable::Ptr& checkable);
|
||||
|
||||
/* Stats */
|
||||
Dictionary::Ptr GetStats();
|
||||
static Dictionary::Ptr GetStats();
|
||||
|
||||
/* utilities */
|
||||
static String FormatCheckSumBinary(const String& str);
|
||||
|
|
Loading…
Reference in New Issue