Infrastructure

Azure Monitor et KQL : décider un rollback après déploiement sans couper les alertes

Un runbook de production pour décider un rollback Azure après déploiement avec Azure Monitor, KQL, corrélation d'impact, preuve de régression, validation et retour arrière contrôlé.

21 juin 2026 azureazure-monitorkqlobservabilitydeploymentrollbackincidentrunbookvalidationautomation

Après un déploiement, la question opérationnelle arrive souvent trop vite : faut-il rollbacker ou tenir la position ? Les alertes Azure Monitor s’allument, les logs applicatifs deviennent plus bruyants, un dashboard passe au rouge, et chacun cherche une preuve dans une fenêtre de quelques minutes. Couper l’action group pour respirer peut sembler utile, mais cela détruit souvent le signal qui permet justement de décider.

Le cas d’usage est volontairement concret : une application Azure vient d’être déployée derrière un chemin privé, une gateway, APIM ou un service managé. Les premières alertes arrivent dans les dix minutes. L’équipe doit déterminer si le changement a introduit une régression réelle, si le monitoring observe un warm-up normal, ou si la règle d’alerte est mal calibrée. L’objectif du runbook est de produire une décision exploitable : continuer, surveiller, corriger en avant, ou rollbacker avec validation.

Nommer la décision avant les requêtes

KQL ne doit pas devenir une chasse libre aux anomalies. Avant d’ouvrir les logs, il faut écrire la décision attendue et les critères qui la rendent défendable. Un rollback n’est pas justifié parce qu’une métrique bouge. Il l’est quand l’impact utilisateur, la régression technique et le lien temporel avec le changement sont suffisamment alignés.

text rollback-decision-contract.txt
Decision a produire
Continuer le deploiement
Surveiller avec fenetre courte
Corriger en avant avec changement borne
Rollbacker la version ou la configuration

Preuves minimales
Fenetre de deploiement horodatee
Symptome utilisateur ou degradation SLO
Changement technique plausible
Signal avant/apres comparable
Perimetre touche: service, region, revision, route, identite ou dependance
Test de validation apres action
Chemin de retour documente

Stop conditions
Erreur critique qui augmente apres le changement
Degradation utilisateur confirmee
Dependances saines mais service deploye instable
Absence de preuve suffisante pour corriger en avant
Rollback disponible et moins risque que l'attente

Cette étape évite deux erreurs symétriques : rollbacker dès le premier bruit, ou rester exposé parce que la preuve n’est pas encore parfaitement présentée.

Fixer une fenêtre de changement propre

La plupart des diagnostics échouent parce que la fenêtre temporelle est floue. Il faut isoler trois périodes : référence avant déploiement, fenêtre de changement, période d’observation après déploiement. Les requêtes doivent conserver ces bornes, même si l’équipe ajuste ensuite le périmètre.

kusto deployment-window.kql
let deploymentStart = datetime(2026-06-21T09:30:00Z);
let deploymentEnd = datetime(2026-06-21T09:42:00Z);
let beforeWindow = 45m;
let afterWindow = 45m;
let serviceName = "orders-api";
AppRequests
| where TimeGenerated between ((deploymentStart - beforeWindow) .. (deploymentEnd + afterWindow))
| where AppRoleName == serviceName
| extend phase = case(
  TimeGenerated < deploymentStart, "before",
  TimeGenerated <= deploymentEnd, "deploying",
  "after")
| summarize
  requests = count(),
  failed = countif(Success == false),
  p95_duration_ms = percentile(DurationMs, 95)
by phase, bin(TimeGenerated, 5m)
| order by TimeGenerated asc

Le point important n’est pas la requête exacte. C’est la discipline : comparer le même service, la même granularité, la même source de logs et la même définition d’échec.

Séparer impact utilisateur et bruit interne

Un service peut produire plus d’exceptions sans que les utilisateurs soient réellement touchés, par exemple pendant un warm-up, une reconnexion de clients ou une purge de cache. L’inverse est aussi vrai : peu d’exceptions visibles peuvent masquer des timeouts côté client. La décision de rollback doit commencer par l’impact.

kusto user-impact-first.kql
let deploymentStart = datetime(2026-06-21T09:30:00Z);
let deploymentEnd = datetime(2026-06-21T09:42:00Z);
let afterWindow = 45m;
AppRequests
| where TimeGenerated between ((deploymentStart - 45m) .. (deploymentEnd + afterWindow))
| where AppRoleName == "orders-api"
| summarize
  total = count(),
  failed = countif(Success == false),
  server_errors = countif(ResultCode startswith "5"),
  client_errors = countif(ResultCode startswith "4"),
  p95_duration_ms = percentile(DurationMs, 95)
by bin(TimeGenerated, 5m), OperationName
| extend failure_rate = todouble(failed) / todouble(total)
| where total > 20
| order by TimeGenerated asc, failure_rate desc

Si le taux d’échec monte sur une opération utilisateur centrale, le diagnostic peut avancer vers le rollback. Si seuls des endpoints de health check ou des tâches internes bruitent, la décision peut être de surveiller ou de corriger l’alerte.

Corréler la régression avec la version ou la configuration

Le lien temporel ne suffit pas. Un pic après déploiement peut venir d’un trafic inhabituel, d’une dépendance externe, d’un incident réseau ou d’une identité expirée. Il faut rattacher le symptôme à un artefact : version, révision, slot, image, rule set, route, feature flag ou configuration.

kusto version-correlation.kql
let deploymentStart = datetime(2026-06-21T09:30:00Z);
AppTraces
| where TimeGenerated > deploymentStart - 30m
| where AppRoleName == "orders-api"
| extend version = tostring(Properties["appVersion"])
| extend revision = tostring(Properties["revision"])
| summarize
  traces = count(),
  errors = countif(SeverityLevel >= 3),
  sample_error = anyif(Message, SeverityLevel >= 3)
by version, revision, bin(TimeGenerated, 10m)
| order by TimeGenerated asc, errors desc

Quand la version fautive est visible, la décision devient plus simple. Quand elle ne l’est pas, c’est un signal d’exploitation à corriger : une application qui ne journalise pas sa version rend les rollbacks plus lents et plus discutables.

Vérifier les dépendances avant de blâmer le déploiement

Un rollback applicatif ne corrige pas une dépendance indisponible, une résolution DNS cassée, une règle WAF trop large ou une identité sans droit. Avant de revenir en arrière, il faut vérifier si le service déployé échoue parce qu’il est mauvais ou parce que son environnement a changé.

kusto dependency-check-before-rollback.kql
let deploymentStart = datetime(2026-06-21T09:30:00Z);
AppDependencies
| where TimeGenerated between ((deploymentStart - 45m) .. (deploymentStart + 60m))
| where AppRoleName == "orders-api"
| summarize
  calls = count(),
  failed = countif(Success == false),
  p95_duration_ms = percentile(DurationMs, 95),
  result_codes = make_set(ResultCode, 10)
by Target, DependencyType, bin(TimeGenerated, 5m)
| extend failure_rate = todouble(failed) / todouble(calls)
| where calls > 10
| order by TimeGenerated asc, failure_rate desc

Si une seule dépendance bascule en échec pour plusieurs services, le rollback de l’application n’est peut-être pas l’action prioritaire. Si les dépendances restent stables mais que la nouvelle version échoue, le rollback gagne en crédibilité.

Produire une matrice stop, go ou rollback

La décision doit tenir en quelques lignes, pas dans une conversation dispersée. Une matrice simple aide l’équipe à trancher sans inventer de nouveaux critères en plein incident.

text rollback-decision-matrix.txt
Continuer
Pas de degradation utilisateur mesurable
Erreurs limitees a warm-up ou endpoints internes
Dependances stables
Alertes bruyantes mais expliquees

Surveiller
Signal faible ou intermittent
Impact utilisateur non confirme
Fenetre de stabilisation attendue
Validation supplementaire en cours

Corriger en avant
Cause identifiee et correction bornee
Blast radius plus faible qu'un rollback complet
Validation immediate disponible
Retour arriere de la correction possible

Rollbacker
Degradation utilisateur confirmee
Regression liee a la version ou configuration
Pas de correction bornee disponible dans la fenetre
Rollback teste ou procedure connue
Critere de succes apres rollback defini

Cette matrice doit être préparée avant l’incident. Pendant l’incident, l’équipe ne devrait remplir que les preuves et choisir la ligne correspondante.

Valider le rollback comme un changement de production

Un rollback n’est pas une annulation magique. C’est un changement de production qui peut échouer, masquer une autre cause ou réintroduire une ancienne limite. Il faut donc le valider avec les mêmes signaux que ceux qui ont justifié la décision.

text rollback-validation.txt
Avant rollback
Version ou configuration cible identifiee
Commande ou procedure relue
Impact attendu ecrit
Canal de notification conserve
Heure de debut horodatee

Pendant rollback
Surveiller erreurs utilisateur
Surveiller latence p95 ou SLO principal
Surveiller dependances critiques
Garder les logs actifs

Apres rollback
Comparer 15 minutes avant/apres
Confirmer retour du signal utilisateur
Verifier absence de nouvelle erreur critique
Capturer la preuve de stabilisation
Ouvrir la correction durable ou post-incident

La validation doit aussi dire quoi faire si le rollback ne réduit pas l’impact. Dans ce cas, il faut revenir au diagnostic de dépendance, de routage, d’identité ou de plateforme au lieu d’enchaîner des rollbacks à l’aveugle.

Automatiser la collecte, pas la décision sensible

L’automatisation peut préparer la décision sans la prendre seule. Un job AWX, un script ou un agent interne peut collecter les mêmes requêtes KQL, produire un résumé et attacher les preuves au ticket. La décision de rollback reste humaine tant que l’organisation n’a pas prouvé que le périmètre, les seuils et le retour arrière sont sûrs.

text rollback-evidence-pack.txt
Collecte automatique acceptable
Fenetre de deploiement
Taux d'erreur avant/apres
Latence avant/apres
Operations les plus touchees
Dependances en echec
Version ou revision observee
Liens vers dashboards et logs

Validation humaine obligatoire
Confirmer impact utilisateur
Choisir rollback ou correction en avant
Accepter le risque du retour arriere
Declencher le changement sensible
Confirmer la stabilisation

Cette séparation garde l’outillage utile sans transformer l’incident en bouton rouge automatique.

Conclusion

Décider un rollback après déploiement n’est pas une question d’intuition ou de courage. C’est une chaîne de preuves : fenêtre de changement, impact utilisateur, comparaison avant/après, corrélation avec la version, état des dépendances, critères stop/go et validation après action.

Azure Monitor et KQL donnent la matière, mais le runbook donne la décision. Quand les critères sont prêts avant l’incident, l’équipe peut agir vite sans couper les alertes, sans confondre bruit et régression, et sans rollbacker plus large que nécessaire.