1. Le principe #
Décrire, générer, charger.
Pourquoi Sloth #
Sloth est un générateur open source : à partir d'une spécification de SLO, il produit les règles d'enregistrement des SLI pour toutes les fenêtres, les métadonnées (objectif, budget restant) et les alertes multi-fenêtres multi-taux de la méthode Google.
2. Écrire une spécification #
Le format prometheus/v1.
Exemple #
version: "prometheus/v1"
service: "checkout"
labels:
owner: "equipe-paiement"
slos:
- name: "requests-availability"
objective: 99.9
description: "Requêtes de l'API checkout sans erreur 5xx."
sli:
events:
error_query: sum(rate(http_requests_total{service="checkout",code=~"5.."}[{{.window}}]))
total_query: sum(rate(http_requests_total{service="checkout"}[{{.window}}]))
alerting:
name: CheckoutHighErrorRate
labels:
category: availability
annotations:
summary: "Budget d'erreur de checkout consommé trop vite"
runbook_url: https://wiki.example.org/runbooks/checkout
page_alert:
labels: { severity: critical }
ticket_alert:
labels: { severity: warning }Le gabarit {{.window}} est remplacé par chaque fenêtre (5m, 30m, 1h, 2h, 6h, 1d, 3d, 30d).
sloth validate -i slos/
sloth generate -i slos/checkout.yml -o rules/checkout-slo.yml
# ou avec Docker
docker run --rm -v $PWD:/w ghcr.io/slok/sloth generate -i /w/slos/checkout.yml -o /w/rules/checkout-slo.ymlCe qui est généré #
| Métrique | Signification |
|---|---|
slo:sli_error:ratio_rate5m ... ratio_rate30d | Taux d'erreur par fenêtre |
slo:objective:ratio | Objectif (0,999) |
slo:error_budget:ratio | Budget (0,001) |
slo:current_burn_rate:ratio | Burn rate actuel |
slo:period_error_budget_remaining:ratio | Budget restant sur la période |
Toutes portent les labels sloth_service, sloth_slo et sloth_id.
3. Sur Kubernetes et dans Grafana #
Opérateur et dashboards.
Opérateur #
En mode Kubernetes, Sloth surveille des ressources PrometheusServiceLevel et crée les PrometheusRule correspondantes pour le Prometheus Operator :
apiVersion: sloth.slok.dev/v1
kind: PrometheusServiceLevel
metadata:
name: checkout
namespace: paiement
spec:
service: checkout
slos:
- name: requests-availability
objective: 99.9
sli:
events:
errorQuery: sum(rate(http_requests_total{service="checkout",code=~"5.."}[{{.window}}]))
totalQuery: sum(rate(http_requests_total{service="checkout"}[{{.window}}]))
alerting:
name: CheckoutHighErrorRate
pageAlert: { labels: { severity: critical } }
ticketAlert: { labels: { severity: warning } }Bonne Pratique : Sloth publie deux dashboards Grafana (identifiants 14348 pour le détail d'un SLO et 14643 pour la vue d'ensemble) qui exploitent directement les métriques générées.
