Fix wrong calculation for host compat state UNREACHABLE

fixes #10058
This commit is contained in:
Michael Friedrich 2015-09-04 13:24:41 +02:00
parent c953104783
commit 0a43e81306
9 changed files with 48 additions and 38 deletions

View File

@ -117,21 +117,18 @@ void CompatLogger::CheckResultHandler(const Checkable::Ptr& checkable, const Che
msgbuf << "SERVICE ALERT: "
<< host->GetName() << ";"
<< service->GetShortName() << ";"
<< Service::StateToString(static_cast<ServiceState>(state_after)) << ";"
<< Service::StateTypeToString(static_cast<StateType>(stateType_after)) << ";"
<< Service::StateToString(service->GetState()) << ";"
<< Service::StateTypeToString(service->GetStateType()) << ";"
<< attempt_after << ";"
<< output << ""
<< "";
} else {
String state = Host::StateToString(Host::CalculateState(static_cast<ServiceState>(state_after)));
if (!reachable_after)
state = "UNREACHABLE";
msgbuf << "HOST ALERT: "
<< host->GetName() << ";"
<< state << ";"
<< Host::StateTypeToString(static_cast<StateType>(stateType_after)) << ";"
<< CompatUtility::GetHostStateString(host) << ";"
<< Host::StateTypeToString(host->GetStateType()) << ";"
<< attempt_after << ";"
<< output << ""
<< "";
@ -246,7 +243,7 @@ void CompatLogger::NotificationSentHandler(const Notification::Ptr& notification
if (service)
notification_type_str = Service::StateToString(service->GetState());
else
notification_type_str = host->IsReachable() ? Host::StateToString(host->GetState()) : "UNREACHABLE";
notification_type_str = CompatUtility::GetHostStateString(host);
}
String author_comment = "";
@ -278,7 +275,7 @@ void CompatLogger::NotificationSentHandler(const Notification::Ptr& notification
<< user->GetName() << ";"
<< host->GetName() << ";"
<< notification_type_str << " "
<< "(" << (host->IsReachable() ? Host::StateToString(host->GetState()) : "UNREACHABLE") << ");"
<< "(" << CompatUtility::GetHostStateString(host) << ");"
<< command_name << ";"
<< output << ";"
<< author_comment
@ -385,7 +382,7 @@ void CompatLogger::EventCommandHandler(const Checkable::Ptr& checkable)
} else {
msgbuf << "HOST EVENT HANDLER: "
<< host->GetName() << ";"
<< (host->IsReachable() ? Host::StateToString(host->GetState()) : "UNREACHABLE") << ";"
<< CompatUtility::GetHostStateString(host) << ";"
<< Host::StateTypeToString(host->GetStateType()) << ";"
<< current_attempt << ";"
<< event_command_name;
@ -462,7 +459,7 @@ void CompatLogger::ReopenFile(bool rotate)
std::ostringstream msgbuf;
msgbuf << "CURRENT HOST STATE: "
<< host->GetName() << ";"
<< (host->IsReachable() ? Host::StateToString(host->GetState()) : "UNREACHABLE") << ";"
<< CompatUtility::GetHostStateString(host) << ";"
<< Host::StateTypeToString(host->GetStateType()) << ";"
<< host->GetCheckAttempt() << ";"
<< output << "";

View File

@ -355,7 +355,7 @@ void StatusDataWriter::DumpCheckableStatusAttrs(std::ostream& fp, const Checkabl
fp << "\t" << "current_state=" << service->GetState() << "\n"
<< "\t" << "last_hard_state=" << service->GetLastHardState() << "\n";
} else {
fp << "\t" << "current_state=" << (host->IsReachable() ? host->GetState() : 2) << "\n"
fp << "\t" << "current_state=" << CompatUtility::GetHostCurrentState(host) << "\n"
<< "\t" << "last_hard_state=" << host->GetLastHardState() << "\n";
}

View File

@ -992,8 +992,8 @@ void DbEvents::AddCheckResultLogHistory(const Checkable::Ptr& checkable, const C
msgbuf << "SERVICE ALERT: "
<< host->GetName() << ";"
<< service->GetShortName() << ";"
<< Service::StateToString(static_cast<ServiceState>(state_after)) << ";"
<< Service::StateTypeToString(static_cast<StateType>(stateType_after)) << ";"
<< Service::StateToString(service->GetState()) << ";"
<< Service::StateTypeToString(service->GetStateType()) << ";"
<< attempt_after << ";"
<< output << ""
<< "";
@ -1017,15 +1017,10 @@ void DbEvents::AddCheckResultLogHistory(const Checkable::Ptr& checkable, const C
return;
}
} else {
String state = Host::StateToString(Host::CalculateState(static_cast<ServiceState>(state_after)));
if (!reachable_after)
state = "UNREACHABLE";
msgbuf << "HOST ALERT: "
<< host->GetName() << ";"
<< state << ";"
<< Service::StateTypeToString(static_cast<StateType>(stateType_after)) << ";"
<< CompatUtility::GetHostStateString(host) << ";"
<< Host::StateTypeToString(host->GetStateType()) << ";"
<< attempt_after << ";"
<< output << ""
<< "";

View File

@ -122,7 +122,7 @@ Dictionary::Ptr HostDbObject::GetStatusFields(void) const
fields->Set("check_source", cr->GetCheckSource());
}
fields->Set("current_state", host->IsReachable() ? host->GetState() : 2);
fields->Set("current_state", CompatUtility::GetHostCurrentState(host));
fields->Set("has_been_checked", CompatUtility::GetCheckableHasBeenChecked(host));
fields->Set("should_be_scheduled", host->GetEnableActiveChecks());
fields->Set("current_check_attempt", host->GetCheckAttempt());

View File

@ -69,8 +69,8 @@ bool Checkable::IsReachable(DependencyType dt, Dependency::Ptr *failedDependency
return false;
}
BOOST_FOREACH(const Checkable::Ptr& service, GetParents()) {
if (!service->IsReachable(dt, failedDependency, rstack + 1))
BOOST_FOREACH(const Checkable::Ptr& checkable, GetParents()) {
if (!checkable->IsReachable(dt, failedDependency, rstack + 1))
return false;
}

View File

@ -81,6 +81,22 @@ String CompatUtility::GetCommandName(const Command::Ptr command)
}
/* host */
int CompatUtility::GetHostCurrentState(const Host::Ptr& host)
{
if (host->GetState() != HostUp && !host->IsReachable())
return 2; /* hardcoded compat state */
return host->GetState();
}
String CompatUtility::GetHostStateString(const Host::Ptr& host)
{
if (host->GetState() != HostUp && !host->IsReachable())
return "UNREACHABLE"; /* hardcoded compat state */
return Host::StateToString(host->GetState());
}
String CompatUtility::GetHostAlias(const Host::Ptr& host)
{
if (!host->GetDisplayName().IsEmpty())

View File

@ -44,6 +44,8 @@ public:
static String GetCommandName(const Command::Ptr command);
/* host */
static int GetHostCurrentState(const Host::Ptr& host);
static String GetHostStateString(const Host::Ptr& host);
static String GetHostAlias(const Host::Ptr& host);
static int GetHostNotifyOnDown(const Host::Ptr& host);
static int GetHostNotifyOnUnreachable(const Host::Ptr& host);

View File

@ -113,21 +113,21 @@ bool Dependency::IsAvailable(DependencyType dt) const
{
Checkable::Ptr parent = GetParent();
Host::Ptr host;
Service::Ptr service;
tie(host, service) = GetHostService(parent);
Host::Ptr parentHost;
Service::Ptr parentService;
tie(parentHost, parentService) = GetHostService(parent);
/* ignore if it's the same checkable object */
if (parent == GetChild()) {
Log(LogNotice, "Dependency")
<< "Dependency '" << GetName() << "' passed: Parent and child " << (service ? "service" : "host") << " are identical.";
<< "Dependency '" << GetName() << "' passed: Parent and child " << (parentService ? "service" : "host") << " are identical.";
return true;
}
/* ignore pending */
if (!parent->GetLastCheckResult()) {
Log(LogNotice, "Dependency")
<< "Dependency '" << GetName() << "' passed: " << (service ? "Service" : "Host") << " '" << parent->GetName() << "' hasn't been checked yet.";
<< "Dependency '" << GetName() << "' passed: Parent " << (parentService ? "service" : "host") << " '" << parent->GetName() << "' hasn't been checked yet.";
return true;
}
@ -135,25 +135,25 @@ bool Dependency::IsAvailable(DependencyType dt) const
/* ignore soft states */
if (parent->GetStateType() == StateTypeSoft) {
Log(LogNotice, "Dependency")
<< "Dependency '" << GetName() << "' passed: " << (service ? "Service" : "Host") << " '" << parent->GetName() << "' is in a soft state.";
<< "Dependency '" << GetName() << "' passed: Parent " << (parentService ? "service" : "host") << " '" << parent->GetName() << "' is in a soft state.";
return true;
}
} else {
Log(LogNotice, "Dependency")
<< "Dependency '" << GetName() << "' failed: " << (service ? "Service" : "Host") << " '" << parent->GetName() << "' is in a soft state.";
<< "Dependency '" << GetName() << "' failed: Parent " << (parentService ? "service" : "host") << " '" << parent->GetName() << "' is in a soft state.";
}
int state;
if (service)
state = ServiceStateToFilter(service->GetState());
if (parentService)
state = ServiceStateToFilter(parentService->GetState());
else
state = HostStateToFilter(host->GetState());
state = HostStateToFilter(parentHost->GetState());
/* check state */
if (state & GetStateFilter()) {
Log(LogNotice, "Dependency")
<< "Dependency '" << GetName() << "' passed: " << (service ? "Service" : "Host") << " '" << parent->GetName() << "' matches state filter.";
<< "Dependency '" << GetName() << "' passed: Parent " << (parentService ? "service" : "host") << " '" << parent->GetName() << "' matches state filter.";
return true;
}
@ -177,8 +177,8 @@ bool Dependency::IsAvailable(DependencyType dt) const
Log(LogNotice, "Dependency")
<< "Dependency '" << GetName() << "' failed. Parent "
<< (service ? "service" : "host") << " '" << parent->GetName() << "' is "
<< (service ? Service::StateToString(service->GetState()) : Host::StateToString(host->GetState()));
<< (parentService ? "service" : "host") << " '" << parent->GetName() << "' is "
<< (parentService ? Service::StateToString(parentService->GetState()) : Host::StateToString(parentHost->GetState()));
return false;
}

View File

@ -149,7 +149,7 @@ void GelfWriter::NotificationToUserHandler(const Notification::Ptr& notification
fields->Set("short_message", output);
} else {
fields->Set("_type", "HOST NOTIFICATION");
fields->Set("short_message", "(" + (host->IsReachable() ? Host::StateToString(host->GetState()) : String("UNREACHABLE")) + ")");
fields->Set("short_message", "(" + CompatUtility::GetHostStateString(host) + ")");
}
fields->Set("_state", service ? Service::StateToString(service->GetState()) : Host::StateToString(host->GetState()));