From: Michael Friedrich Date: Fri, 25 Sep 2015 12:23:42 +0000 (+0200) Subject: Fix wrong log lag in cluster-zone check X-Git-Tag: v2.4.0~275 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=717118fed4de61ca4f73bb6a7a7fd5d7d6e2dfaa;p=icinga2 Fix wrong log lag in cluster-zone check Refactor the calculation into a generic function which is also used inside the 2.4 status API. fixes #8805 --- diff --git a/lib/methods/clusterzonechecktask.cpp b/lib/methods/clusterzonechecktask.cpp index 8cd788ad1..38c8a718d 100644 --- a/lib/methods/clusterzonechecktask.cpp +++ b/lib/methods/clusterzonechecktask.cpp @@ -81,28 +81,28 @@ void ClusterZoneCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const Che } bool connected = false; - double lag = 0; + double zoneLag = 0; BOOST_FOREACH(const Endpoint::Ptr& endpoint, zone->GetEndpoints()) { - double eplag = Utility::GetTime() - endpoint->GetRemoteLogPosition(); - if (endpoint->IsConnected()) connected = true; - if ((endpoint->GetSyncing() || !endpoint->IsConnected()) && eplag > lag) - lag = eplag; + double eplag = ApiListener::CalculateZoneLag(endpoint); + + if (eplag > 0 && eplag > zoneLag) + zoneLag = eplag; } if (!connected) { cr->SetState(ServiceCritical); - cr->SetOutput("Zone '" + zoneName + "' is not connected. Log lag: " + Utility::FormatDuration(lag)); + cr->SetOutput("Zone '" + zoneName + "' is not connected. Log lag: " + Utility::FormatDuration(zoneLag)); } else { cr->SetState(ServiceOK); - cr->SetOutput("Zone '" + zoneName + "' is connected. Log lag: " + Utility::FormatDuration(lag)); + cr->SetOutput("Zone '" + zoneName + "' is connected. Log lag: " + Utility::FormatDuration(zoneLag)); } Array::Ptr perfdata = new Array(); - perfdata->Add(new PerfdataValue("slave_lag", lag)); + perfdata->Add(new PerfdataValue("slave_lag", zoneLag)); cr->SetPerformanceData(perfdata); checkable->ProcessCheckResult(cr); diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp index c2914d013..c4422108f 100644 --- a/lib/remote/apilistener.cpp +++ b/lib/remote/apilistener.cpp @@ -895,9 +895,9 @@ std::pair ApiListener::GetStatus(void) if (endpoint->GetName() == GetIdentity()) continue; - double eplag = Utility::GetTime() - endpoint->GetRemoteLogPosition(); + double eplag = CalculateZoneLag(endpoint); - if ((endpoint->GetSyncing() || !endpoint->IsConnected()) && eplag > zoneLag) + if (eplag > 0 && eplag > zoneLag) zoneLag = eplag; allEndpoints++; @@ -945,6 +945,17 @@ std::pair ApiListener::GetStatus(void) return std::make_pair(status, perfdata); } +double ApiListener::CalculateZoneLag(const Endpoint::Ptr& endpoint) +{ + double remoteLogPosition = endpoint->GetRemoteLogPosition(); + double eplag = Utility::GetTime() - remoteLogPosition; + + if ((endpoint->GetSyncing() || !endpoint->IsConnected()) && remoteLogPosition != 0) + return eplag; + + return 0; +} + void ApiListener::AddAnonymousClient(const JsonRpcConnection::Ptr& aclient) { ObjectLock olock(this); diff --git a/lib/remote/apilistener.hpp b/lib/remote/apilistener.hpp index 786714b5a..203cdadc5 100644 --- a/lib/remote/apilistener.hpp +++ b/lib/remote/apilistener.hpp @@ -75,6 +75,8 @@ public: void RemoveHttpClient(const HttpServerConnection::Ptr& aclient); std::set GetHttpClients(void) const; + static double CalculateZoneLag(const Endpoint::Ptr& endpoint); + /* filesync */ static Value ConfigUpdateHandler(const MessageOrigin::Ptr& origin, const Dictionary::Ptr& params);