result->Set("state", service ? static_cast<int>(service->GetState()) : static_cast<int>(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);
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);
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
/* Flapping Detection */
bool IsFlapping(void) const;
- void UpdateFlappingStatus(bool stateChange);
/* Dependencies */
void AddDependency(const intrusive_ptr<Dependency>& dep);
std::set<intrusive_ptr<Dependency> > m_ReverseDependencies;
void GetAllChildrenInternal(std::set<Checkable::Ptr>& children, int level = 0) const;
+
+ /* Flapping */
+ void UpdateFlappingStatus(bool stateChange);
+ bool SuppressEvent(void) const;
};
}
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) {