diff --git a/lib/icinga/apievents.cpp b/lib/icinga/apievents.cpp index 0fb38e19013..7d0f5cd295a 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 af5ced05020..84bba8e5bd7 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 0617eca1272..4060f1d0068 100644 --- a/lib/icinga/checkable.hpp +++ b/lib/icinga/checkable.hpp @@ -181,7 +181,6 @@ class I2_ICINGA_API Checkable : public ObjectImpl /* Flapping Detection */ bool IsFlapping(void) const; - void UpdateFlappingStatus(bool stateChange); /* Dependencies */ void AddDependency(const intrusive_ptr& dep); @@ -237,6 +236,9 @@ class I2_ICINGA_API Checkable : public ObjectImpl std::set > m_ReverseDependencies; void GetAllChildrenInternal(std::set& children, int level = 0) const; + + /* Flapping */ + void UpdateFlappingStatus(bool stateChange); }; } diff --git a/lib/icinga/checkable.ti b/lib/icinga/checkable.ti index ced78b8e9fa..6ecf3ffaff1 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) {