RousselTMLEARNING

Observabilité

Relier traces et profils : span profiles avec Tempo et Pyroscope

Passer d'une trace lente au profil CPU exact de ce span : span profiles en Go et Java, configuration de la source Tempo (traces to profiles) et liens métriques → profils.

1. Principe des span profiles #

Le profil d'une seule requête.

Pourquoi #

Corrélation entre signaux
Chaque saut se fait en un clic dans Grafana si les signaux partagent leurs identifiants.

Une trace montre qu'un span a duré 2 s, mais pas pourquoi. Les span profiles attachent l'identifiant du span aux échantillons de profil collectés pendant son exécution. Depuis la trace, on ouvre le flame graph de ce span uniquement.

À savoir : Seuls les spans « racines » d'un service (le premier span local) sont annotés, pour limiter le surcoût. Le profil couvre le travail CPU du processus pendant ce span.

2. Instrumenter #

Go et Java.

Go #

go get github.com/grafana/otel-profiling-go
import otelpyroscope "github.com/grafana/otel-profiling-go"

tp := sdktrace.NewTracerProvider(sdktrace.WithBatcher(exporter))
// Enveloppe le TracerProvider : chaque span racine reçoit un label de profil
otel.SetTracerProvider(otelpyroscope.NewTracerProvider(tp))

pyroscope.Start(pyroscope.Config{ApplicationName: "checkout", ServerAddress: "http://pyroscope:4040"})

Java #

Avec l'agent OpenTelemetry Java, ajoutez l'extension pyroscope-otel en plus de l'agent Pyroscope :

java -javaagent:opentelemetry-javaagent.jar \
     -Dotel.javaagent.extensions=pyroscope-otel.jar \
     -Dpyroscope.application.name=orders \
     -Dpyroscope.server.address=http://pyroscope:4040 \
     -jar orders.jar

3. Configurer Grafana #

Le lien entre sources.

Source Tempo #

# provisioning/datasources/tempo.yaml
apiVersion: 1
datasources:
  - name: Tempo
    type: tempo
    uid: tempo
    url: http://tempo:3200
    jsonData:
      tracesToProfiles:
        datasourceUid: pyroscope
        profileTypeId: process_cpu:cpu:nanoseconds:cpu:nanoseconds
        tags: [{ key: service.name, value: service_name }]
  - name: Pyroscope
    type: grafana-pyroscope-datasource
    uid: pyroscope
    url: http://pyroscope:4040

Dans la vue d'une trace, un bouton Profiles for this span apparaît sur les spans annotés.

Bonne Pratique : Utilisez le même service_name dans les traces, les métriques, les logs et les profils : c'est la clé de toute corrélation dans Grafana.

Articles liés

Le profiling continu avec Grafana Pyroscope : pourquoi et comment

Le quatrième signal de l'observabilité : ce qu'est le profiling continu, les types de profils (CPU, mémoire, …

Architecture et déploiement de Grafana Pyroscope

Les composants de Pyroscope (distributor, ingester, querier, store-gateway, compactor), le stockage objet, le…

Instrumenter ses applications pour Pyroscope : SDK, Alloy et eBPF

Envoyer des profils à Pyroscope depuis Go, Java, Python et Node.js avec les SDK, collecter les points pprof a…

Pour aller plus loin