RousselTMLEARNING

Observabilité

Bonnes pratiques Logstash : pipelines, performances, fiabilité et supervision

Bonnes pratiques Logstash : pipelines multiples, dissect plutôt que grok, conditionnels, persistent queue, dead letter queue, réglages workers/batch, JVM, sécurité et API de monitoring.

1. Concevoir ses pipelines #

Séparer, simplifier, tester.

Plusieurs pipelines #

Pipeline Logstash
La file persistante protège contre la perte de données en cas de panne ou de lenteur de la sortie.
# config/pipelines.yml : un pipeline par flux, avec ses propres réglages
- pipeline.id: nginx
  path.config: "/etc/logstash/conf.d/nginx.conf"
  pipeline.workers: 4
  pipeline.batch.size: 250
  queue.type: persisted
  queue.max_bytes: 4gb
- pipeline.id: app
  path.config: "/etc/logstash/conf.d/app.conf"
  queue.type: persisted
  dead_letter_queue.enable: true
  • Un pipeline par type de flux : pannes et lenteurs ne se propagent pas d'un flux à l'autre.
  • Chaînez des pipelines avec les plugins pipeline input/output pour mutualiser des traitements.
  • Versionnez les fichiers et validez en CI avec --config.test_and_exit.

2. Filtres performants #

dissect, conditionnels et date.

Préférer dissect à grok #

filter {
  if [fields][type] == "nginx" {
    dissect {
      mapping => { "message" => '%{client_ip} - - [%{ts}] "%{method} %{uri} HTTP/%{http_ver}" %{status} %{bytes}' }
    }
    date   { match => ["ts", "dd/MMM/yyyy:HH:mm:ss Z"]  target => "@timestamp" }
    mutate { convert => { "status" => "integer"  "bytes" => "integer" }  remove_field => ["ts", "message"] }
  } else if [fields][type] == "app" {
    json { source => "message"  skip_on_invalid_json => true }
  }
  # grok seulement pour les formats variables, avec ancrage et motifs précis
  grok { match => { "message" => "^%{TIMESTAMP_ISO8601:ts} %{LOGLEVEL:level} %{GREEDYDATA:msg}$" }  tag_on_failure => ["_grokfail"] }
}
Bonne Pratique : dissect est nettement plus rapide que grok quand le format est fixe. Réservez grok aux formats irréguliers et ancrez toujours vos motifs (^...$).

3. Fiabilité et sécurité #

Ne rien perdre, ne rien exposer.

Sorties et DLQ #

output {
  elasticsearch {
    hosts => ["https://es01:9200", "https://es02:9200"]
    api_key => "${ES_API_KEY}"                       # secret dans le keystore Logstash
    ssl_certificate_authorities => ["/etc/logstash/ca.crt"]
    data_stream => "true"
    data_stream_type => "logs"  data_stream_dataset => "nginx"  data_stream_namespace => "prod"
  }
}
# Secrets : bin/logstash-keystore create && bin/logstash-keystore add ES_API_KEY
# Relire la dead letter queue pour corriger les rejets
input { dead_letter_queue { path => "/var/lib/logstash/dead_letter_queue"  pipeline_id => "app"  commit_offsets => true } }
Erreur Courante : Une sortie bloquée (Elasticsearch indisponible) sans file persistante fait perdre les événements ou bloque les entrées. Activez queue.type: persisted et dimensionnez queue.max_bytes.

4. Performances et supervision #

Mesurer avant de régler.

API de monitoring et réglages #

curl -s localhost:9600/_node/stats/pipelines?pretty | jq '.pipelines | to_entries[] | {id: .key, in: .value.events.in, out: .value.events.out}'
curl -s 'localhost:9600/_node/stats/jvm?pretty' | jq '.jvm.mem.heap_used_percent'
curl -s 'localhost:9600/_node/hot_threads?human=true' | head -30          # où le CPU est consommé
bin/logstash --config.test_and_exit -f /etc/logstash/conf.d/             # validation
RéglageConseil
pipeline.workersÉgal au nombre de cœurs ; plus si les filtres attendent des E/S
pipeline.batch.size125 par défaut ; 250 – 1000 pour de meilleures performances d'envoi
JVM heap-Xms = -Xmx, 4 – 8 Go typiques
pipeline.orderedDésactivez si l'ordre n'importe pas pour paralléliser
À savoir : Quand le débit augmente fortement, placez Kafka entre les collecteurs et Logstash pour absorber les pics et rejouer les données.

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 #

Statistiques de pipeline Logstash
Un écart durable entre in et out indique une sortie lente ou une file qui se remplit.

Articles liés

Alloy et l'écosystème Grafana Labs : quel composant pour quel outil ?

La carte des intégrations d'Alloy avec Faro, Beyla, k6, Loki, Mimir, Tempo, Pyroscope, Database Observability…

Faro et Alloy : recevoir le RUM front-end avec faro.receiver

Configurer faro.receiver : CORS, clé d'API, limite de débit, source maps, puis envoyer erreurs, Web Vitals et…

Beyla et Alloy : métriques RED et traces sans code avec beyla.ebpf

Activer l'instrumentation eBPF de Beyla dans Alloy : découverte des services, métriques RED vers Mimir, trace…

Pour aller plus loin

Soutenir

♥ SOUTENIR

Soutenez RousselTM Learning

Les formations, articles, TP et attestations restent gratuits et sans publicité intrusive. Une contribution libre, du montant de votre choix, finance l’hébergement, les environnements de TP et l’écriture de nouveaux contenus.

Contribuer avec PayPal Montant libre · carte bancaire ou compte PayPalEn savoir plus
QR code PayPal
Ou scannez ce QR code avec votre téléphone

Merci, chaque contribution compte !