Backend Integration: Jaeger, Prometheus und Grafana
Nachdem Sie die Anwendungen instrumentiert und den Collector konfiguriert haben, ist der nächste Schritt Telemetriedaten verbinden mit Speicher- und Visualisierungs-Backend. Der Stapel beliebtesten Open-Source-Kombinationen Jäger für verteilte Tracks, Prometheus für Metriken und Grafana als Visualisierungsebene vereinheitlicht. Zusammen bilden diese Tools ein vollständiges, produktionsbereites Observability-System.
In diesem Artikel konfigurieren wir den gesamten Stack von Grund auf, beginnend mit der Bereitstellung mit Docker Compose bis hin zur Erstellung von Grafana-Dashboards, die Traces, Metriken und Protokolle in einer einzigen Schnittstelle korrelieren.
Was Sie in Diesem Artikel Lernen
- Komplettes Jaeger-Setup für verteiltes Tracing
- Prometheus-Konfiguration für die Metrikerfassung
- Grafana-Dashboard für einheitliche Visualisierung
- Loki zur Protokollerfassung und -abfrage
- Korrelation zwischen Traces, Metriken und Protokollen in Grafana
- Vollständige Stack-Bereitstellung mit Docker Compose
Der Full Stack mit Docker Compose
Der schnellste Weg, den gesamten Observability-Stack zu starten, ist die Verwendung von Docker Compose. Die Die folgende Konfiguration stellt alle erforderlichen Komponenten mit bereits konfigurierten Verbindungen bereit:
# 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
Jäger und das am weitesten verbreitete Open-Source-Backend für verteilte Ablaufverfolgung. Ursprünglich Jaeger wurde von Uber entwickelt und ist jetzt ein CNCF-Projekt. Es empfängt Spuren vom Collector und archiviert sie und bietet eine Benutzeroberfläche zum Suchen, Anzeigen und Analysieren verteilter Spuren.
Die Integration mit OpenTelemetry ist nativ: Jaeger akzeptiert OTLP-Daten direkt und entfällt die Notwendigkeit von Konvertierungen. Die Jaeger-Benutzeroberfläche bietet eine Wasserfallansicht für einzelne Titel. der Vergleich zwischen Titeln und die Suche nach Dienst, Betrieb, Dauer und Tag.
Hauptfunktionen von Jaeger
Spurensuche: Suche nach Titeln nach Dienst, Betrieb, minimaler/maximaler Dauer, Tag und Zeitbereich.
Damit können Sie problematische Anfragen schnell finden.
Blick auf den Wasserfall: Detailansicht jedes Spans im Trace, mit
Zeiten, Attribute, Ereignisse und Eltern-Kind-Beziehungen.
Trace-Vergleich: Direkter Vergleich zweier Tracks zur Identifizierung von Unterschieden
im Verhalten zwischen einer schnellen und einer langsamen Anfrage.
Dienstabhängigkeiten: Automatische Karte der Abhängigkeiten zwischen Diensten, abgeleitet
aus den gesammelten Spuren.
Prometheus: Raccolta Metriche
Prometheus und das standardmäßige Open-Source-Überwachungs- und Warnsystem für Metriken. Unterstützt die Verwendung eines Pull-Modells (Scraping), um Metriken von HTTP-Endpunkten zu sammeln eine leistungsstarke Abfragesprache (PromQL) und lässt sich nativ in Grafana integrieren Visualisierung.
# prometheus.yml - Konfiguration 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: "${1}:${2}"
# Scraping Jaeger
- job_name: "jaeger"
static_configs:
- targets: ["jaeger:14269"]
# Scraping Prometheus stesso
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
Grafana: Visualizzazione Unificata
Grafana und die Visualisierungsebene, die Traces, Metriken und Anmeldungen vereinheitlicht eine einzige Schnittstelle. Unterstützt nativ Jaeger, Prometheus und Loki als Datenquellen, So können Sie Dashboards erstellen, die alle Telemetriesignale korrelieren.
# grafana/provisioning/datasources/datasources.yml
apiVersion: 1
datasources:
# Prometheus per le metriche
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
isDefault: true
jsonData:
exemplarTraceIdDestinations:
- name: traceID
datasourceUid: jaeger
httpMethod: POST
# Jaeger per le tracce
- name: Jaeger
type: jaeger
access: proxy
url: http://jaeger:16686
uid: jaeger
jsonData:
tracesToLogsV2:
datasourceUid: loki
filterByTraceID: true
filterBySpanID: true
tracesToMetrics:
datasourceUid: Prometheus
# Loki per i log
- name: Loki
type: loki
access: proxy
url: http://loki:3100
uid: loki
jsonData:
derivedFields:
- datasourceUid: jaeger
matcherRegex: "trace_id=(\\w+)"
name: TraceID
url: "${__value.raw}"
Signal-Korrelation in Grafana
Die wahre Leistungsfähigkeit von Grafana zeigt sich, wenn die drei Datenquellen für die konfiguriert werden Korrelation. Das bedeutet, dass man von einer Metrik zu einem Track navigieren kann, von einer Ablaufverfolgung zu den Protokollen und umgekehrt, in einem kontinuierlichen Debug-Fluss.
Korrelations-Workflow in Grafana
Metrik-Dashboard: Sehen Sie einen Anstieg der P99-Latenz →
Klicken Sie in der Grafik auf „Exemplar“ → Eröffnungsstück in Jaeger →
Identifizieren Sie die langsame Zeitspanne (Zahlungsgateway) → klicken Sie auf „Protokolle anzeigen“ →
Öffnen gefilterter Protokolle in Loki Mit der Trace_ID → finden Sie die Nachricht
Fehler „Verbindungszeitüberschreitung zum Zahlungsanbieter“.
Dieser Ablauf verkürzt das Debuggen von Stunden auf Minuten.
Loki: Protokollaggregation
Loki und das Log-Aggregationssystem von Grafana, das darauf ausgelegt ist kostengünstig und einfach zu bedienen. Im Gegensatz zu Elasticsearch indiziert Loki nur die Etiketten (Metadaten), nicht den vollständigen Inhalt der Protokolle, wodurch die Kosten drastisch gesenkt werden Speicher- und Betriebskomplexität.
# loki-config.yaml
auth_enabled: false
server:
http_listen_port: 3100
common:
path_prefix: /loki
storage:
filesystem:
chunks_directory: /loki/chunks
rules_directory: /loki/rules
replication_factor: 1
ring:
kvstore:
store: inmemory
schema_config:
configs:
- from: 2024-01-01
store: tsdb
object_store: filesystem
schema: v13
index:
prefix: index_
period: 24h
limits_config:
reject_old_samples: true
reject_old_samples_max_age: 168h
max_query_series: 500
max_query_parallelism: 2
analytics:
reporting_enabled: false
Wesentliche Abfragen für Jedes Backend
- Jaeger: ricerca per service, operation, min/max duration, tags (es.
error=true) - Prometheus (PromQL):
rate(http_requests_total[5m]),histogram_quantile(0.99, ...) - Loki (LogQL):
{service="order-service"} |= "error" | json | trace_id != "" - Grafana Explore: split view per confrontare metriche e tracce side-by-side
Fazit und Nächste Schritte
Der Jaeger + Prometheus + Loki + Grafana-Stack bietet ein vollständiges Beobachtbarkeitssystem. Open Source und produktionsbereit. Der Schlüssel zum Erfolg ist Korrelation: konfigurieren Datenquellen in Grafana, um nahtlos zwischen Metriken, Traces und Protokollen zu navigieren und diese zu transformieren Debugging von einem zeitaufwändigen, manuellen Prozess zu einem schnellen, geführten Ablauf.
Docker Compose eignet sich ideal zum Entwickeln und Testen, während in der Produktion der Stack bereitgestellt wird auf Kubernetes mit dedizierten Helm-Charts (Jaeger-Operator, Kube-Prometheus-Stack, Loki-Stack).
Im nächsten Artikel werden wir tiefer in die Materie eintauchen Kontextausbreitung, analysieren wie Korrelieren Sie Protokolle und Spuren über die Trace-ID, das W3C-Gepäckprotokoll für den Transport Metadaten zwischen Diensten und Muster für eine effektive Korrelation zwischen allen Signalen.







