]> granicus.if.org Git - icinga2/commitdiff
Implement statistics for passive service checks.
authorGunnar Beutner <gunnar.beutner@netways.de>
Mon, 28 Jan 2013 08:01:47 +0000 (09:01 +0100)
committerGunnar Beutner <gunnar.beutner@netways.de>
Mon, 28 Jan 2013 08:01:47 +0000 (09:01 +0100)
components/compat/compatcomponent.cpp
components/replication/replicationcomponent.cpp
lib/base/dynamicobject.cpp
lib/base/dynamicobject.h
lib/icinga/cib.cpp
lib/icinga/cib.h
lib/icinga/externalcommand.cpp
lib/icinga/service.cpp

index 11187daccf93a21103dad037200de24b08eca88d..5ce26b264dfcb6e50bd5cbb05d56dcfc39fe0252 100644 (file)
@@ -322,7 +322,8 @@ void CompatComponent::StatusTimerHandler(void)
                 << "\t" << "check_host_freshness=0" << "\n"
                 << "\t" << "enable_flap_detection=1" << "\n"
                 << "\t" << "enable_failure_prediction=0" << "\n"
-                << "\t" << "active_scheduled_service_check_stats=" << CIB::GetTaskStatistics(60) << "," << CIB::GetTaskStatistics(5 * 60) << "," << CIB::GetTaskStatistics(15 * 60) << "\n"
+                << "\t" << "active_scheduled_service_check_stats=" << CIB::GetActiveChecksStatistics(60) << "," << CIB::GetActiveChecksStatistics(5 * 60) << "," << CIB::GetActiveChecksStatistics(15 * 60) << "\n"
+                << "\t" << "passive_service_check_stats=" << CIB::GetPassiveChecksStatistics(60) << "," << CIB::GetPassiveChecksStatistics(5 * 60) << "," << CIB::GetPassiveChecksStatistics(15 * 60) << "\n"
                 << "\t" << "}" << "\n"
                 << "\n";
 
index ef2c71767ca665a8f3710c79715fedaf55bedbe3..a8a50b4af8c67975b4adae20d1b3482556a9b870 100644 (file)
@@ -71,8 +71,23 @@ void ReplicationComponent::ServiceStateChangeRequestHandler(const RequestMessage
        //Service::OnCheckResultReceived(service, params);
        //service->ApplyCheckResult(cr);
 
-       time_t now = static_cast<time_t>(Utility::GetTime());
-       CIB::UpdateTaskStatistics(now, 1);
+       Dictionary::Ptr cr = service->GetLastCheckResult();
+       if (cr) {
+               Value active = cr->Get("active");
+
+               time_t ts;
+               Value schedule_end = cr->Get("schedule_end");
+
+               if (!schedule_end.IsEmpty())
+                       schedule_end = static_cast<time_t>(schedule_end);
+               else
+                       schedule_end = static_cast<time_t>(Utility::GetTime());
+
+               if (active.IsEmpty() || static_cast<long>(active))
+                       CIB::UpdateActiveChecksStatistics(ts, 1);
+               else
+                       CIB::UpdatePassiveChecksStatistics(ts, 1);
+       }
 }
 
 void ReplicationComponent::EndpointConnectedHandler(const Endpoint::Ptr& endpoint)
index 8be09c20bd0c1afd19946ed6a5f68f3abb9bab29..a7803eeeab8b8b1ee9aebbbd2b50e89b66726e31 100644 (file)
@@ -452,6 +452,12 @@ void DynamicObject::FinishTx(void)
        m_CurrentTx = 0;
 }
 
+void DynamicObject::FlushTx(void)
+{
+       FinishTx();
+       BeginTx();
+}
+
 void DynamicObject::OnAttributeChanged(const String&, const Value&)
 { }
 
index c06973e2bcdcef92dd99c923dfc933778d418587..88973cf3c7ee8a1d138b4f80747196b79a7df54b 100644 (file)
@@ -140,6 +140,7 @@ public:
        static double GetCurrentTx(void);
        static void BeginTx(void);
        static void FinishTx(void);
+       static void FlushTx(void);
 
 protected:
        virtual void OnAttributeChanged(const String& name, const Value& oldValue);
index d9b7e935307fff7ebdabb259d68468b9984c407e..6502786f6749c5e1978e7e36af2f519c7760f553 100644 (file)
 
 using namespace icinga;
 
-RingBuffer CIB::m_TaskStatistics(15 * 60);
+RingBuffer CIB::m_ActiveChecksStatistics(15 * 60);
+RingBuffer CIB::m_PassiveChecksStatistics(15 * 60);
 
-void CIB::UpdateTaskStatistics(long tv, int num)
+void CIB::UpdateActiveChecksStatistics(long tv, int num)
 {
-       m_TaskStatistics.InsertValue(tv, num);
+       m_ActiveChecksStatistics.InsertValue(tv, num);
 }
 
-int CIB::GetTaskStatistics(long timespan)
+int CIB::GetActiveChecksStatistics(long timespan)
 {
-       return m_TaskStatistics.GetValues(timespan);
+       return m_ActiveChecksStatistics.GetValues(timespan);
+}
+
+void CIB::UpdatePassiveChecksStatistics(long tv, int num)
+{
+       m_PassiveChecksStatistics.InsertValue(tv, num);
+}
+
+int CIB::GetPassiveChecksStatistics(long timespan)
+{
+       return m_PassiveChecksStatistics.GetValues(timespan);
 }
index fc4bc53925b2ecd33367a2ddf27cccc503010ee7..a9eaa907cd566a23eba1ad3450434cafafcaa085 100644 (file)
@@ -32,11 +32,15 @@ namespace icinga
 class I2_ICINGA_API CIB
 {
 public:
-       static void UpdateTaskStatistics(long tv, int num);
-       static int GetTaskStatistics(long timespan);
+       static void UpdateActiveChecksStatistics(long tv, int num);
+       static int GetActiveChecksStatistics(long timespan);
+
+       static void UpdatePassiveChecksStatistics(long tv, int num);
+       static int GetPassiveChecksStatistics(long timespan);
 
 private:
-       static RingBuffer m_TaskStatistics;
+       static RingBuffer m_ActiveChecksStatistics;
+       static RingBuffer m_PassiveChecksStatistics;
 };
 
 }
index 92db8a0a3c67b41d4c47e734af95cf0a4727ba9e..e72e6ad8559accba8d0ef9e4d27f0232a47d7d24 100644 (file)
@@ -130,6 +130,7 @@ void ExternalCommand::ProcessServiceCheckResult(double time, const vector<String
        result->Set("schedule_end", time);
        result->Set("execution_start", time);
        result->Set("execution_end", time);
+       result->Set("active", 0);
 
        Logger::Write(LogInformation, "icinga", "Processing passive check result for service '" + arguments[1] + "'");
        service->ProcessCheckResult(result);
index 5bd1d36509db402078e9a0f4d713d7a4e84556ba..5104d26964f7e6d085a18a88d65d914d6c2bd429 100644 (file)
@@ -678,6 +678,9 @@ void Service::CheckCompletedHandler(const Dictionary::Ptr& scheduleInfo,
                        if (!result->Contains("execution_end"))
                                result->Set("execution_end", scheduleInfo->Get("execution_end"));
 
+                       if (!result->Contains("active"))
+                               result->Set("active", 1);
+
                        ProcessCheckResult(result);
                }
        } catch (const exception& ex) {
@@ -699,6 +702,10 @@ void Service::ProcessCheckResult(const Dictionary::Ptr& cr)
 {
        ApplyCheckResult(cr);
 
+       /* flush the current transaction so other instances see the service's
+        * new state when they receive the ServiceStateChange message */
+       DynamicObject::FlushTx();
+
        RequestMessage rm;
        rm.SetMethod("checker::ServiceStateChange");