1. Alerter sur les symptômes #
Ce qui gêne l'utilisateur, pas chaque cause possible.
Symptômes et causes #
| Alerte sur une cause | Alerte sur un symptôme |
|---|---|
| CPU à 90 % | Latence p99 au-dessus de l'objectif |
| Un pod redémarre | Taux d'erreurs 5xx supérieur à 2 % |
| Disque à 80 % | Disque plein dans moins de 4 h (prédiction) |
Une alerte doit être actionnable : si personne n'a rien à faire en la recevant, c'est un indicateur de dashboard, pas une alerte. Chaque alerte inutile entraîne la fatigue d'alerte : les équipes finissent par ignorer aussi les vraies.
- alert: DiskWillFillIn4Hours
expr: predict_linear(node_filesystem_avail_bytes{fstype!="tmpfs"}[6h], 4*3600) < 0
for: 30m
labels: { severity: warning }
annotations:
summary: "Le disque {{ $labels.mountpoint }} de {{ $labels.instance }} sera plein dans 4 h" 2. Labels et annotations #
Ce dont le routage et l'humain ont besoin.
Conventions #
| Élément | Usage | Exemple |
|---|---|---|
severity | Urgence : critical (réveille), warning (heures ouvrées), info | critical |
team | Équipe destinataire, utilisée par le routage | paiement |
summary | Une phrase lisible sur un téléphone | API paiement : 8 % d'erreurs |
description | Détails, valeurs | {{ $value | humanizePercentage }} |
runbook_url | Procédure de diagnostic et de résolution | lien wiki |
dashboard_url | Dashboard de contexte | lien Grafana |
Erreur Courante : Ne mettez jamais de valeur changeante ({{ $value }}) dans les labels : chaque nouvelle valeur créerait une nouvelle alerte. Les valeurs vont dans les annotations.3. Tester ses règles #
promtool test rules.
Tests unitaires #
promtool rejoue des séries simulées et vérifie quelles alertes se déclenchent, à quel moment et avec quels labels :
# tests.yml
rule_files: [rules.yml]
evaluation_interval: 1m
tests:
- interval: 1m
input_series:
- series: 'up{job="api", instance="api-1"}'
values: '1 1 0 0 0 0 0 0'
alert_rule_test:
- eval_time: 4m # 2 min de panne : encore pending
alertname: InstanceDown
exp_alerts: []
- eval_time: 8m # 6 min de panne : firing
alertname: InstanceDown
exp_alerts:
- exp_labels: { severity: critical, team: plateforme, job: api, instance: api-1 }
exp_annotations:
summary: "api-1 ne répond plus"
runbook_url: https://wiki.example.org/runbooks/instance-downpromtool check rules rules.yml
promtool test rules tests.ymlBonne Pratique : Ajoutez ces deux commandes à la CI du dépôt des règles : une règle qui ne se déclenche jamais est aussi dangereuse qu'une règle cassée.
