Шторм вебхук-ретраев
Большинство платформ ретраят failing-вебхуки час-сутки. Если вы пропустите этот период — событие потеряется навсегда. Простой счётчик повторов:
import os, time, requests, collections
W = collections.defaultdict(list) # delivery-id → [timestamps]
@app.post("/hook/<provider>")def hook(provider, request): delivery_id = request.headers.get("X-GitHub-Delivery") or \ request.headers.get("Stripe-Delivery-Id") or \ request.headers.get("X-Hook-Id") if delivery_id: W[delivery_id].append(time.time()) if len(W[delivery_id]) >= 3: push(f"🌪️ Webhook retry storm: {provider}", f"Delivery {delivery_id} получен {len(W[delivery_id])}× за " f"{int(time.time()-W[delivery_id][0])} сек", priority=8) process(provider, request.json)
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)Прямо в Notifly есть вебхуки — заведите dynamic-webhook в роли «прокси»: внешний сервис шлёт ему, он транслирует в push и одновременно фиксирует delivery-id.