RousselTMLEARNING

Observabilité

Bonnes pratiques Grafana Loki : labels, requêtes, stockage et coûts

Bonnes pratiques Loki : choix des labels et cardinalité, structured metadata, requêtes LogQL performantes, journaux structurés, rétention, limites, sécurité multi-tenant et checklist de revue.

1. Les labels : la règle d'or #

Peu, stables, bornés.

Choisir ses labels #

Bonnes pratiques Loki
La cardinalité des labels détermine coûts et performances.
Bon labelMauvais labelPourquoi
app, namespace, envuser_id, ipChaque valeur = un flux distinct
level (5 valeurs)request_id, trace_idCardinalité illimitée
cluster, joburl complète, horodatageExplosion du nombre de flux
# Analyser la cardinalité
logcli series '{env="prod"}' --since=1h --analyze-labels
logcli labels pod --since=24h | wc -l
sum(loki_ingester_memory_streams)
# Déplacer l'information à forte cardinalité en structured metadata
stage.structured_metadata { values = { trace_id = "" } }
Erreur Courante : Ne dépassez pas quelques dizaines de milliers de flux actifs par tenant sans dimensionner les ingesters en conséquence.

2. Des logs exploitables #

Structurer à la source.

Format et niveaux #

  • Journalisez en JSON ou logfmt avec level, msg, trace_id, service.
  • Une ligne = un événement ; évitez les stack traces multilignes non regroupées (stage.multiline).
  • Normalisez les niveaux (debug, info, warn, error) et réduisez le niveau debug en production.
loki.process "app" {
  forward_to = [loki.write.default.receiver]
  stage.multiline { firstline = "^\\d{4}-\\d{2}-\\d{2}"  max_wait_time = "3s" }
  stage.json      { expressions = { level = "level", trace_id = "trace_id" } }
  stage.labels    { values = { level = "" } }
  stage.structured_metadata { values = { trace_id = "" } }
  stage.drop      { expression = ".*healthcheck.*" }
}

3. Des requêtes rapides #

LogQL efficace.

Règles #

# ✅ Sélecteur précis + filtre de ligne AVANT le parseur
{app="checkout", env="prod"} |= "error" | json | status >= 500
# ❌ Sélecteur large puis tout filtrer après parsing
{env="prod"} | json | app="checkout" | status >= 500

# Mesurer ce qu'une requête lit
logcli query '{app="checkout"} |= "error"' --since=6h --stats
# Précalculer ce qui est demandé souvent (recording rule)
- record: app:log_errors:rate5m
  expr: sum by (app) (rate({env="prod"} |= "error" [5m]))
  • Réduisez la plage de temps et le nombre de flux avant d'affiner.
  • Préférez pattern ou logfmt à regexp.
  • Activez le cache des résultats et le Query Frontend pour les dashboards.

4. Coûts, sécurité et revue #

Garder la maîtrise.

Rétention et limites #

limits_config:
  retention_period: 744h
  retention_stream:
    - { selector: '{env="dev"}',   priority: 1, period: 72h }
    - { selector: '{app="audit"}', priority: 2, period: 8760h }
  ingestion_rate_mb: 10
  per_stream_rate_limit: 5MB
  max_streams_per_user: 100000
# Suivre ce qui est rejeté
sum by (reason) (rate(loki_discarded_samples_total[5m]))
Question de revueRéponse attendue
Combien de flux actifs par tenant ?Surveillé et borné par max_streams_per_user
Des données personnelles dans les logs ?Masquées à la source (stage.replace)
Rétention différenciée par criticité ?Oui (dev court, audit long)
Isolation entre équipes ?Tenants distincts, authentification devant Loki
Bonne Pratique : Mesurez le coût par application (octets ingérés) et partagez-le avec les équipes : c'est le meilleur levier pour réduire le bruit.

Schéma de référence et vérification rapide #

Visualiser le principe et le contrôler en ligne de commande.

Schéma de référence #

Flux actifs selon les labels
Surveillez loki_ingester_memory_streams.
sum(loki_ingester_memory_streams)
logcli series '{env="prod"}' --since=1h --analyze-labels

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