Ошибки в канарейке деплоя
Канареечный деплой — самый дешёвый способ ловить регрессии. Условие «5xx у canary > 1% при стабильном baseline» прекрасно укладывается в push:
import os, time, statistics, requests
W = "/tmp/canary.json"
def observe(version: str, status: int): import json s = (json.load(open(W)) if os.path.exists(W) else {}) g = s.setdefault(version, {"ok":0, "err":0}) if status >= 500: g["err"] += 1 else: g["ok"] += 1 json.dump(s, open(W, "w"))
if (g["ok"] + g["err"]) > 200: rate = g["err"] / (g["ok"] + g["err"]) baseline = 0.001 # пусть 0.1% if rate > max(baseline * 5, 0.01): push("🐤 Canary error-rate", f"{version}: {int(rate*100)}% (baseline {baseline*100:.2f}%)\n" f"Окно: {g['ok']+g['err']} req\n\n" "Откатить деплой?", priority=10)
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)В push можно положить ссылку через WebScript, которая вызовет ваш rollback-эндпоинт — получится «откат с телефона».
Связанные рецепты
Заголовок раздела «Связанные рецепты»- Уведомления о деплое — общий деплой-flow.
- Human-in-the-loop — кнопка «откатить».