Infrastructure

Azure Monitor : diagnostiquer un Action Group avant de couper les alertes

Un runbook de production pour qualifier un Action Group Azure Monitor en séparant règles, canaux, webhooks, escalades, preuves KQL, validation et rollback avant de réduire les notifications.

17 juil. 2026 azureazure-monitoraction-groupobservabilityalertsincidentkqlwebhookrunbookrollbackproduction

Quand une équipe reçoit trop d’alertes, le réflexe le plus rapide est souvent de désactiver l’Action Group, de retirer un destinataire ou de couper le webhook qui réveille l’astreinte. C’est compréhensible pendant un incident, mais c’est aussi une manière très efficace de perdre le seul signal encore exploitable.

Le cas d’usage est une plateforme Azure où plusieurs règles Azure Monitor partagent un Action Group : mail, Teams, webhook ITSM, Logic App, automation ou connecteur d’incident. Une vague d’alertes arrive, certaines notifications ne partent plus, d’autres doublonnent, et l’équipe ne sait plus si le problème est la règle, le canal, le routage d’escalade ou le service surveillé. L’objectif du runbook est de décider quoi modifier, quoi conserver et comment revenir en arrière sans rendre l’incident invisible.

Geler le contrat de notification

Avant de toucher à l’Action Group, écrivez ce qu’il est censé faire. Un Action Group n’est pas seulement une liste d’e-mails. C’est un contrat d’exploitation : quelles règles l’appellent, quels canaux sont critiques, qui reçoit quoi, quels webhooks créent des tickets et quelles notifications peuvent être temporairement ralenties.

yaml action-group-contract.yml
action_group:
name: ag-prod-critical
scope: production platform alerts
owner: platform-operations

critical_channels:
- type: webhook
  target: incident-management
  purpose: create_or_update_incident
- type: sms_or_voice
  target: on-call-primary
  purpose: wake_up_for_sev1

secondary_channels:
- type: email
  target: platform-watch
  purpose: context_and_followup
- type: teams
  target: operations-channel
  purpose: shared_visibility

change_rules:
require_ticket: true
maximum_silence: 30m
preserve_one_user_impact_signal: true
rollback_owner: incident-commander

Si ce contrat n’existe pas, commencez par le reconstruire depuis la configuration réelle. La modification sera sinon jugée à l’impression du moment : “trop de bruit”, “pas assez d’alertes”, “le webhook a l’air cassé”.

Cartographier les règles qui appellent le groupe

Un Action Group bruyant n’est pas toujours le problème. Il peut simplement relayer correctement une règle trop large, une dimension mal choisie ou un seuil devenu obsolète après un changement de trafic. Listez les règles qui l’utilisent avant de modifier le groupe lui-même.

bash 01-list-action-group-users.sh
ACTION_GROUP_ID="/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg-monitoring/providers/microsoft.insights/actionGroups/ag-prod-critical"

az monitor metrics alert list --query "[?contains(to_string(actions), '$ACTION_GROUP_ID')].{name:name,resourceGroup:resourceGroup,enabled:enabled,severity:severity,scopes:scopes}" --output table

az monitor scheduled-query list --query "[?contains(to_string(actions), '$ACTION_GROUP_ID')].{name:name,resourceGroup:resourceGroup,enabled:enabled,severity:severity,scopes:scopes}" --output table

La sortie doit permettre de répondre à trois questions : quelles règles sont réellement connectées, lesquelles sont critiques pour l’impact utilisateur, et lesquelles peuvent être ajustées sans masquer un incident de production.

Séparer panne de canal et bruit de règle

Ne confondez pas un canal cassé avec une règle bruyante. Si le webhook ITSM ne crée plus de ticket, couper la règle ne résout rien. Si la règle génère mille événements valides mais inutilisables, changer le webhook ne réduit pas le bruit.

text notification-diagnostic-matrix.txt
Symptome: beaucoup de notifications, tickets coherents
Hypothese principale: regle trop large, dimension bruyante ou seuil obsolete
Action candidate: ajuster la regle, pas l'Action Group entier

Symptome: alertes visibles dans Azure Monitor, aucune notification externe
Hypothese principale: canal, webhook, receiver desactive ou erreur d'integration
Action candidate: tester le receiver et garder la regle active

Symptome: notifications en double sur plusieurs canaux
Hypothese principale: plusieurs regles ou plusieurs receivers pour le meme symptome
Action candidate: dedoublonner l'escalade, pas supprimer le signal

Symptome: notification tardive apres resolution
Hypothese principale: fenetre d'evaluation, frequence, latence webhook ou backlog ITSM
Action candidate: qualifier la latence avant de changer la severite

Cette matrice évite une erreur classique : désactiver le groupe complet alors qu’une seule règle ou un seul receiver pose problème.

Lire les preuves d’alerte avant silence

Azure Monitor doit montrer quelles règles tirent, quand, sur quelles ressources et avec quelle sévérité. Gardez une preuve avant tout silence, même temporaire.

kusto 02-action-group-alert-evidence.kql
let StartTime = datetime(2026-07-17T08:00:00Z);
let EndTime = datetime(2026-07-17T09:00:00Z);
AlertsManagementResources
| where todatetime(properties.essentials.startDateTime) between (StartTime .. EndTime)
| extend alertRule = tostring(properties.essentials.alertRule)
| extend severity = tostring(properties.essentials.severity)
| extend monitorCondition = tostring(properties.essentials.monitorCondition)
| extend target = tostring(properties.essentials.targetResource)
| extend targetType = tostring(properties.essentials.targetResourceType)
| summarize fired=count(),
          firstSeen=min(todatetime(properties.essentials.startDateTime)),
          lastSeen=max(todatetime(properties.essentials.startDateTime)),
          targets=dcount(target),
          sampleTargets=make_set(target, 5)
by alertRule, severity, monitorCondition, targetType
| order by fired desc

La requête ne prouve pas que l’Action Group a notifié, mais elle prouve la pression exercée par les règles. C’est la base pour décider si la réduction doit porter sur la règle, le receiver, le canal d’escalade ou le service surveillé.

Tester chaque receiver comme une dépendance de production

Un receiver webhook ou Logic App est une dépendance. Il peut avoir son propre secret, son IP attendue, son throttling, son format de payload et ses erreurs. Traitez-le comme une intégration de production, pas comme un simple champ de configuration.

text receiver-validation-checks.txt
Verifier par receiver
Receiver active dans l'Action Group
Nom et destination attendus
Dernier changement de configuration
Secret, token ou endpoint encore valide
Reponse du webhook ou connecteur d'incident
Correlation entre alerte Azure et ticket externe
Comportement en cas de duplicate ou resolved alert

Bloquer la desactivation globale quand
Un seul receiver echoue
Les alertes critiques continuent d'etre justes
L'integration externe throttle mais finit par accepter
Aucun test de retour n'a ete prepare

Pour un webhook, rejouez avec une alerte de test ou une règle non critique. Pour un canal humain, vérifiez la réception réelle avec une personne d’astreinte, pas seulement l’état “enabled” dans Azure.

Réduire le bruit sans rendre l’incident muet

La bonne réduction est bornée, documentée et réversible. Elle garde au moins un signal d’impact utilisateur et évite de modifier plusieurs couches à la fois.

yaml controlled-silence-plan.yml
silence_plan:
incident: INC-20260717-014
action_group: ag-prod-critical
reason: notification storm from one non-user-impact rule
start: 2026-07-17T08:40:00Z
end: 2026-07-17T09:10:00Z

changes:
- target: rule
  name: queue-depth-warning
  action: disable_notification_only_or_snooze
  keep_metrics: true
- target: action_group
  name: ag-prod-critical
  action: keep_critical_webhook_and_oncall_enabled

preserved_signals:
- api_5xx_rate_sev2
- customer_login_failure_sev1

rollback:
owner: incident-commander
condition: end_time_reached_or_user_impact_confirmed
expected_state: all_critical_receivers_enabled

Si l’outil ne permet pas de suspendre proprement un receiver ou une règle, conservez l’état précédent dans le ticket et prévoyez la commande de retour avant d’appliquer la modification.

Valider le retour du signal

La fin d’un silence est un test de production. Ne vous contentez pas de réactiver la configuration. Vérifiez que le signal repart au bon endroit, avec le bon niveau et sans doublon.

text signal-return-validation.txt
Validation apres retour
La regle critique declenche toujours dans Azure Monitor
L'Action Group appelle le receiver attendu
Le webhook cree ou met a jour le bon incident
Le canal humain recoit une seule notification exploitable
Les notifications resolues ne rouvrent pas un incident clos
Le ticket contient preuve avant, changement, preuve apres et rollback

Cette validation doit être exécutée avec un signal contrôlé ou une alerte non destructive. L’objectif n’est pas de provoquer une panne, mais de prouver que la chaîne notificationnelle est revenue dans un état opérable.

Décider : corriger la règle, réparer le receiver ou rollbacker

La décision finale doit pointer la couche responsable.

text action-group-decision.txt
Corriger la regle
Trop d'alertes viennent d'une requete, dimension ou severite mal calibree
Les receivers fonctionnent correctement
Un signal d'impact utilisateur reste disponible

Reparer le receiver
Azure Monitor declenche correctement
Un canal externe ne recoit pas ou transforme mal l'alerte
Les autres receivers restent utiles

Rollbacker la modification Action Group
La reduction masque un symptome utilisateur
Le canal critique ne recoit plus de signal de test
La fenetre de silence arrive a expiration
L'equipe ne peut plus expliquer qui est notifie et pourquoi

Un Action Group doit rester un outil d’exploitation, pas un interrupteur de panique. La bonne sortie du runbook est une chaîne d’alerte explicable : une règle ajustée si elle était bruyante, un receiver réparé s’il était cassé, ou un rollback rapide si la réduction a rendu la production moins observable.