La correction est intégrée au TP (Voir les encadrés de couleur vert)
Ce que vous allez apprendre dans ce TP
- Démarrer OpenSearch
- Déclarer les types
- Chercher et agréger
Introduction #
Ce que vous allez apprendre dans cette section
- Démarrer OpenSearch
- Déclarer les types
- Chercher et agréger
Contexte. Votre équipe veut un moteur de recherche de logs sous licence Apache 2.0. Vous évaluez OpenSearch sur une maquette.
Prérequis : Docker Compose, 4 Go de mémoire libre · Durée estimée : 45 min
Un nœud et sa console.Mise en place #
Étapes guidées, avec leur correction.
1. Démarrer la pile
Pourquoi ? Sans mot de passe fort, OpenSearch refuse de démarrer.
Écrivez.envet le Compose, réglezvm.max_map_count, puis vérifiez l'état du cluster.Voir la correction
OPENSEARCH_INITIAL_ADMIN_PASSWORD=Str0ng!Passw0rd-2026services: opensearch: image: opensearchproject/opensearch:3 environment: discovery.type: single-node OPENSEARCH_INITIAL_ADMIN_PASSWORD: ${OPENSEARCH_INITIAL_ADMIN_PASSWORD} OPENSEARCH_JAVA_OPTS: -Xms1g -Xmx1g path.repo: /usr/share/opensearch/data/snapshots ports: - "9200:9200" volumes: - os-data:/usr/share/opensearch/data dashboards: image: opensearchproject/opensearch-dashboards:3 environment: OPENSEARCH_HOSTS: '["https://opensearch:9200"]' ports: - "5601:5601" depends_on: [opensearch] volumes: os-data:sudo sysctl -w vm.max_map_count=262144 docker compose up -d curl -sk -u 'admin:Str0ng!Passw0rd-2026' -H 'Content-Type: application/json' https://localhost:9200/_cat/health?v2. Déclarer un modèle d'index
Pourquoi ? Le type d'un champ ne se change plus après la première écriture.
Créez un modèle pourlogs-app-*.Voir la correction
curl -sk -u 'admin:Str0ng!Passw0rd-2026' -H 'Content-Type: application/json' -X PUT https://localhost:9200/_index_template/logs_app -d '{ "index_patterns": ["logs-app-*"], "template": { "settings": {"number_of_shards": 1, "number_of_replicas": 0}, "mappings": {"properties": { "@timestamp": {"type": "date"}, "level": {"type": "keyword"}, "service": {"type": "keyword"}, "message": {"type": "text"}, "duree_ms": {"type": "integer"} }} } }'3. Indexer par lots
Pourquoi ?
Indexez trois documents, puis lisez le champ_bulkest le chemin normal des données.errorsde la réponse.Voir la correction
cat > lot.ndjson <<'EOF' {"index":{"_index":"logs-app-000001"}} {"@timestamp":"2026-11-04T10:00:00Z","level":"ERROR","service":"paiement","message":"timeout vers la banque utilisateur=alice","duree_ms":3100} {"index":{"_index":"logs-app-000001"}} {"@timestamp":"2026-11-04T10:00:01Z","level":"INFO","service":"paiement","message":"paiement accepté","duree_ms":120} {"index":{"_index":"logs-app-000001"}} {"@timestamp":"2026-11-04T10:00:02Z","level":"INFO","service":"panier","message":"article ajouté","duree_ms":40} EOF curl -sk -u 'admin:Str0ng!Passw0rd-2026' -H 'Content-Type: application/x-ndjson' \ -X POST 'https://localhost:9200/_bulk?refresh=true' --data-binary @lot.ndjson4. Chercher et agréger
Pourquoi ?
Cherchez « banque » dans le servicefilterest plus rapide quemustquand le score ne compte pas.paiement, puis calculez le p95 de la durée par service.Voir la correction
curl -sk -u 'admin:Str0ng!Passw0rd-2026' -H 'Content-Type: application/json' -X POST 'https://localhost:9200/logs-app-*/_search' -d '{ "query": {"bool": { "must": [{"match": {"message": "banque"}}], "filter": [{"term": {"service": "paiement"}}] }} }'curl -sk -u 'admin:Str0ng!Passw0rd-2026' -H 'Content-Type: application/json' -X POST 'https://localhost:9200/logs-app-*/_search' -d '{ "size": 0, "aggs": {"par_service": { "terms": {"field": "service"}, "aggs": {"p95": {"percentiles": {"field": "duree_ms", "percents": [95]}}} }} }'5. Essayer PPL et la console
Pourquoi ? PPL est très lisible pour explorer des logs.
Comptez les documents par niveau en PPL, puis retrouvez-les dans Discover surhttp://localhost:5601.Voir la correction
curl -sk -u 'admin:Str0ng!Passw0rd-2026' -H 'Content-Type: application/json' -X POST https://localhost:9200/_plugins/_ppl \ -d '{"query":"source=logs-app-* | where service=\"paiement\" | stats count() by level"}' curl -sk -u 'admin:Str0ng!Passw0rd-2026' -H 'Content-Type: application/json' -X POST https://localhost:9200/_plugins/_sql \ -d '{"query":"SELECT service, COUNT(*) n FROM logs-app-000001 GROUP BY service"}'
Niveau de difficulté : ●○○○○ (1/5)
Mon suivi
Connectez-vous pour suivre votre progression et prendre des notes. Se connecter
Articles recommandés
Installer OpenSearch et OpenSearch Dashboards
Installer OpenSearch avec Docker Compose ou l'archive : mot de passe initial, vm.max_map_count, c...
Indexer et chercher dans OpenSearch : mapping, DSL, PPL et SQL
Déclarer un modèle d'index, indexer avec bulk, chercher avec le Query DSL, agréger et interroger ...
OpenSearch Dashboards, alertes et observabilité
Explorer ses données dans OpenSearch Dashboards, créer des moniteurs d'alerte et découvrir Trace ...
OpenSearch : concepts, architecture et différences avec Elasticsearch
Comprendre OpenSearch : origine du projet, licence, différences avec Elasticsearch, index, shards...
OpenSearch en production : ISM, sauvegardes, sécurité et bonnes pratiques
Automatiser le cycle de vie avec ISM, sauvegarder par snapshots, gérer les rôles et dimensionner ...
Alimenter OpenSearch : pipelines d'ingestion et Data Prepper
Transformer les données avec les pipelines d'ingestion, collecter avec Data Prepper, recevoir l'O...
Installer Zabbix et superviser son premier hôte
Installer Zabbix avec Docker Compose (serveur, PostgreSQL, interface web), installer l'agent 2 su...
Kibana : rôle, installation et premiers pas
Ce qu'est Kibana dans la suite Elastic, comment l'installer avec Elasticsearch (start-local, Dock...
Query DSL et agrégations avancées Elasticsearch, avec ES|QL
Écrire des requêtes Elasticsearch avancées : bool, filter et score, nested, function_score et per...