Création d'alertes log
Créer une alerte est un problème de mesure, pas de devinage. Tu n'essaies pas d'être exhaustif — tu essaies de trouver des seuils qui se déclenchent 0–3 fois par semaine sur les vrais patterns de production, sur les services qui comptent.
Quand utiliser cette compétence
- L'utilisateur demande de « configurer des alertes » / « suggérer des alertes » pour son projet.
- L'utilisateur veut évaluer si un service produit un signal d'alerte.
- L'utilisateur vient d'activer les alertes log et veut un ensemble de démarrage.
Quand ne pas utiliser cette compétence
- Affiner une alerte qui existe déjà — c'est un travail différent (utilise
posthog:logs-alerts-events-listpour inspecter la cadence de déclenchement/résolution etposthog:logs-alerts-partial-updatepour ajuster). - Enquêter sur un incident en cours — extrais des lignes avec
posthog:query-logs, ne crée pas une alerte en plein incident.
Outils
| Outil | Tâche | Où cela s'inscrit |
|---|---|---|
posthog:logs-services |
Top-25 services dans la fenêtre avec log_count, error_count, error_rate, sparkline. | Étape 1 — triage. |
posthog:logs-attributes-list / posthog:logs-attribute-values-list |
Découvrir les clés/valeurs pour des filtres plus étroits. | Étape 2, optionnel. |
posthog:logs-count-ranges |
Counts découpés temporellement adaptatifs pour un filtre. | Étape 3 — baseline. |
posthog:logs-alerts-simulate-create |
Rejouer une config brouillon sur l'historique -7d avec machine d'état complète. |
Étape 4 — valider. |
posthog:logs-alerts-create |
Persister l'alerte. | Étape 5 — ship. |
posthog:logs-alerts-destinations-create |
Connecter l'alerte à Slack ou webhook. | Étape 5 — ship. |
Ne pas appeler posthog:query-logs pendant la création. Tu as besoin de distributions, pas de lignes. Réserve posthog:query-logs à la toute fin si l'utilisateur demande « montre-moi un exemple de ce qui se serait déclenché » — limit: 10 est largement suffisant.
Flux de travail
1. Triage — sélectionner les services candidats
Appelle posthog:logs-services pour les 24h dernières sans filtres. La réponse est plafonnée à 25 services et inclut une sparkline, donc elle est petite et bornée.
Un service est un candidat quand les deux sont vrais :
log_countest non-trivial (≥ ~1k en 24h — les services plus calmes produisent trop peu de signal pour être alertés).error_rateest non-zéro, ou l'utilisateur a nommé le service explicitement.
Saute les services avec haut volume mais error_rate == 0 sauf si l'utilisateur veut une alerte sur la forme du volume (p. ex. « avertis-moi si api-gateway arrête soudainement de produire des logs »). Les alertes volume-plancher utilisent threshold_operator: below et ont besoin d'un raisonnement différent — voir references/volume-floor-alerts.md.
Si l'utilisateur nomme un service, traite-le comme candidat même sans signal d'erreur.
2. (Optionnel) Affiner le filtre
Si un service a de nombreux sous-types d'erreurs, une alerte sur « toutes les erreurs » est généralement trop large. Utilise posthog:logs-attributes-list (essaie attribute_type: log) et posthog:logs-attribute-values-list pour trouver un discriminateur — les courants sont http.status_code, error.type, k8s.container.name. Ajoute le filtre d'affinement à ton brouillon.
Garde-le simple : un filtre de sévérité + un ou deux filtres d'attribut, c'est amplement. Les filtres multi-clauses sont plus difficiles à raisonner et n'améliorent rarement la précision.
3. Baseline — caractériser le candidat sur 7 jours
Appelle posthog:logs-count-ranges avec les filtres du candidat, dateRange: { date_from: "-7d" }, et targetBuckets: 24 (un bucket ≈ 7h). La réponse te donne les counts par bucket.
N'évalue pas les percentiles à vue d'œil ou n'ajuste pas le seuil à la fenêtre d'alerte manuellement. Fais passer la réponse count-ranges dans le script helper :
echo '<count-ranges JSON>' | python3 scripts/baseline_stats.py --window-minutes 5
Le script retourne :
{
"n_buckets": 12,
"bucket_minutes": 420.0,
"alert_window_minutes": 5,
"stats": { "p50": 12.0, "p95": 71.25, "p99": 126.25, "max": 140 },
"suggested_threshold_count": 5,
"rationale": "max(p99=126.25, median*3=36.0, floor=5) scaled from 420m bucket to 5m window",
"health": []
}
Utilise suggested_threshold_count comme seuil de démarrage. Lis health :
Drapeau health |
Ce que cela signifie | Quoi faire |
|---|---|---|
sparse:N_of_M_buckets |
Trop peu de buckets non-vides pour une baseline 7d. | Élargis le filtre, étends à -30d, ou saute. |
empty |
Tous les buckets sont zéro. | Saute — aucun signal. |
spiky |
max est 10× ou plus p95. |
Les alertes sur seuil de count fonctionnent bien. Procède. |
flat |
p95 ≈ p50. |
Sois prudent — soit aucun incident dans le lookback, soit la métrique est trop lisse. Essaie un lookback plus long ou saute. |
[] (vide) |
Distribution saine. | Procède. |
4. Brouillon et simulation
Choisis un brouillon de démarrage parmi ces valeurs par défaut — voir references/threshold-defaults.md pour le raisonnement :
| Paramètre | Par défaut | Notes |
|---|---|---|
threshold_count |
suggested_threshold_count du script |
Déjà mis à l'échelle pour la fenêtre d'alerte. |
threshold_operator |
above |
Utilise below seulement pour les alertes volume-plancher. |
window_minutes |
5 |
Autorisé : 5, 10, 15, 30, 60. Doit correspondre à ce que tu as passé au script. |
evaluation_periods |
3 |
M en N-de-M. |
datapoints_to_alarm |
2 |
N en N-de-M. 2-de-3 réduit le flottement d'un seul bucket bruyant. |
cooldown_minutes |
30 |
Temps minimum entre les déclenchements répétés. |
Appelle posthog:logs-alerts-simulate-create avec ces paramètres et date_from: "-7d". La réponse te donne fire_count et resolve_count.
5. Itérer — trois rounds, puis ship ou saute
Cible : fire_count entre 0 et ~3 sur -7d. Si en dehors de la bande :
| Résultat | Ajustement |
|---|---|
fire_count = 0 sur 7d et la baseline était spiky |
Baisse threshold_count vers stats.p95 du script, ou descends à 1-de-2. |
fire_count = 0 et la baseline était flat |
Le service n'a pas de signal d'alerte. Saute-le ; log pourquoi. |
fire_count > 5 |
Lève threshold_count vers stats.max du script, ou passe à 3-de-5 pour une fenêtre plus lisse. |
fire_count est ok mais resolve_count ne correspond jamais à fire_count |
Le cooldown est trop long, ou l'état sous-jacent est genuinely sticky. Acceptable pour l'instant. |
Quand tu ajustes le seuil, lis les valeurs du bloc stats du script — ne recalcule jamais les percentiles à la main.
Limite l'itération à 3 appels simulate par candidat. Si tu ne peux pas arriver dans la bande en 3 rounds, la métrique est mauvaise — soit le filtre est trop large, soit la fenêtre est mauvaise, soit le service n'a genuinely pas de signal en forme de seuil. Note-le et passe au suivant.
6. Ship — créer + attacher destination
Une fois qu'un brouillon simule proprement :
- Appelle
posthog:logs-alerts-createavec la config validée. Utilise un nom comme<service> error rate (auto)afin que l'utilisateur puisse voir d'un coup d'œil quelles alertes venaient de cette compétence. - Appelle
posthog:logs-alerts-destinations-createpour la connecter à une cible de notification. Une alerte sans destination est silencieuse. Confirme toujours le nom du canal ou l'URL du webhook avec l'utilisateur avant d'attacher — ne connecte jamais une alerte auto-générée à un canal production sans confirmation explicite. Si l'utilisateur n'est pas sûr, suggère un canal de test à faible trafic pour les premières alertes.
Si l'utilisateur veut des alertes créées en état enabled: false pour review-puis-flip, passe enabled: false à -create et dis-lui combien de brouillons tu as produits.
Forme du filtre — requise
Le champ filters sur posthog:logs-alerts-create prend un sous-ensemble de LogsViewerFilters et doit contenir au moins un de :
severityLevels— liste de["trace","debug","info","warn","error","fatal"]serviceNames— liste de chaînes de noms de servicefilterGroup— groupe de filtre de propriété
La même forme va dans le champ filters de posthog:logs-alerts-simulate-create. Fais correspondre exactement les filtres de simulation aux filtres d'alerte — sinon la simulation teste une alerte différente de celle que tu ships.
Exemple minimum :
{
"severityLevels": ["error", "fatal"],
"serviceNames": ["api-gateway"]
}
Règles d'économie de token
- Un appel
posthog:logs-servicesau démarrage, pas par candidat. - Un appel
posthog:logs-count-rangespar candidat àtargetBuckets: 24. Ne dépasse pas 30 pendant la création. - ≤ 3 appels
posthog:logs-alerts-simulate-createpar candidat. - Zéro appel
posthog:query-logspendant la boucle de création. - Préfère rapporter un petit ensemble d'alertes bien validées à une longue liste de brouillons non validés.
Output
Rapporte ce que tu as fait, dans cette forme :
- Pour chaque alerte shipped : nom, filtres, seuil, fire_count simulé sur 7d, destination.
- Pour chaque candidat sauté : nom du service + pourquoi (baseline flat, ne peut pas arriver au seuil, bas volume).
- Total d'appels simulate faits, total d'alertes créées.
L'utilisateur devrait pouvoir lire cela et décider de désactiver des brouillons avant qu'ils ne deviennent live.