aboutsummaryrefslogtreecommitdiff
path: root/zencore/stats.cpp
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2021-09-30 14:44:32 +0200
committerStefan Boberg <[email protected]>2021-09-30 14:44:32 +0200
commitdda5004708497e54bca99d72cf707ba63b6d7fb6 (patch)
tree2fd5a08f23b005a7831899ea718cf6d4e95267cd /zencore/stats.cpp
parentMerge branch 'main' of https://github.com/EpicGames/zen (diff)
downloadzen-dda5004708497e54bca99d72cf707ba63b6d7fb6.tar.xz
zen-dda5004708497e54bca99d72cf707ba63b6d7fb6.zip
metrics: added OperationTiming which is a useful combination of a Meter and a Histogram, intended to track frequency and duration of certain operations
Diffstat (limited to 'zencore/stats.cpp')
-rw-r--r--zencore/stats.cpp72
1 files changed, 72 insertions, 0 deletions
diff --git a/zencore/stats.cpp b/zencore/stats.cpp
index 53086f3ec..34dc2828f 100644
--- a/zencore/stats.cpp
+++ b/zencore/stats.cpp
@@ -353,6 +353,78 @@ SampleSnapshot::GetValues() const
//////////////////////////////////////////////////////////////////////////
+OperationTiming::OperationTiming(int32_t SampleCount) : m_Histogram{SampleCount}
+{
+}
+
+OperationTiming::~OperationTiming()
+{
+}
+
+void
+OperationTiming::Update(int64_t Duration)
+{
+ m_Meter.Mark(1);
+ m_Histogram.Update(Duration);
+}
+
+int64_t
+OperationTiming::Max() const
+{
+ return m_Histogram.Max();
+}
+
+int64_t
+OperationTiming::Min() const
+{
+ return m_Histogram.Min();
+}
+
+double
+OperationTiming::Mean() const
+{
+ return m_Histogram.Mean();
+}
+
+uint64_t
+OperationTiming::Count() const
+{
+ return m_Meter.Count();
+}
+
+OperationTiming::Scope::Scope(OperationTiming& Outer) : m_Outer(Outer), m_StartTick(GetHifreqTimerValue())
+{
+}
+
+OperationTiming::Scope::~Scope()
+{
+ m_Outer.Update(GetHifreqTimerValue() - m_StartTick);
+}
+
+//////////////////////////////////////////////////////////////////////////
+
+void
+EmitSnapshot(std::string_view Tag, OperationTiming& Stat, CbObjectWriter& Cbo)
+{
+ Cbo.BeginObject(Tag);
+
+ SampleSnapshot Snap = Stat.Snapshot();
+
+ Cbo << "count" << Stat.Count();
+
+ Cbo << "rate_mean" << Stat.MeanRate();
+ Cbo << "rate_1" << Stat.Rate1() << "rate_5" << Stat.Rate5() << "rate_15" << Stat.Rate15();
+
+ const double ToSeconds = GetHifreqTimerToSeconds();
+
+ Cbo << "t_avg" << Stat.Mean() * ToSeconds;
+ Cbo << "t_min" << Stat.Min() * ToSeconds << "t_max" << Stat.Max() * ToSeconds;
+ Cbo << "t_p75" << Snap.Get75Percentile() * ToSeconds << "t_p95" << Snap.Get95Percentile() * ToSeconds << "t_p99"
+ << Snap.Get99Percentile() * ToSeconds << "t_p999" << Snap.Get999Percentile() * ToSeconds;
+
+ Cbo.EndObject();
+}
+
void
EmitSnapshot(std::string_view Tag, const Histogram& Stat, CbObjectWriter& Cbo)
{