RousselTMLEARNING

TP · Kibana et Elastic Observability : de la découverte à l'expertise

Projet de parcours : centraliser et exploiter les journaux de plusieurs serveurs avec correction

La correction est intégrée au TP (Voir les encadrés de couleur vert)

Ce que vous allez apprendre dans ce TP
  • Collecter avec Elastic Agent et Fleet
  • Structurer avec Logstash
  • Conserver avec ILM
  • Analyser, visualiser, alerter
  • Sécuriser l'accès

Introduction #

Ce que vous allez apprendre dans cette section
  • Collecter avec Elastic Agent et Fleet
  • Structurer avec Logstash
  • Conserver avec ILM
  • Analyser, visualiser, alerter
  • Sécuriser l'accès

Contexte. Vous mettez en œuvre tout le parcours sur un cas réel : la grille d'évaluation de l'article du projet indique ce qui valide votre travail.

Prérequis : le labo Fleet du TP 1 de la formation Elastic Agent, jq  ·  Durée estimée : 120 min

Mise en place #

Étapes guidées, avec leur correction.

  1. 1. Le labo et la collecte système

    Démarrez le labo du TP 1 Elastic Agent (Elasticsearch, Kibana, Fleet Server, un agent dans la politique lab-policy) et vérifiez que les logs système arrivent.

    Voir la correction
    cd lab-elastic-agent && docker compose --profile fleet --profile agent up -d
    curl -s -u elastic:changeme-elastic 'localhost:5601/api/fleet/agents' -H 'kbn-xsrf: true' | jq '.items[] | {hostname: .local_metadata.host.hostname, status}'
    curl -s -u elastic:changeme-elastic 'localhost:9200/_data_stream/logs-system.*-lab' | jq -r '.data_streams[].name'
  2. 2. La rétention de 30 jours

    Pourquoi ? Le modèle d'index dédié doit exister avant la création du data stream de l'application pour qu'il hérite de la politique ILM.

    Voir la correction
    curl -s -u elastic:changeme-elastic -X PUT localhost:9200/_ilm/policy/legacy-30j -H 'Content-Type: application/json' -d '{
      "policy": { "phases": {
        "hot": { "actions": { "rollover": { "max_age": "1d", "max_primary_shard_size": "10gb" } } },
        "delete": { "min_age": "30d", "actions": { "delete": {} } } } }
    }'
    curl -s -u elastic:changeme-elastic -X PUT localhost:9200/_index_template/logs-legacyapp -H 'Content-Type: application/json' -d '{
      "index_patterns": ["logs-legacyapp-*"], "data_stream": {}, "priority": 200,
      "composed_of": ["logs@mappings", "logs@settings", "ecs@mappings"],
      "template": { "settings": { "index.lifecycle.name": "legacy-30j" } }
    }'
  3. 3. Logstash pour l'application historique

    Générez un fichier de log, puis lancez Logstash sur le réseau du labo pour le structurer et l'envoyer dans logs-legacyapp-lab.
    Voir la correction
    mkdir -p legacy && cd legacy
    for i in $(seq 200); do s=$(shuf -n1 -e 200 200 200 404 500); l=INFO; [ $s = 500 ] && l=ERROR; echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) $l $s /api/commande/$i"; done > app.log
    cat > legacy.conf <<'EOF'
    input {
      file { path => "/data/app.log" start_position => "beginning" sincedb_path => "/dev/null" }
    }
    filter {
      dissect { mapping => { "message" => "%{ts} %{[log][level]} %{[http][response][status_code]} %{[url][path]}" } }
      date { match => ["ts", "ISO8601"] remove_field => ["ts"] }
      mutate { convert => { "[http][response][status_code]" => "integer" } }
      translate {
        source => "[http][response][status_code]"
        target => "[labels][statut]"
        dictionary => { "200" => "ok" "404" => "introuvable" "500" => "erreur" }
        fallback => "autre"
      }
    }
    output {
      elasticsearch {
        hosts => ["http://elasticsearch:9200"]
        user => "elastic"
        password => "changeme-elastic"
        data_stream => true
        data_stream_dataset => "legacyapp"
        data_stream_namespace => "lab"
      }
    }
    EOF
    docker run -d --name logstash-legacy --network lab-elastic-agent_default -e XPACK_MONITORING_ENABLED=false \
      -v $PWD/app.log:/data/app.log:ro -v $PWD/legacy.conf:/usr/share/logstash/pipeline/logstash.conf:ro \
      docker.elastic.co/logstash/logstash:9.1.0
    sleep 60; curl -s -u elastic:changeme-elastic 'localhost:9200/logs-legacyapp-lab/_count' | jq .count
    curl -s -u elastic:changeme-elastic 'localhost:9200/logs-legacyapp-lab/_ilm/explain' | jq '.indices[].policy'   # legacy-30j
  4. 4. Analyser et visualiser

    Écrivez les requêtes ES|QL du tableau de bord, puis construisez-le dans Kibana (Lens) : répartition des statuts, erreurs par minute, top des URL en erreur, volume de logs système par hôte.

    Voir la correction
    FROM logs-legacyapp-lab | STATS n = COUNT(*) BY labels.statut
    FROM logs-legacyapp-lab | WHERE log.level == "ERROR" | STATS erreurs = COUNT(*) BY minute = BUCKET(@timestamp, 1 minute)
    FROM logs-legacyapp-lab | WHERE http.response.status_code >= 500 | STATS n = COUNT(*) BY url.path | SORT n DESC | LIMIT 10
    FROM logs-system.*-lab | STATS lignes = COUNT(*) BY host.name
  5. 5. Alerter et sécuriser

    Créez une règle ES|QL qui alerte au-delà de 5 erreurs en 5 minutes (comme dans le TP d'alerte Kibana), puis un rôle et un utilisateur « lecteur » limités à la lecture des logs et du tableau de bord.

    Voir la correction
    FROM logs-legacyapp-lab
    | WHERE @timestamp > NOW() - 5 minutes AND log.level == "ERROR"
    | STATS erreurs = COUNT(*)
    | WHERE erreurs > 5
    curl -s -u elastic:changeme-elastic -X PUT localhost:5601/api/security/role/lecteur-logs -H 'kbn-xsrf: true' -H 'Content-Type: application/json' -d '{
      "elasticsearch": { "indices": [ { "names": ["logs-*"], "privileges": ["read", "view_index_metadata"] } ] },
      "kibana": [ { "base": [], "feature": { "dashboard": ["read"], "discover": ["read"] }, "spaces": ["default"] } ]
    }'
    curl -s -u elastic:changeme-elastic -X POST localhost:9200/_security/user/lecteur -H 'Content-Type: application/json' \
      -d '{ "password": "changeme-lecteur", "roles": ["lecteur-logs"] }' | jq .created
    # Nettoyage : docker rm -f logstash-legacy && docker compose --profile fleet --profile agent down -v

Niveau de difficulté : ●●●○○ (3/5)

Mon suivi

  • ⏱ Durée estimée : ≈ 2 h

Connectez-vous pour suivre votre progression et prendre des notes. Se connecter

💬 Questions sur cette leçon

Aucune question pour l'instant : soyez le premier à demander de l'aide ou à partager votre configuration.

Poser une question sur cette leçon →

Articles recommandés

Projet de parcours Elastic : centraliser et exploiter les journaux

Le projet de validation du parcours « Maîtrise de la suite Elastic » : Elastic Agent et Fleet, Lo...

Politiques d'agent, intégrations, data streams et pipelines

Construire des politiques d'agent, ajouter des intégrations (System, Nginx, Custom Logs), choisir...

Superviser, mettre à jour et dépanner Elastic Agent

Exploiter un parc d'Elastic Agent : états dans Fleet, supervision des agents, mises à jour par lo...

Elastic Observability : logs, infrastructure, APM et synthétiques

Les fonctions d'Elastic Observability : exploration des logs, inventaire d'infrastructure avec El...

Elastic Agent autonome, sorties Logstash et Kafka, et OpenTelemetry (EDOT)

Écrire une configuration autonome, envoyer vers Logstash ou Kafka, et utiliser Elastic Agent comm...

Elastic Agent : architecture, Fleet et intégrations

Comprendre Elastic Agent : agent unique de collecte, Fleet et Fleet Server, politiques d'agent, i...

Machine learning dans Elastic : détection d'anomalies et AIOps

Détecter automatiquement les comportements anormaux : jobs de détection d'anomalies, datafeeds, d...

Kibana : rôle, installation et premiers pas

Ce qu'est Kibana dans la suite Elastic, comment l'installer avec Elasticsearch (start-local, Dock...

Logstash en production : files persistantes, DLQ et multi-pipelines

Rendre Logstash fiable en production : file persistante, dead letter queue, plusieurs pipelines e...

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 !