A library providing profiling functionalities related to OpenTelemetry
Project description
Span Profiles Support for OpenTelemetry in Python
This package links OpenTelemetry tracing data with Pyroscope continuous profiling data, enabling you to correlate traces with performance profiles.
Reference: https://grafana.com/docs/pyroscope/latest/configure-client/trace-span-profiles/
Prerequisites
- Your Python application is instrumented with Pyroscope profiler
- Your Python application is instrumented with OpenTelemetry
Installation
pip install pyroscope-otel
Pyroscope Configuration (Required)
Pyroscope must be configured before creating any spans. This is mandatory for all setups:
from pyroscope import configure as pyroscope_configure
# Local setup (default)
pyroscope_configure(
app_name="my-app",
server_address="http://localhost:4040",
sample_rate=100,
)
# Grafana Cloud setup (uncomment and update with your credentials)
# pyroscope_configure(
# app_name="my-app",
# server_address="https://pyroscope-blocks-prod-us-central-1.grafana-cloud.com/prom/push",
# auth_token="<your-grafana-cloud-token>",
# basic_auth_username="<your-username>", # Optional: username for basic auth (Grafana Cloud)
# basic_auth_password="<your-password>", # Optional: password for basic auth (Grafana Cloud)
# sample_rate=100,
# )
How It Works & Span Attributes
The PyroscopeSpanProcessor automatically attaches the profile identifier (pyroscope.profile.id) as an attribute to the root span of each trace. This creates a direct link between traces and their corresponding performance profiles in Grafana Tempo, allowing you to navigate from any trace to the exact performance profile data for that transaction.
Manual Instrumentation
Configure OpenTelemetry explicitly (after Pyroscope is already configured):
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from pyroscope.otel import PyroscopeSpanProcessor
# Configure OpenTelemetry
provider = TracerProvider()
provider.add_span_processor(PyroscopeSpanProcessor())
# TODO: Add your trace exporter configuration here
# (e.g., Grafana Tempo OTLP exporter, etc.)
# from opentelemetry.sdk.trace.export import BatchSpanProcessor
# provider.add_span_processor(BatchSpanProcessor(your_exporter))
trace.set_tracer_provider(provider)
# Use tracing in your application
tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span("my_operation"):
# Your code here
pass
Automatic Instrumentation
When using auto-instrumentation (e.g., opentelemetry-distro), you must still register PyroscopeSpanProcessor manually (after Pyroscope is already configured):
from opentelemetry import trace
from pyroscope.otel import PyroscopeSpanProcessor
# After auto-instrumentation is initialized
provider = trace.get_tracer_provider()
provider.add_span_processor(PyroscopeSpanProcessor())
Note: Auto-instrumentation only handles OpenTelemetry setup. Pyroscope configuration is still required.
Grafana Cloud OpenTelemetry Exporter (Optional)
# OpenTelemetry exporter for Grafana Cloud / Grafana Tempo
# from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
#
# otlp_exporter = OTLPSpanExporter(
# endpoint="<your-tempo-instance>.grafana.net:443",
# headers=(("Authorization", "Bearer <your-grafana-cloud-token>"),),
# )
# provider.add_span_processor(BatchSpanProcessor(otlp_exporter))
Integration Checklist
- ✅ Pyroscope configured with
pyroscope_configure() - ✅ OpenTelemetry
TracerProvidercreated - ✅
PyroscopeSpanProcessorregistered withadd_span_processor() - ✅ Trace exporter configured (Grafana Tempo, etc.)
- ✅ Application instrumented with OpenTelemetry
- ✅ Verify
pyroscope.profile.idappears in span attributes in Grafana Tempo
Troubleshooting
| Issue | Solution |
|---|---|
pyroscope.profile.id not in spans |
Ensure PyroscopeSpanProcessor was registered with add_span_processor() |
| Profiles not appearing in Pyroscope | Verify pyroscope_configure() is called before creating spans |
| Traces not exporting | Check trace exporter configuration and credentials |
| Auto-instrumentation not working | Manually add PyroscopeSpanProcessor() after initializing the provider |
References
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pyroscope_otel-1.0.0.tar.gz.
File metadata
- Download URL: pyroscope_otel-1.0.0.tar.gz
- Upload date:
- Size: 13.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
43de0314e8d146de3378e6add2d80f2aa118b56974e8cb99f17a50ce76573546
|
|
| MD5 |
f5bbba5fbaf3e358951ed4dde690de68
|
|
| BLAKE2b-256 |
d986a3a65272005b72610ebc6019090e7dabbdd26d075864acdd58536040c2ce
|
File details
Details for the file pyroscope_otel-1.0.0-py3-none-any.whl.
File metadata
- Download URL: pyroscope_otel-1.0.0-py3-none-any.whl
- Upload date:
- Size: 11.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b4282af41cfbb7211acfe3ce21f76cb34681694d210f1a97ac941ad60ef0f35c
|
|
| MD5 |
6f66cb49ac3125f262049a8556f67d09
|
|
| BLAKE2b-256 |
f6ebe8858a7c302a8305ff40121ba7f62d6f17dea8b7011a6de7ae9573774be3
|