Fix flapping endianness and events

fixes #5720
This commit is contained in:
Jean Flach 2017-11-03 17:50:59 +01:00
parent 3ed3bffd13
commit 872d4895f0
4 changed files with 16 additions and 6 deletions

View File

@ -170,6 +170,9 @@ void ApiEvents::FlappingChangedHandler(const Checkable::Ptr& checkable, const Me
result->Set("state", service ? static_cast<int>(service->GetState()) : static_cast<int>(host->GetState())); result->Set("state", service ? static_cast<int>(service->GetState()) : static_cast<int>(host->GetState()));
result->Set("state_type", checkable->GetStateType()); result->Set("state_type", checkable->GetStateType());
result->Set("is_flapping", checkable->IsFlapping()); 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) { for (const EventQueue::Ptr& queue : queues) {
queue->ProcessEvent(result); queue->ProcessEvent(result);

View File

@ -27,13 +27,14 @@ using namespace icinga;
void Checkable::UpdateFlappingStatus(bool stateChange) void Checkable::UpdateFlappingStatus(bool stateChange)
{ {
std::bitset<20> stateChangeBuf = GetFlappingBuffer(); std::bitset<20> stateChangeBuf = GetFlappingBuffer();
int oldestIndex = (GetFlappingBuffer() & 0xFF00000) >> 20; int oldestIndex = GetFlappingIndex();
stateChangeBuf[oldestIndex] = stateChange; stateChangeBuf[oldestIndex] = stateChange;
oldestIndex = (oldestIndex + 1) % 20; oldestIndex = (oldestIndex + 1) % 20;
double stateChanges = 0; double stateChanges = 0;
/* Iterate over our state array and compute a weighted total */
for (int i = 0; i < 20; i++) { for (int i = 0; i < 20; i++) {
if (stateChangeBuf[(oldestIndex + i) % 20]) if (stateChangeBuf[(oldestIndex + i) % 20])
stateChanges += 0.8 + (0.02 * i); stateChanges += 0.8 + (0.02 * i);
@ -48,12 +49,13 @@ void Checkable::UpdateFlappingStatus(bool stateChange)
else else
flapping = flappingValue > GetFlappingThresholdHigh(); flapping = flappingValue > GetFlappingThresholdHigh();
SetFlappingBuffer(stateChangeBuf.to_ulong());
SetFlappingIndex(oldestIndex);
SetFlappingCurrent(flappingValue);
SetFlapping(flapping, true);
if (flapping != GetFlapping()) if (flapping != GetFlapping())
SetFlappingLastChange(Utility::GetTime()); SetFlappingLastChange(Utility::GetTime());
SetFlappingBuffer((stateChangeBuf.to_ulong() | (oldestIndex << 20)));
SetFlappingCurrent(flappingValue);
SetFlapping(flapping);
} }
bool Checkable::IsFlapping(void) const bool Checkable::IsFlapping(void) const

View File

@ -181,7 +181,6 @@ public:
/* Flapping Detection */ /* Flapping Detection */
bool IsFlapping(void) const; bool IsFlapping(void) const;
void UpdateFlappingStatus(bool stateChange);
/* Dependencies */ /* Dependencies */
void AddDependency(const intrusive_ptr<Dependency>& dep); void AddDependency(const intrusive_ptr<Dependency>& dep);
@ -237,6 +236,10 @@ private:
std::set<intrusive_ptr<Dependency> > m_ReverseDependencies; std::set<intrusive_ptr<Dependency> > m_ReverseDependencies;
void GetAllChildrenInternal(std::set<Checkable::Ptr>& children, int level = 0) const; void GetAllChildrenInternal(std::set<Checkable::Ptr>& children, int level = 0) const;
/* Flapping */
void UpdateFlappingStatus(bool stateChange);
bool SuppressEvent(void) const;
}; };
} }

View File

@ -158,7 +158,9 @@ abstract class Checkable : CustomVarObject
default {{{ return 0; }}} default {{{ return 0; }}}
}; };
[state] Timestamp flapping_last_change; [state] Timestamp flapping_last_change;
[state, no_user_view, no_user_modify] int flapping_buffer; [state, no_user_view, no_user_modify] int flapping_buffer;
[state, no_user_view, no_user_modify] int flapping_index;
[state, protected] bool flapping; [state, protected] bool flapping;
[config, navigation] name(Endpoint) command_endpoint (CommandEndpointRaw) { [config, navigation] name(Endpoint) command_endpoint (CommandEndpointRaw) {