RousselTMLEARNING

TP · Alloy: del descubrimiento a la maestría

Práctica: recopilación y envío de logs a Loki con corrección

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

Lo que vas a aprender en este TP
  • Leer archivos de logs
  • Extraer y añadir etiquetas
  • Enviar a Loki y comprobar

Introducción #

Lo que vas a aprender en esta sección
  • Leer archivos de logs
  • Extraer y añadir etiquetas
  • Enviar a Loki y comprobar

Contexto. Una aplicación escribe sus logs JSON en archivos y nadie los consulta hasta el incidente. Los centralizas en Loki.

Requisitos: Docker Compose, curl  ·  Duración estimada: 30 min

Logs consultables por nivel y entorno.

Pipeline de logs #

Pasos guiados, con su corrección.

  1. 1. Preparar la pila

    ¿Por qué? El volumen conserva las posiciones de lectura: sin él, Alloy lo releería todo en cada reinicio.

    Escribe un Compose con Loki y Alloy.
    Ver la corrección
    services:
      loki:
        image: grafana/loki:latest
        command: -config.file=/etc/loki/local-config.yaml
        ports:
          - "3100:3100"
    
      alloy:
        image: grafana/alloy:v1.21.3
        command: run --server.http.listen-addr=0.0.0.0:12345 --storage.path=/var/lib/alloy/data /etc/alloy/config.alloy
        ports:
          - "12345:12345"
        volumes:
          - ./config.alloy:/etc/alloy/config.alloy:ro
          - ./logs:/var/log/myapp:ro
          - alloy-data:/var/lib/alloy/data
        depends_on: [loki]
    
    volumes:
      alloy-data:
  2. 2. Leer los archivos

    ¿Por qué? local.file_match encuentra los archivos, loki.source.file los lee y memoriza su posición.

    En config.alloy, lee /var/log/myapp/*.log con la etiqueta job=myapp.
    Ver la corrección
    local.file_match "app" {
      path_targets = [{ "__path__" = "/var/log/myapp/*.log", "job" = "myapp" }]
    }
    
    loki.source.file "app_logs" {
      targets    = local.file_match.app.targets
      forward_to = [loki.process.app.receiver]
    }
  3. 3. Procesar las líneas

    ¿Por qué? stage.labels toma un valor extraído; un valor fijo requiere stage.static_labels.

    Extrae level del JSON para convertirlo en etiqueta, añade env=production y conserva msg como texto.
    Ver la corrección
    loki.process "app" {
      forward_to = [loki.write.local_loki.receiver]
    
      stage.json {
        expressions = { level = "", msg = "" }
      }
    
      stage.labels {
        values = { level = "" }
      }
    
      stage.static_labels {
        values = { env = "production" }
      }
    
      stage.output {
        source = "msg"
      }
    }
  4. 4. Enviar a Loki

    ¿Por qué? En la red de Compose, a Loki se llega por su nombre de servicio.

    Añade el componente de envío.
    Ver la corrección
    loki.write "local_loki" {
      endpoint {
        url = "http://loki:3100/loki/api/v1/push"
      }
    }
  5. 5. Comprobar

    ¿Por qué? Un componente healthy no demuestra que lleguen los datos.

    Crea un archivo de logs, inicia la pila y consulta Loki: debes ver las etiquetas env y level, y los textos paiement refusé y commande créée.
    Ver la corrección
    mkdir -p logs
    cat >> logs/app.log <<'EOF'
    {"level":"error","msg":"paiement refusé"}
    {"level":"info","msg":"commande créée"}
    EOF
    docker compose up -d
    sleep 20
    curl -s http://localhost:3100/loki/api/v1/labels
    curl -s -G http://localhost:3100/loki/api/v1/query_range \
      --data-urlencode 'query={job="myapp",env="production"}' \
      --data-urlencode "start=$(( $(date +%s)-600 ))000000000"

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

Mi seguimiento

  • ⏱ Duración estimada : ≈ 30 min

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

💬 Hacer una pregunta

Glossaire de la formation

Observabilidad

La capacidad de conocer el estado interno de un sistema a partir de los datos que emite.Estos datos se clasifican en 3 pilares: logs (registros)métric...

Trazas distribuidas

Técnica (proveniente del pilar de Trazas) que permite seguir el recorrido completo de una solicitud a través de múltiples microservicios para identifi...

Métricas

Medidas numéricas recopiladas a intervalos regulares (ej: CPU, RAM, tiempo de respuesta) utilizadas para evaluar el estado de salud general de un sist...

Perfilado continuo (Continuous Profiling)

Análisis constante de la ejecución de código en producción para identificar con precisión qué líneas de código o funciones consumen más recursos (CPU,...

Access Log (Registro de acceso)

Archivo de registro que guarda las solicitudes procesadas por un servidor web (Apache, Nginx, Lighttpd, etc.). Permite rastrear la actividad del servi...

Client IP (IP del Cliente)

La dirección IP del usuario que realiza la solicitud hacia el servidor web. Cuando un usuario pasa por un Load Balancer o un proxy (ej: Cloudflare), l...

Timestamp (Marca de tiempo)

La fecha y la hora exactas en las que el servidor recibió la solicitud.Configuración: %t en Apache, $time_local o $time_iso8601 en Nginx.

Request (Solicitud)

La línea de solicitud inicial del cliente. Generalmente incluye el método HTTP (ej: GET), la URL solicitada y la versión del protocolo HTTP.Configurac...

Status Code (Código de estado)

El código de estado HTTP final devuelto por el servidor al cliente (ej: 200 para un éxito, 404 para recurso no encontrado).Configuración: %>s en Apach...

Size (Tamaño)

El volumen de datos devuelto al cliente, medido en bytes (generalmente sin los encabezados HTTP).Configuración: %b u %O en Apache, $body_bytes_sent en...

Referrer (Referente)

La URL de la página web desde la que el cliente hizo clic o siguió un enlace para acceder al recurso actual.Configuración: %{Referer}i en Apache, $htt...

User-Agent

La información de identificación proporcionada por el cliente sobre su navegador, su sistema operativo y su dispositivo. Su estructura estándar a menu...

Response Time (Tiempo de respuesta)

El tiempo total que tarda el servidor en procesar la solicitud y devolver la respuesta al cliente.Configuración: %D (microsegundos) o %T (segundos) en...

Artículos recomendados

Grafana Alloy : Collecter les métriques système et les logs locaux

Découvrez comment configurer Grafana Alloy pour superviser le serveur sur lequel il s'exécute, av...

Grafana Alloy vs Grafana Agent vs Promtail : Lequel choisir ?

Découvrez l'évolution des collecteurs de télémétrie de l'écosystème Grafana. Comparatif détaillé ...

Grafana Loki vs Elasticsearch : La bataille du stockage de logs

Comparatif entre Loki, le système de logs inspiré par Prometheus, et Elasticsearch, le moteur de ...

Grafana Alloy : L'importance de l'auto-supervision (Self-Monitoring)

Découvrez pourquoi et comment configurer Grafana Alloy pour qu'il se supervise lui-même, en colle...

LogQL (1/2) : requêter les logs (sélecteurs, filtres et parsers)

Apprendre LogQL : sélecteurs de flux, filtres de ligne, parsers json/logfmt/pattern/regexp, filtr...

LogQL (2/2) : transformer les logs en métriques

Créer des métriques à partir des logs avec LogQL : rate, count_over_time, bytes_rate, agrégations...

Bonnes pratiques de collecte de logs avec Fluent Bit et Vector

Check-list de production pour la collecte de logs : structure, filtrage à la source, masquage, ta...

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

Projet fil rouge : les quatre signaux de l'OpenTelemetry Demo dans la stack Grafana

Un projet fil rouge qui traverse les formations d'observabilité : déployer l'OpenTelemetry Demo, ...

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!