RousselTMLEARNING

Observabilité

Tempo : générer des métriques à partir des traces (service graph, span metrics, exemplars)

Activer le metrics-generator de Tempo : service graphs, span metrics RED, remote write vers Prometheus ou Mimir, exemplars, TraceQL metrics et dashboards.

1. Activer le metrics-generator #

Configuration Tempo.

tempo.yaml #

Le metrics-generator de Tempo
Les métriques sont dérivées des traces : pas de double instrumentation.
metrics_generator:
  registry:
    external_labels:
      source: tempo
      cluster: lab
  storage:
    path: /var/tempo/generator/wal
    remote_write:
      - url: http://prometheus:9090/api/v1/write
        send_exemplars: true
  traces_storage:
    path: /var/tempo/generator/traces
  processor:
    span_metrics:
      dimensions: [http.method, http.route, http.status_code]
    service_graphs:
      dimensions: [deployment.environment]

overrides:
  defaults:
    metrics_generator:
      processors: [service-graphs, span-metrics, local-blocks]
# Prometheus doit accepter l'écriture distante et les exemplars
prometheus --web.enable-remote-write-receiver --enable-feature=exemplar-storage

2. Métriques produites #

RED et graphe de services.

Span metrics #

MétriqueTypeUsage
traces_spanmetrics_calls_totalCounterDébit et erreurs (label status_code)
traces_spanmetrics_latency_bucketHistogrammeLatences (quantiles)
traces_service_graph_request_totalCounterAppels entre services
traces_service_graph_request_failed_totalCounterÉchecs entre services
traces_service_graph_request_server_seconds_bucketHistogrammeLatence vue par le serveur
# Rate par service
sum by (service) (rate(traces_spanmetrics_calls_total{span_kind="SPAN_KIND_SERVER"}[$__rate_interval]))

# Taux d'erreurs
sum by (service) (rate(traces_spanmetrics_calls_total{status_code="STATUS_CODE_ERROR"}[$__rate_interval]))
  / sum by (service) (rate(traces_spanmetrics_calls_total[$__rate_interval]))

# Latence p95
histogram_quantile(0.95, sum by (le, service) (rate(traces_spanmetrics_latency_bucket[$__rate_interval])))

# Appels entre services (arêtes du graphe)
sum by (client, server) (rate(traces_service_graph_request_total[$__rate_interval]))

3. Exemplars et TraceQL metrics #

Passer d'un pic à la trace responsable.

Exemplars #

Un exemplar relie un point d'une métrique à un TraceID. Dans un panneau Grafana, activez Exemplars : un clic sur le point mène à la trace correspondante.

# datasource Prometheus : lien exemplar -> Tempo
jsonData:
  exemplarTraceIdDestinations:
    - name: trace_id
      datasourceUid: tempo

TraceQL metrics #

# Taux de spans en erreur par service, directement depuis les traces (sans Prometheus)
{ status = error } | rate() by (resource.service.name)

# Quantile de durée
{ resource.service.name = "checkout" } | quantile_over_time(duration, .95, .99) by (span.http.route)

# Histogramme de durées
{ kind = server } | histogram_over_time(duration)
Bonne Pratique : Les span metrics dépendent du nombre de dimensions configurées : limitez-les aux labels indispensables pour éviter une explosion de cardinalité.

Articles liés

Grafana Tempo : le backend de traces distribuées à grande échelle

Comprendre le tracing distribué et Grafana Tempo : traces, spans, TraceID, architecture (distributor, ingeste…

Installer Grafana Tempo (Docker Compose, binaire et Helm)

Installer Grafana Tempo : configuration tempo.yaml, Docker Compose avec Grafana et Prometheus, ports OTLP, vé…

Envoyer des traces vers Tempo : instrumentation OpenTelemetry et Alloy

Produire et acheminer des traces vers Tempo : auto-instrumentation Python/Java/Node, SDK manuel, variables d'…

Pour aller plus loin