1. Les fonctions de plage #
Compter et mesurer.
Compter les lignes #
[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 :unwrapexige 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.
