From 41f712469250f24b43da896e27d0e570fa1612d4 Mon Sep 17 00:00:00 2001 From: Julian Brost Date: Fri, 19 Mar 2021 15:31:19 +0100 Subject: [PATCH] Icinga DB: cache environment ID instead of recomputing it every time --- lib/icingadb/icingadb-objects.cpp | 57 +++++++++++++++---------------- lib/icingadb/icingadb.cpp | 7 ++++ lib/icingadb/icingadb.hpp | 4 +++ 3 files changed, 39 insertions(+), 29 deletions(-) diff --git a/lib/icingadb/icingadb-objects.cpp b/lib/icingadb/icingadb-objects.cpp index 4d7e2f9f3..2b26b7394 100644 --- a/lib/icingadb/icingadb-objects.cpp +++ b/lib/icingadb/icingadb-objects.cpp @@ -584,7 +584,6 @@ void IcingaDB::InsertObjectDependencies(const ConfigObject::Ptr& object, const S String objectKey = GetObjectIdentifier(object); CustomVarObject::Ptr customVarObject = dynamic_pointer_cast(object); auto env (GetEnvironment()); - String envId = SHA1(env); if (customVarObject) { auto vars(SerializeVars(customVarObject)); @@ -609,7 +608,7 @@ void IcingaDB::InsertObjectDependencies(const ConfigObject::Ptr& object, const S String id = HashValue(new Array(Prepend(env, Prepend(kv.first, GetObjectIdentifiersWithoutEnv(object))))); typeCvs.emplace_back(id); - typeCvs.emplace_back(JsonEncode(new Dictionary({{"object_id", objectKey}, {"environment_id", envId}, {"customvar_id", kv.first}}))); + typeCvs.emplace_back(JsonEncode(new Dictionary({{"object_id", objectKey}, {"environment_id", m_EnvironmentId}, {"customvar_id", kv.first}}))); if (runtimeUpdate) { publishes["icinga:config:update:" + typeName + ":customvar"].emplace_back(id); @@ -632,7 +631,7 @@ void IcingaDB::InsertObjectDependencies(const ConfigObject::Ptr& object, const S if (runtimeUpdate || m_DumpedGlobals.ActionUrl.IsNew(id)) { actionUrls.emplace_back(std::move(id)); - actionUrls.emplace_back(JsonEncode(new Dictionary({{"environment_id", envId}, {"action_url", actionUrl}}))); + actionUrls.emplace_back(JsonEncode(new Dictionary({{"environment_id", m_EnvironmentId}, {"action_url", actionUrl}}))); } if (runtimeUpdate) { @@ -646,7 +645,7 @@ void IcingaDB::InsertObjectDependencies(const ConfigObject::Ptr& object, const S if (runtimeUpdate || m_DumpedGlobals.NotesUrl.IsNew(id)) { notesUrls.emplace_back(std::move(id)); - notesUrls.emplace_back(JsonEncode(new Dictionary({{"environment_id", envId}, {"notes_url", notesUrl}}))); + notesUrls.emplace_back(JsonEncode(new Dictionary({{"environment_id", m_EnvironmentId}, {"notes_url", notesUrl}}))); } if (runtimeUpdate) { @@ -660,7 +659,7 @@ void IcingaDB::InsertObjectDependencies(const ConfigObject::Ptr& object, const S if (runtimeUpdate || m_DumpedGlobals.IconImage.IsNew(id)) { iconImages.emplace_back(std::move(id)); - iconImages.emplace_back(JsonEncode(new Dictionary({{"environment_id", envId}, {"icon_image", iconImage}}))); + iconImages.emplace_back(JsonEncode(new Dictionary({{"environment_id", m_EnvironmentId}, {"icon_image", iconImage}}))); } if (runtimeUpdate) { @@ -695,7 +694,7 @@ void IcingaDB::InsertObjectDependencies(const ConfigObject::Ptr& object, const S String groupId = GetObjectIdentifier(groupObj); String id = HashValue(new Array(Prepend(env, Prepend(GetObjectIdentifiersWithoutEnv(groupObj), GetObjectIdentifiersWithoutEnv(object))))); members.emplace_back(id); - members.emplace_back(JsonEncode(new Dictionary({{"object_id", objectKey}, {"environment_id", envId}, {"group_id", groupId}}))); + members.emplace_back(JsonEncode(new Dictionary({{"object_id", objectKey}, {"environment_id", m_EnvironmentId}, {"group_id", groupId}}))); if (runtimeUpdate) { publishes["icinga:config:update:" + typeName + ":groupmember"].emplace_back(id); @@ -725,7 +724,7 @@ void IcingaDB::InsertObjectDependencies(const ConfigObject::Ptr& object, const S String id = HashValue(new Array(Prepend(env, Prepend(kv.first, Prepend(kv.second, GetObjectIdentifiersWithoutEnv(object)))))); typeRanges.emplace_back(id); - typeRanges.emplace_back(JsonEncode(new Dictionary({{"environment_id", envId}, {"timeperiod_id", objectKey}, {"range_key", kv.first}, {"range_value", kv.second}}))); + typeRanges.emplace_back(JsonEncode(new Dictionary({{"environment_id", m_EnvironmentId}, {"timeperiod_id", objectKey}, {"range_key", kv.first}, {"range_value", kv.second}}))); if (runtimeUpdate) { publishes["icinga:config:update:" + typeName + ":range"].emplace_back(id); @@ -754,7 +753,7 @@ void IcingaDB::InsertObjectDependencies(const ConfigObject::Ptr& object, const S String id = HashValue(new Array(Prepend(env, Prepend(GetObjectIdentifiersWithoutEnv(includeTp), GetObjectIdentifiersWithoutEnv(object))))); includs.emplace_back(id); - includs.emplace_back(JsonEncode(new Dictionary({{"environment_id", envId}, {"timeperiod_id", objectKey}, {"include_id", includeId}}))); + includs.emplace_back(JsonEncode(new Dictionary({{"environment_id", m_EnvironmentId}, {"timeperiod_id", objectKey}, {"include_id", includeId}}))); if (runtimeUpdate) { publishes["icinga:config:update:" + typeName + ":override:include"].emplace_back(id); @@ -783,7 +782,7 @@ void IcingaDB::InsertObjectDependencies(const ConfigObject::Ptr& object, const S String id = HashValue(new Array(Prepend(env, Prepend(GetObjectIdentifiersWithoutEnv(excludeTp), GetObjectIdentifiersWithoutEnv(object))))); excluds.emplace_back(id); - excluds.emplace_back(JsonEncode(new Dictionary({{"environment_id", envId}, {"timeperiod_id", objectKey}, {"exclude_id", excludeId}}))); + excluds.emplace_back(JsonEncode(new Dictionary({{"environment_id", m_EnvironmentId}, {"timeperiod_id", objectKey}, {"exclude_id", excludeId}}))); if (runtimeUpdate) { publishes["icinga:config:update:" + typeName + ":override:exclude"].emplace_back(id); @@ -806,7 +805,7 @@ void IcingaDB::InsertObjectDependencies(const ConfigObject::Ptr& object, const S for (auto& parent : parentsRaw) { String id = HashValue(new Array(Prepend(env, Prepend(GetObjectIdentifiersWithoutEnv(parent), GetObjectIdentifiersWithoutEnv(object))))); parnts.emplace_back(id); - parnts.emplace_back(JsonEncode(new Dictionary({{"zone_id", objectKey}, {"environment_id", envId}, {"parent_id", GetObjectIdentifier(parent)}}))); + parnts.emplace_back(JsonEncode(new Dictionary({{"zone_id", objectKey}, {"environment_id", m_EnvironmentId}, {"parent_id", GetObjectIdentifier(parent)}}))); if (runtimeUpdate) { publishes["icinga:config:update:" + typeName + ":parent"].emplace_back(id); @@ -840,7 +839,7 @@ void IcingaDB::InsertObjectDependencies(const ConfigObject::Ptr& object, const S String groupId = GetObjectIdentifier(groupObj); String id = HashValue(new Array(Prepend(env, Prepend(GetObjectIdentifiersWithoutEnv(groupObj), GetObjectIdentifiersWithoutEnv(object))))); members.emplace_back(id); - members.emplace_back(JsonEncode(new Dictionary({{"user_id", objectKey}, {"environment_id", envId}, {"group_id", groupId}}))); + members.emplace_back(JsonEncode(new Dictionary({{"user_id", objectKey}, {"environment_id", m_EnvironmentId}, {"group_id", groupId}}))); if (runtimeUpdate) { publishes["icinga:config:update:" + typeName + ":groupmember"].emplace_back(id); @@ -874,7 +873,7 @@ void IcingaDB::InsertObjectDependencies(const ConfigObject::Ptr& object, const S String userId = GetObjectIdentifier(user); String id = HashValue(new Array(Prepend(env, Prepend(GetObjectIdentifiersWithoutEnv(user), GetObjectIdentifiersWithoutEnv(object))))); usrs.emplace_back(id); - usrs.emplace_back(JsonEncode(new Dictionary({{"notification_id", objectKey}, {"environment_id", envId}, {"user_id", userId}}))); + usrs.emplace_back(JsonEncode(new Dictionary({{"notification_id", objectKey}, {"environment_id", m_EnvironmentId}, {"user_id", userId}}))); if (runtimeUpdate) { publishes["icinga:config:update:" + typeName + ":user"].emplace_back(id); @@ -896,10 +895,10 @@ void IcingaDB::InsertObjectDependencies(const ConfigObject::Ptr& object, const S String id = HashValue(new Array(Prepend(env, Prepend("usergroup", Prepend(GetObjectIdentifiersWithoutEnv(usergroup), GetObjectIdentifiersWithoutEnv(object)))))); groups.emplace_back(id); - groups.emplace_back(JsonEncode(new Dictionary({{"notification_id", objectKey}, {"environment_id", envId}, {"usergroup_id", usergroupId}}))); + groups.emplace_back(JsonEncode(new Dictionary({{"notification_id", objectKey}, {"environment_id", m_EnvironmentId}, {"usergroup_id", usergroupId}}))); notificationRecipients.emplace_back(id); - notificationRecipients.emplace_back(JsonEncode(new Dictionary({{"notification_id", objectKey}, {"environment_id", envId}, {"usergroup_id", usergroupId}}))); + notificationRecipients.emplace_back(JsonEncode(new Dictionary({{"notification_id", objectKey}, {"environment_id", m_EnvironmentId}, {"usergroup_id", usergroupId}}))); if (runtimeUpdate) { publishes["icinga:config:update:" + typeName + ":usergroup"].emplace_back(id); @@ -912,7 +911,7 @@ void IcingaDB::InsertObjectDependencies(const ConfigObject::Ptr& object, const S String userId = GetObjectIdentifier(user); String id = HashValue(new Array(Prepend(env, Prepend("user", Prepend(GetObjectIdentifiersWithoutEnv(user), GetObjectIdentifiersWithoutEnv(object)))))); notificationRecipients.emplace_back(id); - notificationRecipients.emplace_back(JsonEncode(new Dictionary({{"notification_id", objectKey}, {"environment_id", envId}, {"user_id", userId}}))); + notificationRecipients.emplace_back(JsonEncode(new Dictionary({{"notification_id", objectKey}, {"environment_id", m_EnvironmentId}, {"user_id", userId}}))); if (runtimeUpdate) { publishes["icinga:config:update:" + typeName + ":recipient"].emplace_back(id); @@ -953,7 +952,7 @@ void IcingaDB::InsertObjectDependencies(const ConfigObject::Ptr& object, const S values->Set("command_id", objectKey); values->Set("argument_key", kv.first); - values->Set("environment_id", envId); + values->Set("environment_id", m_EnvironmentId); String id = HashValue(new Array(Prepend(env, Prepend(kv.first, GetObjectIdentifiersWithoutEnv(object))))); @@ -1000,7 +999,7 @@ void IcingaDB::InsertObjectDependencies(const ConfigObject::Ptr& object, const S values->Set("command_id", objectKey); values->Set("envvar_key", kv.first); - values->Set("environment_id", envId); + values->Set("environment_id", m_EnvironmentId); String id = HashValue(new Array(Prepend(env, Prepend(kv.first, GetObjectIdentifiersWithoutEnv(object))))); @@ -1086,7 +1085,7 @@ void IcingaDB::SendConfigUpdate(const ConfigObject::Ptr& object, bool runtimeUpd bool IcingaDB::PrepareObject(const ConfigObject::Ptr& object, Dictionary::Ptr& attributes, Dictionary::Ptr& checksums) { attributes->Set("name_checksum", SHA1(object->GetName())); - attributes->Set("environment_id", SHA1(GetEnvironment())); + attributes->Set("environment_id", m_EnvironmentId); attributes->Set("name", object->GetName()); Zone::Ptr ObjectsZone = static_pointer_cast(object->GetZone()); @@ -1461,7 +1460,7 @@ void IcingaDB::SendStatusUpdate(const ConfigObject::Ptr& object, const CheckResu std::vector xAdd ({ "XADD", "icinga:history:stream:state", "*", "id", Utility::NewUniqueID(), - "environment_id", SHA1(GetEnvironment()), + "environment_id", m_EnvironmentId, "host_id", GetObjectIdentifier(host), "state_type", Convert::ToString(type), "soft_state", Convert::ToString(cr ? service ? Convert::ToLong(cr->GetState()) : Convert::ToLong(Host::CalculateState(cr->GetState())) : 99), @@ -1536,7 +1535,7 @@ void IcingaDB::SendSentNotification( std::vector xAdd ({ "XADD", "icinga:history:stream:notification", "*", "id", notificationHistoryId, - "environment_id", SHA1(GetEnvironment()), + "environment_id", m_EnvironmentId, "notification_id", GetObjectIdentifier(notification), "host_id", GetObjectIdentifier(host), "type", Convert::ToString(type), @@ -1574,7 +1573,7 @@ void IcingaDB::SendSentNotification( std::vector xAddUser ({ "XADD", "icinga:history:stream:usernotification", "*", "id", Utility::NewUniqueID(), - "environment_id", SHA1(GetEnvironment()), + "environment_id", m_EnvironmentId, "notification_history_id", notificationHistoryId, "user_id", GetObjectIdentifier(user), }); @@ -1600,7 +1599,7 @@ void IcingaDB::SendStartedDowntime(const Downtime::Ptr& downtime) std::vector xAdd ({ "XADD", "icinga:history:stream:downtime", "*", "downtime_id", GetObjectIdentifier(downtime), - "environment_id", SHA1(GetEnvironment()), + "environment_id", m_EnvironmentId, "host_id", GetObjectIdentifier(host), "entry_time", Convert::ToString(TimestampToMilliseconds(downtime->GetEntryTime())), "author", Utility::ValidateUTF8(downtime->GetAuthor()), @@ -1671,7 +1670,7 @@ void IcingaDB::SendRemovedDowntime(const Downtime::Ptr& downtime) std::vector xAdd ({ "XADD", "icinga:history:stream:downtime", "*", "downtime_id", GetObjectIdentifier(downtime), - "environment_id", SHA1(GetEnvironment()), + "environment_id", m_EnvironmentId, "host_id", GetObjectIdentifier(host), "entry_time", Convert::ToString(TimestampToMilliseconds(downtime->GetEntryTime())), "author", Utility::ValidateUTF8(downtime->GetAuthor()), @@ -1739,7 +1738,7 @@ void IcingaDB::SendAddedComment(const Comment::Ptr& comment) std::vector xAdd ({ "XADD", "icinga:history:stream:comment", "*", "comment_id", GetObjectIdentifier(comment), - "environment_id", SHA1(GetEnvironment()), + "environment_id", m_EnvironmentId, "host_id", GetObjectIdentifier(host), "entry_time", Convert::ToString(TimestampToMilliseconds(comment->GetEntryTime())), "author", Utility::ValidateUTF8(comment->GetAuthor()), @@ -1794,7 +1793,7 @@ void IcingaDB::SendRemovedComment(const Comment::Ptr& comment) std::vector xAdd ({ "XADD", "icinga:history:stream:comment", "*", "comment_id", GetObjectIdentifier(comment), - "environment_id", SHA1(GetEnvironment()), + "environment_id", m_EnvironmentId, "host_id", GetObjectIdentifier(host), "entry_time", Convert::ToString(TimestampToMilliseconds(comment->GetEntryTime())), "author", Utility::ValidateUTF8(comment->GetAuthor()), @@ -1858,7 +1857,7 @@ void IcingaDB::SendFlappingChange(const Checkable::Ptr& checkable, double change std::vector xAdd ({ "XADD", "icinga:history:stream:flapping", "*", - "environment_id", SHA1(GetEnvironment()), + "environment_id", m_EnvironmentId, "host_id", GetObjectIdentifier(host), "flapping_threshold_low", Convert::ToString(checkable->GetFlappingThresholdLow()), "flapping_threshold_high", Convert::ToString(checkable->GetFlappingThresholdHigh()), @@ -1938,7 +1937,7 @@ void IcingaDB::SendAcknowledgementSet(const Checkable::Ptr& checkable, const Str std::vector xAdd ({ "XADD", "icinga:history:stream:acknowledgement", "*", "event_id", Utility::NewUniqueID(), - "environment_id", SHA1(GetEnvironment()), + "environment_id", m_EnvironmentId, "host_id", GetObjectIdentifier(host), "event_type", "ack_set", "author", author, @@ -1991,7 +1990,7 @@ void IcingaDB::SendAcknowledgementCleared(const Checkable::Ptr& checkable, const std::vector xAdd ({ "XADD", "icinga:history:stream:acknowledgement", "*", "event_id", Utility::NewUniqueID(), - "environment_id", SHA1(GetEnvironment()), + "environment_id", m_EnvironmentId, "host_id", GetObjectIdentifier(host), "clear_time", Convert::ToString(TimestampToMilliseconds(changeTime)), "event_type", "ack_clear" @@ -2039,7 +2038,7 @@ Dictionary::Ptr IcingaDB::SerializeState(const Checkable::Ptr& checkable) tie(host, service) = GetHostService(checkable); attrs->Set("id", GetObjectIdentifier(checkable));; - attrs->Set("environment_id", SHA1(GetEnvironment())); + attrs->Set("environment_id", m_EnvironmentId); attrs->Set("state_type", checkable->HasBeenChecked() ? checkable->GetStateType() : StateTypeHard); // TODO: last_hard/soft_state should be "previous". diff --git a/lib/icingadb/icingadb.cpp b/lib/icingadb/icingadb.cpp index 58c25e17a..e751ae264 100644 --- a/lib/icingadb/icingadb.cpp +++ b/lib/icingadb/icingadb.cpp @@ -36,6 +36,9 @@ return id )EOF"; +String IcingaDB::m_EnvironmentId; +boost::once_flag IcingaDB::m_EnvironmentIdOnce = BOOST_ONCE_INIT; + REGISTER_TYPE(IcingaDB); IcingaDB::IcingaDB() @@ -57,6 +60,10 @@ void IcingaDB::Start(bool runtimeCreated) { ObjectImpl::Start(runtimeCreated); + boost::call_once([]() { + m_EnvironmentId = SHA1(GetEnvironment()); + }, m_EnvironmentIdOnce); + Log(LogInformation, "IcingaDB") << "'" << GetName() << "' started."; diff --git a/lib/icingadb/icingadb.hpp b/lib/icingadb/icingadb.hpp index 634c092c0..ed3a44d32 100644 --- a/lib/icingadb/icingadb.hpp +++ b/lib/icingadb/icingadb.hpp @@ -12,6 +12,7 @@ #include "icinga/service.hpp" #include "icinga/downtime.hpp" #include "remote/messageorigin.hpp" +#include #include #include #include @@ -160,6 +161,9 @@ private: struct { DumpedGlobals CustomVar, ActionUrl, NotesUrl, IconImage; } m_DumpedGlobals; + + static String m_EnvironmentId; + static boost::once_flag m_EnvironmentIdOnce; }; }