OpenTelemetry Python API

1.40.0 · active · verified Wed Mar 25

OpenTelemetry Python API package. Current version: 1.40.0 (Mar 2026). TWO separate packages: 'opentelemetry-api' (interfaces + no-op implementations) and 'opentelemetry-sdk' (actual implementation). Installing only opentelemetry-api produces silent no-ops — all tracing calls succeed but nothing is recorded or exported. Must also install opentelemetry-sdk AND configure a TracerProvider AND call trace.set_tracer_provider(). Exporters (OTLP, Jaeger, Zipkin) are separate packages. All packages must be the same version.

Warnings

Install

Imports

Quickstart

OpenTelemetry Python — TracerProvider setup with ConsoleSpanExporter.

# pip install opentelemetry-api opentelemetry-sdk
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor, ConsoleSpanExporter
from opentelemetry.sdk.resources import Resource

# Setup — do this once at app startup
resource = Resource.create({'service.name': 'my-service', 'service.version': '1.0.0'})
provider = TracerProvider(resource=resource)

# ConsoleSpanExporter for local dev — replace with OTLPSpanExporter in production
provider.add_span_processor(BatchSpanProcessor(ConsoleSpanExporter()))

# Register globally — MUST be before any trace.get_tracer() calls
trace.set_tracer_provider(provider)

# Get tracer
tracer = trace.get_tracer(__name__)

# Create spans
with tracer.start_as_current_span('main-operation') as span:
    span.set_attribute('env', 'production')

    with tracer.start_as_current_span('db-query') as child:
        child.set_attribute('db.system', 'postgresql')
        child.set_attribute('db.statement', 'SELECT * FROM users')
        # do DB work

# Flush remaining spans on shutdown
provider.shutdown()

view raw JSON →