feat: add quantiles() method to LatencyTracker for OpenMetrics
Returns {count, sum, 0.5, 0.95, 0.99} in seconds for Prometheus
summary exposition. Companion to the existing stats() (milliseconds).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -67,6 +67,23 @@ class LatencyTracker:
|
|||||||
"p99": round(ms[min(int(n * 0.99), n - 1)], 1),
|
"p99": round(ms[min(int(n * 0.99), n - 1)], 1),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def quantiles(self) -> dict | None:
|
||||||
|
"""Return ``{count, sum, 0.5, 0.95, 0.99}`` in seconds, or None.
|
||||||
|
|
||||||
|
Designed for Prometheus/OpenMetrics summary exposition.
|
||||||
|
"""
|
||||||
|
n = len(self._samples)
|
||||||
|
if n == 0:
|
||||||
|
return None
|
||||||
|
s = sorted(self._samples)
|
||||||
|
return {
|
||||||
|
"count": n,
|
||||||
|
"sum": sum(s),
|
||||||
|
"0.5": s[int(n * 0.50)],
|
||||||
|
"0.95": s[min(int(n * 0.95), n - 1)],
|
||||||
|
"0.99": s[min(int(n * 0.99), n - 1)],
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class Metrics:
|
class Metrics:
|
||||||
"""Connection metrics.
|
"""Connection metrics.
|
||||||
|
|||||||
@@ -52,6 +52,23 @@ class TestLatencyTracker:
|
|||||||
assert s["min"] == 500.0
|
assert s["min"] == 500.0
|
||||||
assert s["max"] == 500.0
|
assert s["max"] == 500.0
|
||||||
|
|
||||||
|
def test_quantiles_empty(self):
|
||||||
|
lt = LatencyTracker()
|
||||||
|
assert lt.quantiles() is None
|
||||||
|
|
||||||
|
def test_quantiles_seconds(self):
|
||||||
|
lt = LatencyTracker()
|
||||||
|
for i in range(1, 101):
|
||||||
|
lt.record(i / 1000)
|
||||||
|
q = lt.quantiles()
|
||||||
|
assert q is not None
|
||||||
|
assert q["count"] == 100
|
||||||
|
assert 0.050 <= q["0.5"] <= 0.052
|
||||||
|
assert 0.095 <= q["0.95"] <= 0.097
|
||||||
|
assert 0.099 <= q["0.99"] <= 0.101
|
||||||
|
assert "sum" in q
|
||||||
|
assert q["sum"] > 0
|
||||||
|
|
||||||
|
|
||||||
# -- RateTracker -------------------------------------------------------------
|
# -- RateTracker -------------------------------------------------------------
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user