Traces

Distributed Tracing verfolgt eine Anfrage über mehrere Services hinweg und ermöglicht die Analyse von Latenzen und Fehlerquellen.

Konzept

HTTP Request
    │
    ▼ Trace (trace_id)
  [dice-server]  ──Span──▶  [postgres]
       │
       └──Span──▶  [redis]

Jeder Span enthält: Service-Name, Dauer, Status, Attribute.

OTEL Traces mit Python (rolldice)

pip install opentelemetry-sdk opentelemetry-exporter-otlp
opentelemetry-bootstrap -a install
export OTEL_SERVICE_NAME="dice-server"
export OTEL_EXPORTER_OTLP_ENDPOINT="http://localhost:4318"
export OTEL_EXPORTER_OTLP_PROTOCOL="http/protobuf"

opentelemetry-instrument flask run -p 8080 -h 0.0.0.0

Alloy – Traces an Grafana Tempo weiterleiten

In config.alloy:

otelcol.receiver.otlp "default" {
  grpc { endpoint = "0.0.0.0:4317" }
  http { endpoint = "0.0.0.0:4318" }
  output {
    traces = [otelcol.exporter.otlp.tempo.input]
  }
}

otelcol.exporter.otlp "tempo" {
  client {
    endpoint = env("TEMPO_ENDPOINT")
    auth     = otelcol.auth.basic.grafana_cloud.handler
  }
}

otelcol.auth.basic "grafana_cloud" {
  username = env("TEMPO_USERNAME")
  password = env("TEMPO_PASSWORD")
}

Traces in Grafana Cloud abfragen

Grafana → Explore → Tempo:

service.name = "dice-server"
duration > 100ms
status = error

Trace-Waterfall zeigt alle Spans einer Anfrage mit Zeitstempeln und Attributen.

TraceQL

{ span.http.route = "/rolldice" && duration > 50ms }
{ .service.name = "dice-server" } | rate()