1. Activer le metrics-generator #
Configuration Tempo.
tempo.yaml #
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-storage2. Métriques produites #
RED et graphe de services.
Span metrics #
| Métrique | Type | Usage |
|---|---|---|
traces_spanmetrics_calls_total | Counter | Débit et erreurs (label status_code) |
traces_spanmetrics_latency_bucket | Histogramme | Latences (quantiles) |
traces_service_graph_request_total | Counter | Appels entre services |
traces_service_graph_request_failed_total | Counter | Échecs entre services |
traces_service_graph_request_server_seconds_bucket | Histogramme | Latence 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: tempoTraceQL 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é.
