aboutsummaryrefslogtreecommitdiff
path: root/src/zencore
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2023-09-28 23:57:31 +0200
committerGitHub <[email protected]>2023-09-28 23:57:31 +0200
commitbf20e4c8e63638792e69098d4d9810c1136ff627 (patch)
treefee82fc0d15910902a4a3c24a5564867748b6419 /src/zencore
parentadded more context to http response error message (#430) (diff)
downloadzen-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.h64
-rw-r--r--src/zencore/stats.cpp72
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