# Runbook — Pic de Trafic / Surcharge **Alerte :** `VeylantHighLatencyP99` ou `VeylantHighErrorRate` + taux de requêtes anormalement élevé **SLA impact :** Dégradation des performances, potentiellement interruptions **Temps de résolution cible :** < 10 minutes (HPA automatique), < 5 min si intervention manuelle --- ## Symptômes - Alerte `VeylantHighLatencyP99` : p99 > 500ms pendant > 5 min - Alerte `VeylantHighErrorRate` : error rate > 5% - Dashboard Grafana : RPS brutal augmentation, p99 qui monte - Logs : `"rate limit exceeded"` massif pour une tenant, ou requests en queue --- ## Diagnostic ### 1. Évaluer l'ampleur du pic ```bash # RPS actuel vs baseline curl -s "http://prometheus:9090/api/v1/query" \ --data-urlencode 'query=sum(rate(veylant_requests_total[1m]))' | \ jq '.data.result[0].value[1]' # Identifier le tenant / provider qui drive le trafic curl -s "http://prometheus:9090/api/v1/query" \ --data-urlencode 'query=topk(5, sum by (tenant_id) (rate(veylant_requests_total[1m])))' | \ jq '.data.result[] | {tenant: .metric.tenant_id, rps: .value[1]}' # État HPA kubectl get hpa -n veylant kubectl describe hpa veylant-proxy -n veylant ``` ### 2. Vérifier si le HPA scale ```bash # Vérifier le scaling automatique en cours kubectl get hpa veylant-proxy -n veylant -w # Pods actuels kubectl get pods -n veylant -l app.kubernetes.io/name=veylant-proxy # Events HPA kubectl describe hpa veylant-proxy -n veylant | grep -A10 "Events:" ``` ### 3. Vérifier l'état des providers upstream ```bash # Latence upstream par provider kubectl logs -n veylant deploy/veylant-proxy-blue --since=5m | \ grep "upstream_duration" | \ awk '{sum+=$NF; count++} END {print "avg:", sum/count, "ms"}' ``` --- ## Remédiation ### A — HPA automatique (cas normal) Si le HPA est configuré et que les pods scalent : ```bash # Observer le scaling (attendre 30-60 secondes) kubectl get hpa veylant-proxy -n veylant -w # Surveiller les nouveaux pods qui deviennent Ready kubectl get pods -n veylant -l app.kubernetes.io/name=veylant-proxy -w ``` Si le scaling prend > 5 minutes → **forcer le scale manuel (Option B)**. ### B — Scale manuel d'urgence ```bash # Scale immédiat sans attendre l'HPA kubectl scale deployment veylant-proxy-blue -n veylant --replicas=10 # Vérifier que les pods démarrent kubectl rollout status deployment/veylant-proxy-blue -n veylant echo "Scaled to 10 replicas — monitor for 2 minutes" ``` ### C — Activer le rate limiting agressif temporaire Si un seul tenant consomme la majorité du trafic : ```bash # Identifier le tenant abusif ABUSIVE_TENANT=$(kubectl logs -n veylant deploy/veylant-proxy-blue --since=5m | \ grep "rate_limit" | grep -oP 'tenant_id=[^ ]+' | sort | uniq -c | sort -rn | head -1) echo "Abusive tenant: $ABUSIVE_TENANT" # Réduire temporairement la limite du tenant via l'API admin curl -sf -X PATCH \ -H "Authorization: Bearer $ADMIN_TOKEN" \ -H "Content-Type: application/json" \ -d '{"requests_per_minute": 10}' \ "https://api.veylant.ai/v1/admin/tenants/$TENANT_ID/rate-limit" echo "Rate limit réduit à 10 req/min pour $TENANT_ID" ``` ### D — Circuit breaker manuel (trafic trop élevé pour les providers) ```bash # Activer temporairement la réponse cached / dégradée # (feature flag maintenance-mode) curl -sf -X PATCH \ -H "Authorization: Bearer $ADMIN_TOKEN" \ -H "Content-Type: application/json" \ -d '{"enabled": true, "message": "Service en charge élevée. Réessayez dans quelques minutes."}' \ https://api.veylant.ai/v1/admin/flags/maintenance-mode # Désactiver une fois le trafic revenu à la normale curl -sf -X PATCH \ -H "Authorization: Bearer $ADMIN_TOKEN" \ -H "Content-Type: application/json" \ -d '{"enabled": false}' \ https://api.veylant.ai/v1/admin/flags/maintenance-mode ``` ### E — Retour à l'état normal ```bash # Une fois le trafic normalisé, remettre le HPA en contrôle kubectl patch hpa veylant-proxy -n veylant \ --type=merge \ -p '{"spec":{"minReplicas":3,"maxReplicas":15}}' # Le HPA réduira le nombre de pods progressivement echo "HPA reprend le contrôle — stabilisation en 5-10 min" ``` --- ## Prévention - HPA configuré avec `maxReplicas: 15` et scale-up rapide (100% en 60s) - Rate limiting per-tenant activé (DB overrides disponibles) - Circuit breaker activé avec threshold=5 failures / 60s window - k6 smoke test en CI pour détecter les régressions de performance --- ## Post-mortem Template ```markdown ## Post-mortem — Traffic Spike [DATE] **Pic observé :** [X RPS vs baseline Y RPS] **Durée d'impact :** [X minutes p99 > 500ms] **Cause :** [Charge légitime / Tenant abusif / DDoS / Bug client] ### Timeline - HH:MM — Alerte HighLatencyP99 reçue - HH:MM — Diagnostic : [cause identifiée] - HH:MM — Action : [Scale manuel / Rate limit / Maintenance mode] - HH:MM — Retour à la normale ### Root Cause [Description] ### Actions correctives - [ ] Revoir les limites HPA maxReplicas si insuffisant - [ ] Ajouter rate limit global cross-tenant si nécessaire - [ ] Communication avec le tenant si abus constaté ```