OpenTelemetry Jaeger Exporter
The `opentelemetry-exporter-jaeger` library provides exporters for sending OpenTelemetry trace data to Jaeger. It supports sending spans via UDP to a Jaeger Agent (default) or over HTTP to a Jaeger Collector using the Thrift protocol. Part of the broader OpenTelemetry Python project, it undergoes regular releases, typically aligned with `opentelemetry-sdk` and `opentelemetry-api` updates, ensuring compatibility with the latest OpenTelemetry specifications. The current version is 1.41.0.
Warnings
- gotcha The default `JaegerExporter` sends spans via UDP to a Jaeger Agent, typically on `localhost:6831`. If you need to send spans over HTTP to a Jaeger Collector, you must explicitly use `JaegerHttpExporter` and configure its endpoint.
- gotcha Providing meaningful resource attributes, especially `SERVICE_NAME`, is critical for effectively identifying and filtering your services and applications within the Jaeger UI. Without it, all spans might appear under a generic name.
- breaking The OpenTelemetry Python SDK, which this exporter relies on, frequently updates its API and internal behavior across major/minor versions. For example, `v1.40.0` included a fix for `NoOpTracer` behavior for `start_span` and `start_as_current_span`, which could subtly affect applications not using a full SDK setup.
- gotcha Exporters typically use environment variables (e.g., `OTEL_EXPORTER_JAEGER_AGENT_HOST`, `OTEL_EXPORTER_JAEGER_AGENT_PORT`, `OTEL_EXPORTER_JAEGER_ENDPOINT`) for configuration when using auto-instrumentation or `configure_opentelemetry()`. Programmatic configuration, as shown in the quickstart, will override these.
Install
-
pip install opentelemetry-exporter-jaeger opentelemetry-sdk
Imports
- JaegerExporter
from opentelemetry.exporter.jaeger.thrift import JaegerExporter
- JaegerHttpExporter
from opentelemetry.exporter.jaeger.thrift import JaegerHttpExporter
- TracerProvider
from opentelemetry.sdk.trace import TracerProvider
- BatchSpanProcessor
from opentelemetry.sdk.trace.export import BatchSpanProcessor
- Resource
from opentelemetry.sdk.resources import Resource
- SERVICE_NAME
from opentelemetry.sdk.resources import SERVICE_NAME
Quickstart
import os
from opentelemetry import trace
from opentelemetry.sdk.resources import Resource, SERVICE_NAME
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.jaeger.thrift import JaegerExporter
# Configure resource for your service
resource = Resource.create({
SERVICE_NAME: os.environ.get('OTEL_SERVICE_NAME', 'my-jaeger-service'),
})
# Configure TracerProvider
provider = TracerProvider(resource=resource)
# Configure Jaeger Exporter (UDP to local agent by default)
# Use environment variables for agent host/port or pass them directly:
# JAEGER_AGENT_HOST, JAEGER_AGENT_PORT
# For HTTP Exporter, use JaegerHttpExporter and JAEGER_COLLECTOR_ENDPOINT
jaeger_exporter = JaegerExporter(
agent_host_name=os.environ.get('JAEGER_AGENT_HOST', 'localhost'),
agent_port=int(os.environ.get('JAEGER_AGENT_PORT', 6831)),
)
# Add the exporter to a BatchSpanProcessor
span_processor = BatchSpanProcessor(jaeger_exporter)
provider.add_span_processor(span_processor)
# Set the global tracer provider
trace.set_tracer_provider(provider)
# Get a tracer and create spans
tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span('my-operation') as span:
span.set_attribute('event', 'started')
print(f"Hello from span: {span.context.trace_id}")
with tracer.start_as_current_span('inner-operation'):
print("Inside inner operation")
span.set_attribute('event', 'finished')
# Ensure all spans are exported before exiting
provider.force_flush()
print("Traces exported to Jaeger.")