From efa548fbdf45d0839dd84f71a403f0c51c7f7401 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Wed, 4 Mar 2020 11:18:16 +0100 Subject: [PATCH 1/4] Connect IcingaDB::UpdateState to Checkable::OnNewCheckResult instead of calling it in IcingaDB#SendEvent() --- lib/icingadb/icingadb-objects.cpp | 2 ++ lib/icingadb/icingadb.cpp | 13 ------------- 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/lib/icingadb/icingadb-objects.cpp b/lib/icingadb/icingadb-objects.cpp index e31988837..abd8610b0 100644 --- a/lib/icingadb/icingadb-objects.cpp +++ b/lib/icingadb/icingadb-objects.cpp @@ -102,6 +102,7 @@ void IcingaDB::ConfigStaticInitialize() Checkable::OnNewCheckResult.connect([](const Checkable::Ptr& checkable, const CheckResult::Ptr&, const MessageOrigin::Ptr&) { IcingaDB::NewCheckResultHandler(checkable); }); + Checkable::OnNextCheckChanged.connect([](const Checkable::Ptr& checkable, const Value&) { IcingaDB::NextCheckChangedHandler(checkable); }); @@ -2044,6 +2045,7 @@ void IcingaDB::FlappingChangeHandler(const Checkable::Ptr& checkable, double cha void IcingaDB::NewCheckResultHandler(const Checkable::Ptr& checkable) { for (auto& rw : ConfigType::GetObjectsByType()) { + rw->UpdateState(checkable); rw->SendNextUpdate(checkable); } } diff --git a/lib/icingadb/icingadb.cpp b/lib/icingadb/icingadb.cpp index 96ddcb3fb..069eda601 100644 --- a/lib/icingadb/icingadb.cpp +++ b/lib/icingadb/icingadb.cpp @@ -193,19 +193,6 @@ void IcingaDB::SendEvent(const Dictionary::Ptr& event) String type = event->Get("type"); - if (type == "CheckResult") { - Checkable::Ptr checkable; - - if (event->Contains("service")) { - checkable = Service::GetByNamePair(event->Get("host"), event->Get("service")); - } else { - checkable = Host::GetByName(event->Get("host")); - } - - // Update State for icingaweb - m_WorkQueue.Enqueue([this, checkable]() { UpdateState(checkable); }); - } - if (type.Contains("Acknowledgement")) { Checkable::Ptr checkable; From 867481de7c59c8770b35927d7db15f73564ac4a5 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Wed, 4 Mar 2020 11:21:33 +0100 Subject: [PATCH 2/4] Connect IcingaDB::StateChangeHandler to Checkable::OnAcknowledgementSet instead of calling it in IcingaDB#SendEvent() --- lib/icingadb/icingadb-objects.cpp | 3 +++ lib/icingadb/icingadb.cpp | 17 ----------------- 2 files changed, 3 insertions(+), 17 deletions(-) diff --git a/lib/icingadb/icingadb-objects.cpp b/lib/icingadb/icingadb-objects.cpp index abd8610b0..32cf7edc3 100644 --- a/lib/icingadb/icingadb-objects.cpp +++ b/lib/icingadb/icingadb-objects.cpp @@ -68,6 +68,9 @@ void IcingaDB::ConfigStaticInitialize() AcknowledgementClearedHandler(checkable, removedBy, changeTime); }); + Checkable::OnAcknowledgementSet.connect([](const Checkable::Ptr& checkable, const String& author, const String& comment, AcknowledgementType type, bool, bool persistent, double changeTime, double expiry, const MessageOrigin::Ptr&) { + IcingaDB::StateChangeHandler(checkable); + }); /* triggered when acknowledged host/service goes back to ok and when the acknowledgement gets deleted */ Checkable::OnAcknowledgementCleared.connect([](const Checkable::Ptr& checkable, const String&, double, const MessageOrigin::Ptr&) { IcingaDB::StateChangeHandler(checkable); diff --git a/lib/icingadb/icingadb.cpp b/lib/icingadb/icingadb.cpp index 069eda601..bae78cbc7 100644 --- a/lib/icingadb/icingadb.cpp +++ b/lib/icingadb/icingadb.cpp @@ -203,23 +203,6 @@ void IcingaDB::SendEvent(const Dictionary::Ptr& event) checkable = Host::GetByName(event->Get("host")); event->Set("host_id", GetObjectIdentifier(checkable)); } - - if (type == "AcknowledgementSet") { - Timestamp entry = 0; - Comment::Ptr AckComment; - - for (const Comment::Ptr& c : checkable->GetComments()) { - if (c->GetEntryType() == CommentAcknowledgement) { - if (c->GetEntryTime() > entry) { - entry = c->GetEntryTime(); - AckComment = c; - StateChangeHandler(checkable); - } - } - } - - event->Set("comment_id", GetObjectIdentifier(AckComment)); - } } } From 54d555bd92f222187acadcce71c8fb63342bb70f Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Wed, 4 Mar 2020 11:24:07 +0100 Subject: [PATCH 3/4] Drop IcingaDB#SendEvent() --- lib/icingadb/icingadb.cpp | 24 ------------------------ lib/icingadb/icingadb.hpp | 1 - 2 files changed, 25 deletions(-) diff --git a/lib/icingadb/icingadb.cpp b/lib/icingadb/icingadb.cpp index bae78cbc7..8dc49e6fa 100644 --- a/lib/icingadb/icingadb.cpp +++ b/lib/icingadb/icingadb.cpp @@ -176,36 +176,12 @@ void IcingaDB::HandleEvents() if (!event) continue; - - m_WorkQueue.Enqueue([this, event]() { SendEvent(event); }); } queue->RemoveClient(this); EventQueue::UnregisterIfUnused(queueName, queue); } -void IcingaDB::SendEvent(const Dictionary::Ptr& event) -{ - AssertOnWorkQueue(); - - if (!m_Rcon || !m_Rcon->IsConnected()) - return; - - String type = event->Get("type"); - - if (type.Contains("Acknowledgement")) { - Checkable::Ptr checkable; - - if (event->Contains("service")) { - checkable = Service::GetByNamePair(event->Get("host"), event->Get("service")); - event->Set("service_id", GetObjectIdentifier(checkable)); - } else { - checkable = Host::GetByName(event->Get("host")); - event->Set("host_id", GetObjectIdentifier(checkable)); - } - } -} - void IcingaDB::Stop(bool runtimeRemoved) { Log(LogInformation, "IcingaDB") diff --git a/lib/icingadb/icingadb.hpp b/lib/icingadb/icingadb.hpp index 8f40a273e..ff826a48c 100644 --- a/lib/icingadb/icingadb.hpp +++ b/lib/icingadb/icingadb.hpp @@ -38,7 +38,6 @@ private: void ReconnectTimerHandler(); void TryToReconnect(); void HandleEvents(); - void SendEvent(const Dictionary::Ptr& event); void PublishStatsTimerHandler(); void PublishStats(); From ff0efbc2a2b6d71365325bb97002a68f626d52d5 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Wed, 4 Mar 2020 11:26:02 +0100 Subject: [PATCH 4/4] Drop IcingaDB#HandleEvents() --- lib/icingadb/icingadb.cpp | 29 ----------------------------- lib/icingadb/icingadb.hpp | 1 - 2 files changed, 30 deletions(-) diff --git a/lib/icingadb/icingadb.cpp b/lib/icingadb/icingadb.cpp index 8dc49e6fa..6e68084b7 100644 --- a/lib/icingadb/icingadb.cpp +++ b/lib/icingadb/icingadb.cpp @@ -81,9 +81,6 @@ void IcingaDB::Start(bool runtimeCreated) m_WorkQueue.SetName("IcingaDB"); - boost::thread thread(&IcingaDB::HandleEvents, this); - thread.detach(); - m_Rcon->SuppressQueryKind(Prio::CheckResult); m_Rcon->SuppressQueryKind(Prio::State); } @@ -156,32 +153,6 @@ void IcingaDB::PublishStats() m_Rcon->FireAndForgetQuery(std::move(eval), Prio::Heartbeat); } -void IcingaDB::HandleEvents() -{ - String queueName = Utility::NewUniqueID(); - EventQueue::Ptr queue = new EventQueue(queueName); - EventQueue::Register(queueName, queue); - - std::set types; - types.insert("CheckResult"); - types.insert("AcknowledgementSet"); - types.insert("AcknowledgementCleared"); - - queue->SetTypes(types); - - queue->AddClient(this); - - for (;;) { - Dictionary::Ptr event = queue->WaitForEvent(this); - - if (!event) - continue; - } - - queue->RemoveClient(this); - EventQueue::UnregisterIfUnused(queueName, queue); -} - void IcingaDB::Stop(bool runtimeRemoved) { Log(LogInformation, "IcingaDB") diff --git a/lib/icingadb/icingadb.hpp b/lib/icingadb/icingadb.hpp index ff826a48c..41fd0963c 100644 --- a/lib/icingadb/icingadb.hpp +++ b/lib/icingadb/icingadb.hpp @@ -37,7 +37,6 @@ public: private: void ReconnectTimerHandler(); void TryToReconnect(); - void HandleEvents(); void PublishStatsTimerHandler(); void PublishStats();