diff --git a/components/replication/replicationcomponent.cpp b/components/replication/replicationcomponent.cpp index 3d97e035f..e35a6e3e5 100644 --- a/components/replication/replicationcomponent.cpp +++ b/components/replication/replicationcomponent.cpp @@ -63,26 +63,14 @@ void ReplicationComponent::CheckResultRequestHandler(const RequestMessage& reque String svcname = params.GetService(); Service::Ptr service = Service::GetByName(svcname); - Service::OnCheckResultReceived(service, params); - Dictionary::Ptr cr = params.GetCheckResult(); if (!cr) return; - Value active = cr->Get("active"); + if (cr->Contains("checker") && cr->Get("checker") == EndpointManager::GetInstance()->GetIdentity()) + return; - time_t ts; - Value schedule_end = cr->Get("schedule_end"); - - if (!schedule_end.IsEmpty()) - ts = static_cast(schedule_end); - else - ts = static_cast(Utility::GetTime()); - - if (active.IsEmpty() || static_cast(active)) - CIB::UpdateActiveChecksStatistics(ts, 1); - else - CIB::UpdatePassiveChecksStatistics(ts, 1); + Service::UpdateStatistics(cr); } void ReplicationComponent::EndpointConnectedHandler(const Endpoint::Ptr& endpoint) diff --git a/itl/cluster.conf b/itl/cluster.conf new file mode 100644 index 000000000..a469457e4 --- /dev/null +++ b/itl/cluster.conf @@ -0,0 +1,20 @@ +/****************************************************************************** + * Icinga 2 * + * Copyright (C) 2012 Icinga Development Team (http://www.icinga.org/) * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License * + * as published by the Free Software Foundation; either version 2 * + * of the License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the Free Software Foundation * + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ******************************************************************************/ + +local object Component "replication" {} diff --git a/lib/icinga/icingaapplication.cpp b/lib/icinga/icingaapplication.cpp index b3614ddde..a961d9be1 100644 --- a/lib/icinga/icingaapplication.cpp +++ b/lib/icinga/icingaapplication.cpp @@ -32,15 +32,7 @@ REGISTER_TYPE(IcingaApplication, NULL); IcingaApplication::IcingaApplication(const Dictionary::Ptr& serializedUpdate) : Application(serializedUpdate) -{ - /* load replication config component */ - ConfigItemBuilder::Ptr replicationComponentConfig = boost::make_shared(); - replicationComponentConfig->SetType("Component"); - replicationComponentConfig->SetName("replication"); - replicationComponentConfig->SetLocal(true); - replicationComponentConfig->Compile()->Commit(); - replicationComponentConfig.reset(); -} +{ } /** * The entry point for the Icinga application. diff --git a/lib/icinga/service-check.cpp b/lib/icinga/service-check.cpp index a27d567b9..b702040fe 100644 --- a/lib/icinga/service-check.cpp +++ b/lib/icinga/service-check.cpp @@ -25,7 +25,6 @@ const int Service::DefaultMaxCheckAttempts = 3; const int Service::DefaultCheckInterval = 5 * 60; const int Service::CheckIntervalDivisor = 5; -boost::signal Service::OnCheckResultReceived; boost::signal Service::OnCheckerChanged; boost::signal Service::OnNextCheckChanged; @@ -500,6 +499,9 @@ void Service::CheckCompletedHandler(const Dictionary::Ptr& scheduleInfo, if (!result->Contains("active")) result->Set("active", 1); + if (!result->Contains("checker")) + result->Set("checker", EndpointManager::GetInstance()->GetIdentity()); + ProcessCheckResult(result); } @@ -515,6 +517,8 @@ void Service::ProcessCheckResult(const Dictionary::Ptr& cr) { ApplyCheckResult(cr); + Service::UpdateStatistics(cr); + /* flush the current transaction so other instances see the service's * new state when they receive the CheckResult message */ DynamicObject::FlushTx(); @@ -531,3 +535,19 @@ void Service::ProcessCheckResult(const Dictionary::Ptr& cr) EndpointManager::GetInstance()->SendMulticastMessage(rm); } + +void Service::UpdateStatistics(const Dictionary::Ptr& cr) +{ + time_t ts; + Value schedule_end = cr->Get("schedule_end"); + if (!schedule_end.IsEmpty()) + ts = static_cast(schedule_end); + else + ts = static_cast(Utility::GetTime()); + + Value active = cr->Get("active"); + if (active.IsEmpty() || static_cast(active)) + CIB::UpdateActiveChecksStatistics(ts, 1); + else + CIB::UpdatePassiveChecksStatistics(ts, 1); +} diff --git a/lib/icinga/service.h b/lib/icinga/service.h index 18826477e..88796d3ce 100644 --- a/lib/icinga/service.h +++ b/lib/icinga/service.h @@ -169,6 +169,7 @@ public: void SetAcknowledgementExpiry(double timestamp); void ApplyCheckResult(const Dictionary::Ptr& cr); + static void UpdateStatistics(const Dictionary::Ptr& cr); void BeginExecuteCheck(const function& callback); void ProcessCheckResult(const Dictionary::Ptr& cr); @@ -179,7 +180,6 @@ public: static ServiceStateType StateTypeFromString(const String& state); static String StateTypeToString(ServiceStateType state); - static boost::signal OnCheckResultReceived; static boost::signal OnCheckerChanged; static boost::signal OnNextCheckChanged;