From: Jean Flach Date: Fri, 3 Nov 2017 16:50:59 +0000 (+0100) Subject: Fix flapping endianness and events X-Git-Tag: v2.8.0~17^2~2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=872d4895f06b545534bd78243f090b467fc29cc0;p=icinga2 Fix flapping endianness and events fixes #5720 --- diff --git a/lib/icinga/apievents.cpp b/lib/icinga/apievents.cpp index 0fb38e190..7d0f5cd29 100644 --- a/lib/icinga/apievents.cpp +++ b/lib/icinga/apievents.cpp @@ -170,6 +170,9 @@ void ApiEvents::FlappingChangedHandler(const Checkable::Ptr& checkable, const Me result->Set("state", service ? static_cast(service->GetState()) : static_cast(host->GetState())); result->Set("state_type", checkable->GetStateType()); result->Set("is_flapping", checkable->IsFlapping()); + result->Set("flapping_current", checkable->GetFlappingCurrent()); + result->Set("threshold_low", checkable->GetFlappingThresholdLow()); + result->Set("threshold_high", checkable->GetFlappingThresholdHigh()); for (const EventQueue::Ptr& queue : queues) { queue->ProcessEvent(result); diff --git a/lib/icinga/checkable-flapping.cpp b/lib/icinga/checkable-flapping.cpp index af5ced050..84bba8e5b 100644 --- a/lib/icinga/checkable-flapping.cpp +++ b/lib/icinga/checkable-flapping.cpp @@ -27,13 +27,14 @@ using namespace icinga; void Checkable::UpdateFlappingStatus(bool stateChange) { std::bitset<20> stateChangeBuf = GetFlappingBuffer(); - int oldestIndex = (GetFlappingBuffer() & 0xFF00000) >> 20; + int oldestIndex = GetFlappingIndex(); stateChangeBuf[oldestIndex] = stateChange; oldestIndex = (oldestIndex + 1) % 20; double stateChanges = 0; + /* Iterate over our state array and compute a weighted total */ for (int i = 0; i < 20; i++) { if (stateChangeBuf[(oldestIndex + i) % 20]) stateChanges += 0.8 + (0.02 * i); @@ -48,12 +49,13 @@ void Checkable::UpdateFlappingStatus(bool stateChange) else flapping = flappingValue > GetFlappingThresholdHigh(); + SetFlappingBuffer(stateChangeBuf.to_ulong()); + SetFlappingIndex(oldestIndex); + SetFlappingCurrent(flappingValue); + SetFlapping(flapping, true); + if (flapping != GetFlapping()) SetFlappingLastChange(Utility::GetTime()); - - SetFlappingBuffer((stateChangeBuf.to_ulong() | (oldestIndex << 20))); - SetFlappingCurrent(flappingValue); - SetFlapping(flapping); } bool Checkable::IsFlapping(void) const diff --git a/lib/icinga/checkable.hpp b/lib/icinga/checkable.hpp index 0617eca12..413e452d3 100644 --- a/lib/icinga/checkable.hpp +++ b/lib/icinga/checkable.hpp @@ -181,7 +181,6 @@ public: /* Flapping Detection */ bool IsFlapping(void) const; - void UpdateFlappingStatus(bool stateChange); /* Dependencies */ void AddDependency(const intrusive_ptr& dep); @@ -237,6 +236,10 @@ private: std::set > m_ReverseDependencies; void GetAllChildrenInternal(std::set& children, int level = 0) const; + + /* Flapping */ + void UpdateFlappingStatus(bool stateChange); + bool SuppressEvent(void) const; }; } diff --git a/lib/icinga/checkable.ti b/lib/icinga/checkable.ti index ced78b8e9..6ecf3ffaf 100644 --- a/lib/icinga/checkable.ti +++ b/lib/icinga/checkable.ti @@ -158,7 +158,9 @@ abstract class Checkable : CustomVarObject default {{{ return 0; }}} }; [state] Timestamp flapping_last_change; + [state, no_user_view, no_user_modify] int flapping_buffer; + [state, no_user_view, no_user_modify] int flapping_index; [state, protected] bool flapping; [config, navigation] name(Endpoint) command_endpoint (CommandEndpointRaw) {