Implement severity attribute for host/service objects

refs #5117
This commit is contained in:
Michael Friedrich 2017-02-09 15:32:10 +01:00
parent 17615ac444
commit dc7980586b
7 changed files with 92 additions and 3 deletions

View File

@ -117,9 +117,9 @@ AcknowledgementType Checkable::GetAcknowledgement(void)
return avalue;
}
bool Checkable::IsAcknowledged(void)
bool Checkable::IsAcknowledged(void) const
{
return GetAcknowledgement() != AcknowledgementNone;
return const_cast<Checkable *>(this)->GetAcknowledgement() != AcknowledgementNone;
}
void Checkable::AcknowledgeProblem(const String& author, const String& comment, AcknowledgementType type, bool notify, double expiry, const MessageOrigin::Ptr& origin)
@ -146,6 +146,12 @@ Endpoint::Ptr Checkable::GetCommandEndpoint(void) const
return Endpoint::GetByName(GetCommandEndpointRaw());
}
int Checkable::GetSeverity(void) const
{
/* overridden in Host/Service class. */
return 0;
}
void Checkable::NotifyFixedDowntimeStart(const Downtime::Ptr& downtime)
{
if (!downtime->GetFixed())

View File

@ -53,6 +53,22 @@ enum CheckableType
CheckableService
};
/**
* Severity Flags
*
* @ingroup icinga
*/
enum SeverityFlag
{
SeverityFlagDowntime = 1,
SeverityFlagAcknowledgement = 2,
SeverityFlagUnhandled = 8,
SeverityFlagPending = 16,
SeverityFlagWarning = 32,
SeverityFlagUnknown = 64,
SeverityFlagCritical = 128,
};
class CheckCommand;
class EventCommand;
class Dependency;
@ -85,6 +101,8 @@ public:
void AcknowledgeProblem(const String& author, const String& comment, AcknowledgementType type, bool notify = true, double expiry = 0, const MessageOrigin::Ptr& origin = MessageOrigin::Ptr());
void ClearAcknowledgement(const MessageOrigin::Ptr& origin = MessageOrigin::Ptr());
virtual int GetSeverity(void) const override;
/* Checks */
intrusive_ptr<CheckCommand> GetCheckCommand(void) const;
TimePeriod::Ptr GetCheckPeriod(void) const;
@ -132,7 +150,7 @@ public:
void RemoveAllDowntimes(void);
void TriggerDowntimes(void);
bool IsInDowntime(void) const;
bool IsAcknowledged(void);
bool IsAcknowledged(void) const;
std::set<Downtime::Ptr> GetDowntimes(void) const;
void RegisterDowntime(const Downtime::Ptr& downtime);

View File

@ -128,6 +128,11 @@ abstract class Checkable : CustomVarObject
default {{{ return Application::GetStartTime(); }}}
};
[state] Timestamp last_state_unreachable;
[no_storage] int severity {
get;
};
[state] bool force_next_check;
[state] int acknowledgement (AcknowledgementRaw) {
default {{{ return AcknowledgementNone; }}}

View File

@ -181,6 +181,34 @@ HostState Host::GetLastHardState(void) const
return CalculateState(GetLastHardStateRaw());
}
/* keep in sync with Service::GetSeverity() */
int Host::GetSeverity(void) const
{
int severity = 0;
ObjectLock olock(this);
ServiceState state = GetStateRaw();
/* OK/Warning = Up, Critical/Unknownb = Down */
if (!HasBeenChecked())
severity |= SeverityFlagPending;
else if (state == ServiceUnknown)
severity |= SeverityFlagCritical;
else if (state == ServiceCritical)
severity |= SeverityFlagCritical;
if (IsInDowntime())
severity |= SeverityFlagDowntime;
else if (IsAcknowledged())
severity |= SeverityFlagAcknowledgement;
else
severity |= SeverityFlagUnhandled;
olock.Unlock();
return severity;
}
bool Host::IsStateOK(ServiceState state)
{
return Host::CalculateState(state) == HostUp;

View File

@ -54,6 +54,7 @@ public:
virtual HostState GetState(void) const override;
virtual HostState GetLastState(void) const override;
virtual HostState GetLastHardState(void) const override;
virtual int GetSeverity(void) const override;
virtual bool IsStateOK(ServiceState state) override;
virtual void SaveLastState(ServiceState state, double timestamp) override;

View File

@ -124,6 +124,36 @@ Host::Ptr Service::GetHost(void) const
return m_Host;
}
/* keep in sync with Host::GetSeverity() */
int Service::GetSeverity(void) const
{
int severity = 0;
ObjectLock olock(this);
ServiceState state = GetStateRaw();
if (!HasBeenChecked())
severity |= SeverityFlagPending;
else if (state == ServiceWarning)
severity |= SeverityFlagWarning;
else if (state == ServiceUnknown)
severity |= SeverityFlagUnknown;
else if (state == ServiceCritical)
severity |= SeverityFlagCritical;
/* TODO: Add host reachability and handled */
if (IsInDowntime())
severity |= SeverityFlagDowntime;
else if (IsAcknowledged())
severity |= SeverityFlagAcknowledgement;
else
severity |= SeverityFlagUnhandled;
olock.Unlock();
return severity;
}
bool Service::IsStateOK(ServiceState state)
{
return state == ServiceOK;

View File

@ -42,6 +42,7 @@ public:
static Service::Ptr GetByNamePair(const String& hostName, const String& serviceName);
virtual Host::Ptr GetHost(void) const override;
virtual int GetSeverity(void) const override;
virtual bool ResolveMacro(const String& macro, const CheckResult::Ptr& cr, Value *result) const override;