Превышение SLO p95
Соло-разработчик не строит дашборд с burn-rate, но умеет считать p95
из последних N запросов. Этого почти всегда достаточно.
import os, time, statistics, requests
W = [] # окноSLO_MS = 1500WINDOW = 200
def observe(latency_ms: float): W.append(latency_ms) if len(W) > WINDOW: W.pop(0) if len(W) == WINDOW: p95 = statistics.quantiles(W, n=20)[18] if p95 > SLO_MS: push("📉 SLO breach: p95", f"p95 = {int(p95)} мс (SLO: {SLO_MS})\n" f"max = {int(max(W))} мс median = {int(statistics.median(W))} мс", priority=8)
def push(t, m, p): requests.post(f"{os.environ['NOTIFLY_URL']}/message", params={"token": os.environ["NOTIFLY_TOKEN"]}, json={"title": t, "message": m, "priority": p}, timeout=5)В проде окно лучше держать в Redis (LPUSH/LTRIM), чтобы все инстансы
видели общий sliding window.
Дополнительно — отдельный SLO на error-rate:
if errors / total > 0.05: push("📉 SLO breach: errors", f"{errors}/{total} ошибок", 9)