Jaeger Protobuf gRPC Exporter for OpenTelemetry
This library provides an OpenTelemetry trace exporter for Jaeger, specifically utilizing the Protobuf format over gRPC. It's part of the OpenTelemetry Python Contrib project. The current version is 1.21.0. New releases are frequent and typically align with the broader OpenTelemetry Python SDK release cycle.
Warnings
- gotcha The OpenTelemetry Python project uses a monorepo, where individual package versions on PyPI (e.g., `opentelemetry-exporter-jaeger-proto-grpc` v1.21.0) often differ from the overall project versions mentioned in GitHub release notes (e.g., v1.41.0). Always refer to the PyPI page for the specific package's version.
- gotcha There are two distinct Jaeger exporters for OpenTelemetry Python: `opentelemetry-exporter-jaeger` (uses Thrift over HTTP/UDP) and `opentelemetry-exporter-jaeger-proto-grpc` (uses Protobuf over gRPC). Ensure you install and import the correct one for your Jaeger backend setup.
- gotcha The Jaeger exporter requires a running Jaeger agent or collector reachable at the specified endpoint. If the agent/collector is not running or the endpoint is misconfigured, traces will not be exported, and the application might not raise explicit errors for this data loss.
- gotcha The `grpcio` and `protobuf` dependencies are critical for this exporter. Occasionally, these packages can have complex installation requirements or version conflicts in highly constrained environments. Ensure they install correctly.
- gotcha When manually shutting down the `TracerProvider` using `tracer_provider.shutdown()`, it's important to do so before your application exits. Otherwise, pending spans in the `BatchSpanProcessor` might not be flushed and could be lost.
Install
-
pip install opentelemetry-exporter-jaeger-proto-grpc
Imports
- JaegerExporter
from opentelemetry.exporter.jaeger.proto.grpc import JaegerExporter
Quickstart
import os
from opentelemetry import trace
from opentelemetry.sdk.resources import SERVICE_NAME, Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.jaeger.proto.grpc import JaegerExporter
# Configure tracing
resource = Resource.create({"service.name": os.environ.get("SERVICE_NAME", "my-python-app")})
tracer_provider = TracerProvider(resource=resource)
# Configure Jaeger Exporter (default endpoint: localhost:14250 for gRPC)
# Use OTEL_EXPORTER_JAEGER_ENDPOINT environment variable or endpoint param
jaeger_endpoint = os.environ.get("OTEL_EXPORTER_JAEGER_ENDPOINT", "localhost:14250")
jaeger_exporter = JaegerExporter(endpoint=jaeger_endpoint)
# Add the exporter to a BatchSpanProcessor and set it as the global tracer provider
span_processor = BatchSpanProcessor(jaeger_exporter)
tracer_provider.add_span_processor(span_processor)
trace.set_tracer_provider(tracer_provider)
# Get a tracer and create a span
tracer = trace.get_tracer(__name__)
with tracer.start_as_current_span("my-first-span"):
with tracer.start_as_current_span("my-nested-span"):
print("Hello from OpenTelemetry with Jaeger!")
# Manually shut down the tracer provider to ensure all spans are exported
tracer_provider.shutdown()
print(f"Traces exported to Jaeger endpoint: {jaeger_endpoint}")