RousselTMLEARNING

Observabilité

LogQL (2/2) : transformer les logs en métriques

Créer des métriques à partir des logs avec LogQL : rate, count_over_time, bytes_rate, agrégations, unwrap, quantile_over_time, topk et alertes basées sur les logs.

1. Les fonctions de plage #

Compter et mesurer.

Compter les lignes #

Transformation des logs en métriques
La plage [5m] glisse le long de l'axe du temps.
# Nombre de lignes d'erreur par seconde (moyenne sur 5 min)
rate({app="api"} |= "error" [5m])

# Nombre total d'erreurs sur 1 h
count_over_time({app="api"} |= "error" [1h])

# Débit en octets
bytes_rate({app="api"} [5m])
bytes_over_time({app="api"} [1h])

# Détecter l'absence de logs (service muet)
absent_over_time({app="api"} [10m])

2. Agréger #

Même logique que PromQL.

sum, topk et by #

# Erreurs par application
sum by (app) (rate({env="prod"} |= "error" [5m]))

# Top 5 des applications les plus bavardes
topk(5, sum by (app) (rate({env="prod"} [5m])))

# Ratio d'erreurs HTTP 5xx
sum(rate({app="nginx"} | pattern `<_> "<_> <_> <_>" <status> <_>` | status >= 500 [5m]))
  /
sum(rate({app="nginx"} [5m]))

# Évolution comparée à la veille
sum(rate({app="api"} |= "error" [5m])) / sum(rate({app="api"} |= "error" [5m] offset 1d))

3. Extraire des valeurs numériques avec unwrap #

Latences, tailles, montants.

unwrap et quantiles #

# Latence p95 par route à partir d'un champ JSON duration_ms
quantile_over_time(0.95,
  {app="api"} | json | unwrap duration_ms [5m]
) by (path)

# Moyenne, maximum, somme
avg_over_time({app="api"} | json | unwrap duration_ms [5m]) by (app)
max_over_time({app="api"} | json | unwrap duration_ms [5m]) by (app)
sum_over_time({app="shop"} | json | unwrap order_total [1h])

# Durée au format Go (1.5s, 300ms) : convertir avec duration()
quantile_over_time(0.99, {app="api"} | logfmt | unwrap duration(latency) [5m]) by (service)
Erreur Courante : unwrap exige un label numérique valide : filtrez les erreurs de parsing avec | __error__="" pour éviter des séries vides ou des erreurs de requête.

4. Alertes et tableaux de bord #

Exploiter ces métriques.

Dans Grafana #

  • Panneau Time series avec une requête LogQL de type Range.
  • Panneau Stat / Gauge avec le type Instant.
  • Alerte Grafana (Alerting > Alert rules) sur la même requête : seuil sur le taux d'erreurs.
# Variables de dashboard pour filtrer
label_values({env="prod"}, app)               # variable "app"
sum by (level) (count_over_time({app="$app"} | json [$__auto]))   # $__auto = intervalle adapté
Bonne Pratique : Pour les requêtes lourdes exécutées souvent, créez une recording rule dans le Ruler de Loki et stockez le résultat dans Prometheus/Mimir.

Articles liés

Grafana Loki : le système de logs inspiré de Prometheus

Découvrir Grafana Loki : philosophie d'indexation par labels, architecture (distributor, ingester, querier, c…

Installer Grafana Loki (Docker Compose, binaire et Helm)

Installer et valider Grafana Loki : configuration minimale, Docker Compose avec Grafana et Alloy, installatio…

Collecter des logs vers Loki : Alloy, Promtail, Docker et OpenTelemetry

Envoyer des logs vers Loki : Grafana Alloy, Promtail, driver Docker, OTLP, bons labels, parsing et enrichisse…

Pour aller plus loin