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

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 !