Backend Integration: Jaeger, Prometheus e Grafana
Dopo aver instrumentato le applicazioni e configurato il Collector, il passo successivo e collegare i dati di telemetria ai backend di storage e visualizzazione. Lo stack open source più diffuso combina Jaeger per le tracce distribuite, Prometheus per le metriche e Grafana come layer di visualizzazione unificato. Insieme, questi strumenti formano un sistema di observability completo e production-ready.
In questo articolo configureremo l'intero stack da zero, dal deployment con Docker Compose alla creazione di dashboard Grafana che correlano tracce, metriche e log in un'unica interfaccia.
Cosa Imparerai in Questo Articolo
- Setup completo di Jaeger per il tracing distribuito
- Configurazione di Prometheus per la raccolta metriche
- Dashboard Grafana per la visualizzazione unificata
- Loki per la raccolta e query dei log
- Correlazione tra tracce, metriche e log in Grafana
- Deployment dello stack completo con Docker Compose
Lo Stack Completo con Docker Compose
Il modo più rapido per avviare l'intero stack di observability e usare Docker Compose. La configurazione seguente deploya tutti i componenti necessari con le connessioni già configurate:
# docker-compose.observability.yaml
version: "3.9"
services:
# --- OpenTelemetry Collector ---
otel-collector:
image: otel/opentelemetry-collector-contrib:0.96.0
command: ["--config=/etc/otel/config.yaml"]
volumes:
- ./otel-collector-config.yaml:/etc/otel/config.yaml
ports:
- "4317:4317" # OTLP gRPC
- "4318:4318" # OTLP HTTP
- "8889:8889" # Prometheus metrics export
- "13133:13133" # Health check
depends_on:
- jaeger
- loki
# --- Jaeger: Distributed Tracing Backend ---
jaeger:
image: jaegertracing/all-in-one:1.54
environment:
COLLECTOR_OTLP_ENABLED: "true"
SPAN_STORAGE_TYPE: "badger"
BADGER_EPHEMERAL: "false"
BADGER_DIRECTORY_VALUE: "/badger/data"
BADGER_DIRECTORY_KEY: "/badger/key"
volumes:
- jaeger_data:/badger
ports:
- "16686:16686" # Jaeger UI
- "14250:14250" # gRPC collector
# --- Prometheus: Metrics Backend ---
prometheus:
image: prom/prometheus:v2.50.0
command:
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.path=/prometheus"
- "--storage.tsdb.retention.time=30d"
- "--web.enable-remote-write-receiver"
- "--enable-feature=exemplar-storage"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
ports:
- "9090:9090"
# --- Loki: Log Aggregation ---
loki:
image: grafana/loki:2.9.4
command: -config.file=/etc/loki/local-config.yaml
volumes:
- ./loki-config.yaml:/etc/loki/local-config.yaml
- loki_data:/loki
ports:
- "3100:3100"
# --- Grafana: Visualization ---
grafana:
image: grafana/grafana:10.3.1
environment:
GF_SECURITY_ADMIN_USER: admin
GF_SECURITY_ADMIN_PASSWORD: observability
GF_FEATURE_TOGGLES_ENABLE: "traceqlEditor tempoSearch tempoBackendSearch"
volumes:
- ./grafana/provisioning:/etc/grafana/provisioning
- grafana_data:/var/lib/grafana
ports:
- "3000:3000"
depends_on:
- prometheus
- jaeger
- loki
volumes:
jaeger_data:
prometheus_data:
loki_data:
grafana_data:
Jaeger: Tracing Distribuito
Jaeger e il backend open source più usato per il tracing distribuito. Originariamente sviluppato da Uber e ora progetto della CNCF, Jaeger riceve le tracce dal Collector, le archivia e fornisce una UI per la ricerca, visualizzazione e analisi delle tracce distribuite.
L'integrazione con OpenTelemetry e nativa: Jaeger accetta dati OTLP direttamente, eliminando la necessità di conversioni. La UI di Jaeger offre la vista waterfall per le singole tracce, la comparazione tra tracce e la ricerca per servizio, operazione, durata e tag.
Funzionalità Principali di Jaeger
Trace Search: ricerca tracce per servizio, operazione, durata min/max, tag e time range.
Permette di trovare rapidamente le richieste problematiche.
Waterfall View: visualizzazione dettagliata di ogni span nella traccia, con
tempi, attributi, eventi e relazioni parent-child.
Trace Comparison: confronto side-by-side di due tracce per identificare differenze
nel comportamento tra una richiesta veloce e una lenta.
Service Dependencies: mappa automatica delle dipendenze tra servizi, derivata
dalle tracce raccolte.
Prometheus: Raccolta Metriche
Prometheus e il sistema di monitoring e alerting open source standard per le metriche. Usa un modello pull (scraping) per raccogliere metriche da endpoint HTTP, supporta un linguaggio di query potente (PromQL) e si integra nativamente con Grafana per la visualizzazione.
# prometheus.yml - Configurazione Prometheus
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
- "/etc/prometheus/rules/*.yml"
scrape_configs:
# Scraping del Collector OTel (metriche esportate)
- job_name: "otel-collector"
static_configs:
- targets: ["otel-collector:8889"]
scrape_interval: 10s
# Metriche interne del Collector
- job_name: "otel-collector-internal"
static_configs:
- targets: ["otel-collector:8888"]
# Scraping applicazioni con endpoint /metrics
- job_name: "applications"
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_port]
action: replace
target_label: __address__
regex: (.+)
replacement: "






