diff --git a/components/checker/checkercomponent.cpp b/components/checker/checkercomponent.cpp index b35b51664..4cb1f1987 100644 --- a/components/checker/checkercomponent.cpp +++ b/components/checker/checkercomponent.cpp @@ -90,12 +90,14 @@ void CheckerComponent::CheckTimerHandler(void) double lastCheck = cr->Get("execution_end"); int missed = (Utility::GetTime() - lastCheck) / service->GetCheckInterval() - 1; - if (missed > 0) { + if (missed > 0 && !service->GetFirstCheck()) { missedChecks += missed; missedServices++; } } + service->SetFirstCheck(false); + Logger::Write(LogDebug, "checker", "Executing service check for '" + service->GetName() + "'"); m_PendingServices.insert(service); diff --git a/lib/icinga/service.cpp b/lib/icinga/service.cpp index a0ba70e1b..c33d4e600 100644 --- a/lib/icinga/service.cpp +++ b/lib/icinga/service.cpp @@ -34,6 +34,7 @@ static AttributeDescription serviceAttributes[] = { { "checkers", Attribute_Config }, { "scheduling_offset", Attribute_Transient }, + { "first_check", Attribute_Transient }, { "next_check", Attribute_Replicated }, { "checker", Attribute_Replicated }, { "check_attempt", Attribute_Replicated }, @@ -225,6 +226,22 @@ long Service::GetSchedulingOffset(void) return value; } +void Service::SetFirstCheck(bool first) +{ + Set("first_check", first ? 1 : 0); +} + +bool Service::GetFirstCheck(void) const +{ + Value value = Get("first_check"); + + if (value.IsEmpty()) + return true; + + return static_cast(value); +} + + void Service::SetNextCheck(double nextCheck) { Set("next_check", nextCheck); diff --git a/lib/icinga/service.h b/lib/icinga/service.h index 91bbc92b0..e97afff21 100644 --- a/lib/icinga/service.h +++ b/lib/icinga/service.h @@ -100,7 +100,10 @@ public: long GetSchedulingOffset(void); void SetSchedulingOffset(long offset); - + + void SetFirstCheck(bool first); + bool GetFirstCheck(void) const; + void SetNextCheck(double nextCheck); double GetNextCheck(void); void UpdateNextCheck(void);