diff --git a/codex/utils/statsummary.nim b/codex/utils/statsummary.nim new file mode 100644 index 00000000..df4729bd --- /dev/null +++ b/codex/utils/statsummary.nim @@ -0,0 +1,45 @@ +import pkg/metrics + +when defined(metrics): + type StatSummary* = ref object of Collector + min: float64 + max: float64 + ravg: float64 + + method collect(st: StatSummary, output: MetricHandler) = + let timestamp = st.now() + output( + name = st.name & "_min", + value = st.min, + timestamp = timestamp + ) + output( + name = st.name & "_max", + value = st.max, + timestamp = timestamp + ) + output( + name = st.name & "_ravg", + value = st.ravg, + timestamp = timestamp + ) + +proc declareStatSummary*(name: string, help: string = ""): StatSummary = + when defined(metrics): + result = StatSummary.newCollector(name, help) + result.min = high(float64) + result.max = low(float64) + else: + return IgnoredCollector + +proc observeStatSummary(st: StatSummary, value: float64) = + if value < st.min: + st.min = value + if value > st.max: + st.max = value + st.ravg = (st.ravg + value) / 2.0 + +template observe*(statSummary: StatSummary | type IgnoredCollector, amount: int64 | float64 = 1) = + when defined(metrics) and statSummary is not IgnoredCollector: + {.gcsafe.}: + observeStatSummary(statSummary, amount.float64)