RousselTMLEARNING

TP · OpenSearch: del descubrimiento a la maestría

Práctica: pipeline de ingesta y Data Prepper con corrección

La corrección está integrada en el TP (Ver los recuadros verdes)

Lo que vas a aprender en este TP
  • Crear y simular un pipeline
  • Desplegar Data Prepper
  • Tipar bien los campos

Introducción #

Lo que vas a aprender en esta sección
  • Crear y simular un pipeline
  • Desplegar Data Prepper
  • Tipar bien los campos

Contexto. Tus logs llegan mal estructurados. Los normalizas primero en el clúster y después con un colector dedicado.

Requisitos: la práctica anterior  ·  Duración estimada: 45 min

Datos limpios y bien tipados.

Puesta en marcha #

Pasos guiados, con su corrección.

  1. 1. Crear y simular un pipeline

    ¿Por qué? _simulate evita estropear datos.

    Crea el pipeline y pruébalo sin indexar nada.
    Ver la corrección
    curl -sk -u 'admin:Str0ng!Passw0rd-2026' -H 'Content-Type: application/json' -X PUT https://localhost:9200/_ingest/pipeline/logs_nettoyage -d '{
      "description": "Normalise le niveau et extrait l utilisateur",
      "processors": [
        {"lowercase": {"field": "level"}},
        {"set": {"field": "environnement", "value": "prod"}},
        {"grok": {"field": "message", "patterns": ["utilisateur=%{WORD:utilisateur}"], "ignore_failure": true}}
      ]
    }'
    
    # Essayer sans rien indexer
    curl -sk -u 'admin:Str0ng!Passw0rd-2026' -H 'Content-Type: application/json' -X POST https://localhost:9200/_ingest/pipeline/logs_nettoyage/_simulate \
      -d '{"docs":[{"_source":{"level":"ERROR","message":"refus utilisateur=alice"}}]}'
  2. 2. Aplicarlo

    ¿Por qué? El pipeline se elige al escribir.

    Reindexa el lote de la práctica anterior con el pipeline y busca el documento del usuario alice.
    Ver la corrección
    curl -sk -u 'admin:Str0ng!Passw0rd-2026' -H 'Content-Type: application/x-ndjson' \
      -X POST 'https://localhost:9200/_bulk?pipeline=logs_nettoyage&refresh=true' --data-binary @lot.ndjson
    curl -sk -u 'admin:Str0ng!Passw0rd-2026' -H 'Content-Type: application/json' -X POST 'https://localhost:9200/logs-app-*/_search' -d '{"query":{"term":{"utilisateur.keyword":"alice"}}}'
  3. 3. Preparar los tipos

    ¿Por qué? Sin plantilla, clientip sería texto y la búsqueda por red fallaría.

    Crea la plantilla de web-logs.
    Ver la corrección
    curl -sk -u 'admin:Str0ng!Passw0rd-2026' -H 'Content-Type: application/json' -X PUT https://localhost:9200/_index_template/web_logs -d '{
      "index_patterns": ["web-logs*"],
      "template": {
        "settings": {"number_of_shards": 1, "number_of_replicas": 0},
        "mappings": {"properties": {
          "@timestamp": {"type": "date"},
          "clientip": {"type": "ip"},
          "verb": {"type": "keyword"},
          "request": {"type": "keyword"},
          "response": {"type": "integer"},
          "bytes": {"type": "integer"}
        }}
      }
    }'
  4. 4. Desplegar Data Prepper

    ¿Por qué? El procesamiento sale del clúster y descarga sus nodos.

    Escribe pipelines.yaml, añade el servicio e inícialo.
    Ver la corrección
    log-pipeline:
      source:
        http:
          ssl: false
          port: 2021
          path: /log/ingest
      processor:
        - grok:
            match:
              log: ['%{COMMONAPACHELOG}']
        - date:
            match:
              - key: timestamp
                patterns: ["dd/MMM/yyyy:HH:mm:ss Z"]
            destination: "@timestamp"
        - convert_type:
            key: response
            type: integer
        - delete_entries:
            with_keys: ["log"]
      sink:
        - opensearch:
            hosts: ["https://opensearch:9200"]
            insecure: true
            username: admin
            password: "Str0ng!Passw0rd-2026"
            index: web-logs
            flush_timeout: 5000
    services:
      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]
    
      data-prepper:
        image: opensearchproject/data-prepper:2
        ports:
          - "2021:2021"
        volumes:
          - ./pipelines.yaml:/usr/share/data-prepper/pipelines/pipelines.yaml:ro
        depends_on: [opensearch]
    
    volumes:
      os-data:
    docker compose up -d
  5. 5. Enviar y comprobar

    ¿Por qué? La búsqueda por red demuestra que el tipo ip está en su sitio.

    Envía dos líneas de log, espera unos segundos y busca las direcciones de 10.0.0.0/8.
    Ver la corrección
    curl -s -X POST -H 'Content-Type: application/json' http://localhost:2021/log/ingest -d '[
      {"log":"127.0.0.1 - frank [04/Nov/2026:10:00:00 +0100] \"GET /index.html HTTP/1.1\" 200 2326"},
      {"log":"10.0.0.8 - alice [04/Nov/2026:10:00:01 +0100] \"GET /admin HTTP/1.1\" 403 120"}
    ]'
    sleep 10
    curl -sk -u 'admin:Str0ng!Passw0rd-2026' -H 'Content-Type: application/json' -X POST https://localhost:9200/web-logs/_search -d '{"query":{"term":{"clientip":"10.0.0.0/8"}}}'
    curl -sk -u 'admin:Str0ng!Passw0rd-2026' -H 'Content-Type: application/json' https://localhost:9200/web-logs/_mapping

Nivel de dificultad : ●●○○○ (2/5)

Mi seguimiento

  • ⏱ Duración estimada : ≈ 45 min

Inicia sesión para seguir tu progreso y tomar notas. Iniciar sesión

💬 Hacer una pregunta

Artículos recomendados

Alimenter OpenSearch : pipelines d'ingestion et Data Prepper

Transformer les données avec les pipelines d'ingestion, collecter avec Data Prepper, recevoir l'O...

OpenSearch : concepts, architecture et différences avec Elasticsearch

Comprendre OpenSearch : origine du projet, licence, différences avec Elasticsearch, index, shards...

Data streams et templates Elasticsearch : component templates, index templates et séries temporelles

Gérer les données horodatées avec les data streams : index templates et component templates, conv...

Index Lifecycle Management (ILM) : data tiers, rollover et rétention

Automatiser le cycle de vie des index avec ILM : data tiers hot, warm, cold et frozen, rollover p...

Kibana avancé : data views, Lens, dashboards, alerting et reporting

Exploiter Kibana en profondeur : data views et champs runtime, Discover, Lens et formules, dashbo...

Les Data Sources dans Grafana : Connectez et unifiez vos données

Apprenez à étendre les capacités de Grafana via les Data Sources. Découvrez les plugins essentiel...

Fluent Bit : les outputs (sorties), routage et fiabilité de l'envoi

Envoyer les données de Fluent Bit : routage par Match et Match_Regex, sorties Loki, Elasticsearch...

Logs Datadog avancés : index, filtres d'exclusion, Flex Logs, archives et Sensitive Data Scanner

Maîtriser coût et conformité des logs Datadog : pipelines et processeurs, index et rétention, fil...

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 ...

Apoyar

♥ APOYAR

Apoya RousselTM Learning

Los cursos, artículos, prácticas y certificados siguen siendo gratuitos y sin publicidad intrusiva. Una contribución libre, por el importe que elijas, financia el alojamiento, los entornos de prácticas y nuevos contenidos.

Contribuir con PayPal Importe libre · tarjeta o cuenta PayPalMás información
QR code PayPal
O escanea este código QR con tu teléfono

¡Gracias, cada contribución cuenta!