From 746a48e2ca4333cf1f1fccb8ecee1f1fddd60cfd Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Wed, 23 Oct 2019 15:22:54 +0200 Subject: [PATCH] RedisWriter: add icinga:history:stream:{state,notification}#previous_hard_state --- lib/icinga/checkable-check.cpp | 1 + lib/icinga/checkable.ti | 3 +++ lib/redis/rediswriter-objects.cpp | 14 ++++++++++++++ 3 files changed, 18 insertions(+) diff --git a/lib/icinga/checkable-check.cpp b/lib/icinga/checkable-check.cpp index 02bc8fc91..94940b29f 100644 --- a/lib/icinga/checkable-check.cpp +++ b/lib/icinga/checkable-check.cpp @@ -300,6 +300,7 @@ void Checkable::ProcessCheckResult(const CheckResult::Ptr& cr, const MessageOrig if (hardChange || is_volatile) { SetLastHardStateRaw(new_state); SetLastHardStateChange(now); + SetLastHardStatesRaw(GetLastHardStatesRaw() / 100u + new_state * 100u); } if (!IsStateOK(new_state)) diff --git a/lib/icinga/checkable.ti b/lib/icinga/checkable.ti index a920d2589..07a946258 100644 --- a/lib/icinga/checkable.ti +++ b/lib/icinga/checkable.ti @@ -105,6 +105,9 @@ abstract class Checkable : CustomVarObject [state, enum, no_user_view, no_user_modify] ServiceState last_hard_state_raw { default {{{ return ServiceUnknown; }}} }; + [state, no_user_view, no_user_modify] "unsigned short" last_hard_states_raw { + default {{{ return /* current */ 99 * 100 + /* previous */ 99; }}} + }; [state, enum] StateType last_state_type { default {{{ return StateTypeSoft; }}} }; diff --git a/lib/redis/rediswriter-objects.cpp b/lib/redis/rediswriter-objects.cpp index 86d05de30..c4907fb32 100644 --- a/lib/redis/rediswriter-objects.cpp +++ b/lib/redis/rediswriter-objects.cpp @@ -1140,6 +1140,18 @@ void RedisWriter::SendConfigDelete(const ConfigObject::Ptr& object) }); } +static +unsigned short GetPreviousHardState(const Checkable::Ptr& checkable, const Service::Ptr& service) +{ + auto phs (checkable->GetLastHardStatesRaw() % 100u); + + if (service) { + return phs; + } else { + return phs == 99 ? phs : Host::CalculateState(ServiceState(phs)); + } +} + void RedisWriter::SendStatusUpdate(const ConfigObject::Ptr& object, const CheckResult::Ptr& cr, StateType type) { if (!m_Rcon || !m_Rcon->IsConnected()) @@ -1185,6 +1197,7 @@ void RedisWriter::SendStatusUpdate(const ConfigObject::Ptr& object, const CheckR // TODO: last_hard/soft_state should be "previous". "last_soft_state", Convert::ToString(cr ? cr->GetState() : 99), "last_hard_state", Convert::ToString(service ? service->GetLastHardState() : host->GetLastHardState()), + "previous_hard_state", Convert::ToString(GetPreviousHardState(checkable, service)), "output", Utility::ValidateUTF8(std::move(output.first)), "long_output", Utility::ValidateUTF8(std::move(output.second)), "check_source", cr->GetCheckSource(), @@ -1234,6 +1247,7 @@ void RedisWriter::SendSentNotification( "type", Convert::ToString(type), "send_time", Convert::ToString(TimestampToMilliseconds(Utility::GetTime())), "state", Convert::ToString(cr->GetState()), + "previous_hard_state", Convert::ToString(GetPreviousHardState(checkable, service)), "output", Utility::ValidateUTF8(std::move(output.first)), "long_output", Utility::ValidateUTF8(std::move(output.second)), "users_notified", Convert::ToString(users),