1. Principe des span profiles #
Le profil d'une seule requête.
Pourquoi #
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-goimport 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.jar3. 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:4040Dans 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.