Перейти к содержимому

Превышение SLO p95

Соло-разработчик не строит дашборд с burn-rate, но умеет считать p95 из последних N запросов. Этого почти всегда достаточно.

import os, time, statistics, requests
W = [] # окно
SLO_MS = 1500
WINDOW = 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)