C'est quoi un SLO ? Définition, exemples et calcul utile

Résumé

Un SLO est une cible de fiabilité sur un comportement visible par l'utilisateur, mesurée sur une fenêtre fixe, par exemple 99,9 % de requêtes réussies sur 30 jours. Il se distingue du SLI, la mesure, et du SLA, le contrat client. Le budget d'erreur qui en découle décide quand livrer et quand geler, et l'alerte se règle sur le burn rate plutôt que sur le SLI brut.

Deux écrans de monitoring affichant des courbes de fiabilité sur un bureau d'ingénierie de nuit

C'est quoi un SLO ? Un objectif de niveau de service (service level objective) est une cible de fiabilité pour un comportement précis, visible par l'utilisateur, mesuré sur une fenêtre de temps fixe. « 99,9 % des requêtes de paiement réussissent en moins de 800 ms, sur 30 jours » : ça, c'est un SLO. « Le site doit être rapide » : ça, c'est un vœu. Le chiffre compte moins que ce qu'il contrôle : le SLO décide quand vous continuez à livrer et quand vous vous arrêtez.

Il est 03:12. PagerDuty signale une latence « élevée » sur le checkout. Vous ouvrez le dashboard et vous voyez une courbe p99 qui dérive depuis quarante minutes. Personne ne peut vous dire si c'est un problème, parce que personne n'a jamais écrit le seuil de latence acceptable. La discussion qui suit, en call, avec un œil sur Slack, c'est le coût de ne pas avoir de SLO.

Téléphone lumineux sur une table de chevet pendant la nuit, lors d'une alerte d'astreinte

SLI, SLO, SLA : trois mots, trois responsables

On les confond tout le temps. Ce ne sont pas la même chose, et les mélanger est la façon la plus sûre de signer un contrat qu'on ne peut pas tenir.

Le chapitre du livre SRE de Google consacré aux objectifs de niveau de service trace la même frontière : le SLO est une cible interne, plus serrée que tout ce que vous promettez à l'extérieur. Les ingénieurs possèdent le SLI et le SLO. Le produit et le juridique possèdent le SLA.

Évitez le réflexe d'ajouter un quatrième mot pour chaque métrique que vous collectez déjà. Le CPU, la mémoire et la profondeur de file sont utiles pour déboguer. Ce ne sont pas des SLI, parce qu'aucun client ne les ressent directement.

À quoi ressemble un bon SLI en pratique

Un bon SLI est un ratio, il se mesure au plus près de l'utilisateur, et il a une définition claire de « bon ».

Pour un service piloté par les requêtes, le réglage par défaut tient en deux SLI : la disponibilité (réponses non 5xx sur toutes les requêtes valides) et la latence (requêtes sous un seuil sur toutes les requêtes valides). Utilisez un seuil, pas une moyenne. Une moyenne masque la queue de distribution, et c'est dans la queue que naissent les tickets de support.

Mesurez au load balancer ou à la périphérie, pas à l'intérieur du service. Un service qui plante au démarrage affiche un taux d'erreur parfait pour les requêtes qu'il n'a jamais reçues. Les métriques côté serveur sont aveugles à cette panne, alors que l'utilisateur la vit comme une indisponibilité.

Soyez explicite sur ce qui est exclu. Les health checks, les sondes synthétiques de votre propre monitoring et les réponses 4xx dues à une mauvaise entrée client ne devraient généralement pas compter contre vous. Écrivez les exclusions à côté du SLO. Quand quelqu'un conteste le chiffre pendant une revue d'incident, le débat doit porter sur la définition, pas sur ce que le dashboard affiche par hasard.

L'arithmétique que personne ne fait avant de choisir ses neuf

Chaque neuf supplémentaire divise par dix le temps d'indisponibilité autorisé. C'est le tableau à garder dans le document.

Relisez la dernière ligne. À 99,99 %, un seul mauvais déploiement, détecté et annulé en cinq minutes, a déjà fait sauter le mois. Un humain ne peut pas répondre à une alerte d'astreinte, ouvrir un laptop et revenir en arrière en moins de quatre minutes : cette cible n'est donc atteignable qu'avec de l'automatisation, une porte automatique qui arrête le rollout avant que le budget ne soit épuisé.

Choisissez donc le chiffre dont le service a réellement besoin. La plupart des API internes vivent très bien à 99,9 %. Un chemin de paiement peut justifier davantage. Un job batch qui tourne la nuit peut se contenter de 99 %. Choisir 99,99 % parce que ça sonne sérieux, c'est s'inscrire à une astreinte qu'on ne peut pas staffer.

Sablier dont le sable est presque entièrement écoulé, symbolisant un budget d'erreur consommé

Le budget d'erreur est le point, pas le SLO

Un SLO à 99,9 % signifie que vous avez le droit d'échouer 0,1 % du temps. Ces 0,1 % constituent votre budget d'erreur, et c'est l'idée la plus utile de toute la discipline.

Le budget transforme une discussion en chiffre. Le produit veut livrer la migration risquée. Le SRE dit que c'est risqué. Sans budget, c'est une opinion contre une autre, et l'ancienneté gagne. Avec un budget, la question devient : combien il reste, et combien ce changement peut raisonnablement en consommer ?

Deux règles font tenir le dispositif.

  1. Budget restant : on livre. Vous avez le droit de prendre des risques, alors prenez-les. Une équipe qui ne dépense jamais son budget investit trop dans une fiabilité que les utilisateurs n'ont pas demandée.

  2. Budget épuisé : on gèle. Le travail sur les fonctionnalités s'arrête jusqu'à ce que le travail de fiabilité remonte le SLI au-dessus de la cible. Cela ne tient que si la direction l'a acceptée avant le premier incident, pas pendant.

Si la seconde règle n'a pas été convenue à l'avance, vous n'avez pas de SLO. Vous avez un dashboard avec une zone verte et une zone rouge.

Alerter sur le burn rate, pas sur le SLI lui-même

C'est là que la plupart des premières tentatives échouent. Quelqu'un configure une alerte quand la disponibilité passe sous 99,9 %. L'alerte se déclenche après les dégâts, ou elle clignote à chaque incident mineur, ou les deux.

Le signal le plus juste est le burn rate : la vitesse à laquelle vous consommez le budget, comparée au rythme qui l'épuiserait exactement à la fin de la fenêtre. Un burn rate de 1 signifie que vous finirez le mois avec zéro budget restant. Un burn rate de 14,4 signifie que vous êtes sur la trajectoire de brûler le budget de tout un mois en deux jours environ.

Le SRE Workbook de Google sur l'alerte sur les SLO recommande d'associer une fenêtre longue et une fenêtre courte, pour que l'alerte soit significative tout en étant encore active. Pour un SLO sur 30 jours, deux pages constituent un bon point de départ :

L'arithmétique est simple. Une fenêtre de 30 jours fait 720 heures. Brûler à 14,4x pendant une heure consomme 14,4 / 720 = 2 % du budget. La fenêtre courte évite que l'alerte se déclenche une heure après la fin du problème.

Voici la première règle sous forme d'alerte Prometheus, en supposant que vous enregistrez un ratio d'erreurs par fenêtre :

groups:
  - name: checkout-slo-burn
    rules:
      - alert: CheckoutErrorBudgetFastBurn
        expr: |
          job:checkout_error_ratio:rate1h > (14.4 * 0.001)
          and
          job:checkout_error_ratio:rate5m > (14.4 * 0.001)
        labels:
          severity: page
        annotations:
          summary: "Le checkout consomme 2 % de son budget d'erreur de 30 jours par heure"

Le 0,001 est le ratio d'erreur autorisé pour un SLO à 99,9 %. Si vous changez la cible, cette constante doit suivre. Gardez-la à un seul endroit, sinon l'alerte et le SLO finiront par diverger sans que personne ne le remarque.

Les brûlures plus lentes n'exigent pas de page. Un burn rate de 1 maintenu pendant trois jours relève d'un ticket pour le lendemain matin ouvré. Réveiller quelqu'un pour une fuite lente, c'est comme ça que les équipes d'astreinte apprennent à ignorer le pager.

Allée de datacenter avec des baies de serveurs et des voyants d'état

Où calculer le SLI sans acheter une seconde plateforme

Vous n'avez pas besoin d'un produit SLO dédié pour commencer. Il vous faut un compteur d'événements bons, un compteur d'événements totaux, et un endroit pour les conserver pendant 30 jours.

Si vos métriques vivent déjà dans une plateforme hébergée, la fonctionnalité SLO n'est généralement qu'une fine couche par-dessus des données que vous payez déjà.

Datadog gère nativement les SLO, avec des alertes de burn rate, et c'est le chemin le plus simple si vos traces et vos métriques sont déjà là-bas. La facture est le piège : les métriques custom et les tags à forte cardinalité se multiplient vite. Vérifiez le prix des séries SLI avant de vous engager.

Si vous faites tourner Prometheus, Grafana couvre le même terrain grâce aux recording rules et à son outillage SLO, au prix de plus de mise en place et de plus de votre temps.

La comparaison honnête oppose le délai avant la première alerte utile au coût à grande échelle. Datadog gagne sur le premier point. Grafana avec Prometheus gagne en général sur le second. Choisissez selon ce qui manque le plus à votre équipe.

Relier le SLO au rollout, c'est la partie que la plupart des équipes sautent

Un SLO qui ne produit qu'un rapport n'est utilisé qu'à moitié. L'étape qui change réellement le comportement, c'est de brancher le budget sur le chemin de déploiement, pour que la mise en production s'arrête toute seule.

Un rollout progressif avec porte SLO fonctionne ainsi. Vous livrez à 1 % du trafic derrière un feature flag. Vous surveillez le SLI de cette cohorte par rapport à la baseline. Si le burn rate de la cohorte canari dépasse votre seuil, vous revenez en arrière automatiquement. S'il tient, vous passez à 5 %, puis 25 %, puis 100 %.

C'est très différent d'un dashboard que quelqu'un est censé surveiller à 03:12. À 03:12, on ne veut pas réfléchir. On veut un bouton, ou mieux, pas de bouton du tout.

C'est là que les feature flags se rentabilisent : un flag transforme un retour arrière en changement de configuration qui prend quelques secondes, au lieu d'un redéploiement qui prend dix minutes.

LaunchDarkly et des plateformes similaires vous donnent le déploiement en pourcentage et le kill switch. Ce qu'elles vous laissent, pour la plupart, c'est la décision : quel SLI lire, quel seuil compte comme mauvais, et qui a le droit de passer outre. C'est l'écart que cherche à combler un pilote automatisé avec auto-rollback sur SLO, et c'est l'angle que nous prenons chez upstreamapi. LaunchDarkly gagne sur l'étendue de ses SDK et ses contrôles entreprise, et nous le disons.

Voici la forme de la porte en TypeScript. La logique de décision est la partie qui vaut la peine d'être écrite soi-même, quel que soit le système de flags utilisé :

type Cohort = { good: number; total: number };

const SLO_TARGET = 0.999;
const BUDGET = 1 - SLO_TARGET; // 0.001
const PAGE_BURN_RATE = 14.4;

function burnRate(c: Cohort): number {
  if (c.total === 0) return 0;
  const errorRatio = 1 - c.good / c.total;
  return errorRatio / BUDGET;
}

export function rolloutDecision(canary: Cohort): "advance" | "hold" | "revert" {
  if (canary.total < 500) return "hold"; // pas assez de trafic pour trancher
  return burnRate(canary) > PAGE_BURN_RATE ? "revert" : "advance";
}

Remarquez la branche hold. Une cohorte canari à 1 % d'un service calme peut voir quarante requêtes en dix minutes, et une erreur sur quarante donne un ratio d'erreur de 2,5 %. Sans échantillon minimum, la porte revient en arrière sur du bruit, et votre équipe apprend à s'en méfier.

Les erreurs que nous voyons encore dans les équipes de 80 ingénieurs

Les mêmes échecs reviennent d'une équipe à l'autre, et presque aucun n'est technique.

Qui doit écrire le premier cette semaine

Vous n'avez pas besoin d'un programme. Choisissez le parcours qui ferait appeler le CEO à quelqu'un s'il tombait en panne. Définissez un SLI de disponibilité et un SLI de latence pour lui. Fixez la cible à 99,9 % pour le premier trimestre, rédigez la politique de gel en deux phrases, et faites répondre « d'accord » par écrit au produit.

Ajoutez ensuite une alerte de burn rate, et un endroit où toute l'équipe peut voir le budget restant.

Si vous cherchez un point de départ léger avant de vous engager sur une plateforme complète, Better Stack gère la supervision d'uptime et la pagination d'incidents avec une mise en place bien plus simple, même s'il ne fera pas les calculs de budget à votre place.

La première version sera fausse. C'est acceptable. Ce qui compte, c'est que la prochaine revue d'incident parte d'un chiffre écrit à l'avance plutôt que d'un ressenti.

À quoi ressemble votre 03:12 maintenant ?

Prenez le dernier incident de votre équipe. Y avait-il un chiffre écrit qui disait s'il comptait ? Si la réponse honnête est non, c'est votre premier SLO, et le post-mortem vous a déjà dit quoi mesurer.

Questions fréquentes

C'est quoi un SLO, en termes simples ?
Un SLO est une cible de fiabilité pour un comportement précis vu par l'utilisateur, mesurée sur une fenêtre fixe, par exemple 99,9 % des requêtes réussies sur 30 jours. Il indique combien d'échecs sont acceptables et quand arrêter de livrer.
Quelle est la différence entre SLI, SLO et SLA ?
Le SLI est la mesure, un ratio d'événements bons sur événements valides. Le SLO est la cible interne fixée sur ce ratio. Le SLA est le contrat client assorti de pénalités, et il doit toujours être moins exigeant que le SLO.
Combien d'indisponibilité autorise un SLO à 99,9 % ?
Sur une fenêtre de 30 jours, 99,9 % autorise 43,2 minutes de panne totale. 99 % en autorise 7,2 heures, 99,95 % 21,6 minutes et 99,99 % 4,32 minutes.
Qu'est-ce qu'un budget d'erreur ?
C'est 100 % moins la cible du SLO. À 99,9 %, le budget représente 0,1 % des événements. Tant qu'il reste du budget, l'équipe peut prendre des risques de livraison. Quand il est épuisé, le travail sur les fonctionnalités se met en pause jusqu'au retour de la fiabilité.
Qu'est-ce que le burn rate dans l'alerte SLO ?
Le burn rate mesure la vitesse de consommation du budget d'erreur par rapport au rythme qui l'épuiserait exactement à la fin de la fenêtre. Un burn rate de 14,4 maintenu une heure consomme 2 % d'un budget de 30 jours.
Combien de SLO faut-il par service ?
Deux ou trois par parcours utilisateur critique suffisent, en général un SLI de disponibilité et un SLI de latence. Au-delà, personne ne s'en souvient et ils ne guident plus aucune décision.
Quelle cible de SLO choisir pour démarrer ?
Partez de 99,9 % sur le parcours utilisateur le plus important, revoyez la cible après un trimestre, et placez-la là où les utilisateurs commencent à remarquer les problèmes, pas au niveau de la performance actuelle.