diff options
| author | Dan Engelbrecht <[email protected]> | 2023-09-28 23:57:31 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-09-28 23:57:31 +0200 |
| commit | bf20e4c8e63638792e69098d4d9810c1136ff627 (patch) | |
| tree | fee82fc0d15910902a4a3c24a5564867748b6419 /src/zencore | |
| parent | added more context to http response error message (#430) (diff) | |
| download | zen-bf20e4c8e63638792e69098d4d9810c1136ff627.tar.xz zen-bf20e4c8e63638792e69098d4d9810c1136ff627.zip | |
adding more stats (#429)
- Feature: Add detailed stats on requests and data sizes on a per-bucket level, use parameter `cachestorestats=true` on the `/stats/z$` endpoint to enable
- Feature: Add detailed stats on requests and data sizes on cidstore, use parameter `cidstorestats=true` on the `/stats/z$` endpoint to enable
- Feature: Dashboard now accepts parameters in the URL which is passed on to the `/stats/z$` endpoint
Diffstat (limited to 'src/zencore')
| -rw-r--r-- | src/zencore/include/zencore/stats.h | 64 | ||||
| -rw-r--r-- | src/zencore/stats.cpp | 72 |
2 files changed, 133 insertions, 3 deletions
diff --git a/src/zencore/include/zencore/stats.h b/src/zencore/include/zencore/stats.h index 1a0817b99..e8e08f96a 100644 --- a/src/zencore/include/zencore/stats.h +++ b/src/zencore/include/zencore/stats.h @@ -222,6 +222,39 @@ private: Histogram m_Histogram; }; +struct MeterSnapshot +{ + uint64_t Count; + double MeanRate; + double Rate1; + double Rate5; + double Rate15; +}; + +struct HistogramSnapshot +{ + double Count; + double Avg; + double Min; + double Max; + double P75; + double P95; + double P99; + double P999; +}; + +struct StatsSnapshot +{ + MeterSnapshot Meter; + HistogramSnapshot Histogram; +}; + +struct RequestStatsSnapshot +{ + StatsSnapshot Requests; + StatsSnapshot Bytes; +}; + /** Metrics for network requests Aggregates tracking of duration, payload sizes into a single @@ -261,19 +294,39 @@ public: struct Scope { - Scope(OperationTiming& Outer); + Scope(RequestStats& Outer, int64_t Bytes); ~Scope(); + void SetBytes(int64_t Bytes) { m_Bytes = Bytes; } + void Stop(); void Cancel(); private: - OperationTiming& m_Outer; - uint64_t m_StartTick; + RequestStats& m_Outer; + uint64_t m_StartTick; + int64_t m_Bytes; }; void EmitSnapshot(std::string_view Tag, CbObjectWriter& Cbo); + RequestStatsSnapshot Snapshot(); + private: + static StatsSnapshot GetSnapshot(Meter& M, Histogram& H, double ConversionFactor) + { + SampleSnapshot Snap = H.Snapshot(); + return StatsSnapshot{ + .Meter = {.Count = M.Count(), .MeanRate = M.MeanRate(), .Rate1 = M.Rate1(), .Rate5 = M.Rate5(), .Rate15 = M.Rate15()}, + .Histogram = {.Count = H.Count() * ConversionFactor, + .Avg = H.Mean() * ConversionFactor, + .Min = H.Min() * ConversionFactor, + .Max = H.Max() * ConversionFactor, + .P75 = Snap.Get75Percentile() * ConversionFactor, + .P95 = Snap.Get95Percentile() * ConversionFactor, + .P99 = Snap.Get99Percentile() * ConversionFactor, + .P999 = Snap.Get999Percentile() * ConversionFactor}}; + } + Meter m_RequestMeter; Meter m_BytesMeter; Histogram m_RequestTimeHistogram; @@ -286,6 +339,11 @@ void EmitSnapshot(std::string_view Tag, Meter& Stat, CbObjectWriter& Cbo); void EmitSnapshot(const Histogram& Stat, CbObjectWriter& Cbo, double ConversionFactor); +void EmitSnapshot(std::string_view Tag, const MeterSnapshot& Snapshot, CbObjectWriter& Cbo); +void EmitSnapshot(std::string_view Tag, const HistogramSnapshot& Snapshot, CbObjectWriter& Cbo); +void EmitSnapshot(std::string_view Tag, const StatsSnapshot& Snapshot, CbObjectWriter& Cbo); +void EmitSnapshot(std::string_view Tag, const RequestStatsSnapshot& Snapshot, CbObjectWriter& Cbo); + } // namespace zen::metrics namespace zen { diff --git a/src/zencore/stats.cpp b/src/zencore/stats.cpp index 372bc42f8..087319fa4 100644 --- a/src/zencore/stats.cpp +++ b/src/zencore/stats.cpp @@ -461,6 +461,31 @@ RequestStats::Count() const return m_RequestMeter.Count(); } +RequestStats::Scope::Scope(RequestStats& Outer, int64_t Bytes) : m_Outer(Outer), m_StartTick(GetHifreqTimerValue()), m_Bytes(Bytes) +{ +} + +RequestStats::Scope::~Scope() +{ + Stop(); +} + +void +RequestStats::Scope::Stop() +{ + if (m_StartTick != 0) + { + m_Outer.Update(GetHifreqTimerValue() - m_StartTick, m_Bytes); + m_StartTick = 0; + } +} + +void +RequestStats::Scope::Cancel() +{ + m_StartTick = 0; +} + ////////////////////////////////////////////////////////////////////////// void @@ -489,6 +514,15 @@ RequestStats::EmitSnapshot(std::string_view Tag, CbObjectWriter& Cbo) Cbo.EndObject(); } +RequestStatsSnapshot +RequestStats::Snapshot() +{ + const double ToSeconds = GetHifreqTimerToSeconds(); + + return RequestStatsSnapshot{.Requests = GetSnapshot(m_RequestMeter, m_RequestTimeHistogram, ToSeconds), + .Bytes = GetSnapshot(m_BytesMeter, m_BytesHistogram, 1.0)}; +} + void EmitSnapshot(std::string_view Tag, OperationTiming& Stat, CbObjectWriter& Cbo) { @@ -540,6 +574,44 @@ EmitSnapshot(std::string_view Tag, Meter& Stat, CbObjectWriter& Cbo) Cbo.EndObject(); } +void +EmitSnapshot(const MeterSnapshot& Snapshot, CbObjectWriter& Cbo) +{ + Cbo << "count" << Snapshot.Count; + Cbo << "rate_mean" << Snapshot.MeanRate; + Cbo << "rate_1" << Snapshot.Rate1 << "rate_5" << Snapshot.Rate5 << "rate_15" << Snapshot.Rate15; +} + +void +EmitSnapshot(const HistogramSnapshot& Snapshot, CbObjectWriter& Cbo) +{ + Cbo << "t_count" << Snapshot.Count << "t_avg" << Snapshot.Avg; + Cbo << "t_min" << Snapshot.Min << "t_max" << Snapshot.Max; + Cbo << "t_p75" << Snapshot.P75 << "t_p95" << Snapshot.P95 << "t_p99" << Snapshot.P999; +} + +void +EmitSnapshot(std::string_view Tag, const StatsSnapshot& Snapshot, CbObjectWriter& Cbo) +{ + Cbo.BeginObject(Tag); + EmitSnapshot(Snapshot.Meter, Cbo); + EmitSnapshot(Snapshot.Histogram, Cbo); + Cbo.EndObject(); +} + +void +EmitSnapshot(std::string_view Tag, const RequestStatsSnapshot& Snapshot, CbObjectWriter& Cbo) +{ + if (Snapshot.Requests.Meter.Count == 0) + { + return; + } + Cbo.BeginObject(Tag); + EmitSnapshot("request", Snapshot.Requests, Cbo); + EmitSnapshot("bytes", Snapshot.Bytes, Cbo); + Cbo.EndObject(); +} + ////////////////////////////////////////////////////////////////////////// #if ZEN_WITH_TESTS |