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

La stack LGTM (Loki, Grafana, Tempo, Mimir) : architecture et mise en place

Comprendre la stack LGTM de Grafana Labs : Loki pour les logs, Grafana pour la visualisation, Tempo pour les …

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é…

Pour aller plus loin

Soutenir

♥ SOUTENIR

Soutenez RousselTM Learning

Les formations, articles, TP et attestations restent gratuits et sans publicité intrusive. Une contribution libre, du montant de votre choix, finance l’hébergement, les environnements de TP et l’écriture de nouveaux contenus.

Contribuer avec PayPal Montant libre · carte bancaire ou compte PayPalEn savoir plus
QR code PayPal
Ou scannez ce QR code avec votre téléphone

Merci, chaque contribution compte !