blob: 9b2dad7cc5c07585bef3060e213ddb37c3e862d4 (
plain) (
tree)
|
|
#pragma once
#include <util/datetime/base.h>
#include <util/generic/ptr.h>
#include <atomic>
namespace NMonitoring {
class IGauge;
class IExpMovingAverage {
public:
virtual ~IExpMovingAverage() = default;
virtual void Tick() = 0;
virtual void Update(i64 value) = 0;
virtual double Rate() const = 0;
virtual void Reset() = 0;
};
using IExpMovingAveragePtr = THolder<IExpMovingAverage>;
class TEwmaMeter {
public:
// Creates a fake EWMA that will always return 0. Mostly for usage convenience
TEwmaMeter();
explicit TEwmaMeter(IExpMovingAveragePtr&& ewma);
TEwmaMeter(TEwmaMeter&& other);
TEwmaMeter& operator=(TEwmaMeter&& other);
void Mark();
void Mark(i64 value);
double Get();
private:
void TickIfNeeded();
private:
IExpMovingAveragePtr Ewma_;
std::atomic<ui64> LastTick_{TInstant::Now().Seconds()};
};
IExpMovingAveragePtr OneMinuteEwma(IGauge* gauge);
IExpMovingAveragePtr FiveMinuteEwma(IGauge* gauge);
IExpMovingAveragePtr FiveteenMinuteEwma(IGauge* gauge);
} // namespace NMonitoring
|