Observability for Temporal with Opik
Temporal Python SDK integrates with OpenTelemetry through TracingInterceptor.
When this guide applies
Section titled “When this guide applies”Use this if your Temporal Python client/worker should emit trace spans to Opik.
Opik OTLP endpoint modes
Section titled “Opik OTLP endpoint modes”For full endpoint/header details, see Opik OpenTelemetry overview.
export OTEL_EXPORTER_OTLP_ENDPOINT=https://www.comet.com/opik/api/v1/private/otel
export OTEL_EXPORTER_OTLP_HEADERS='Authorization=<your-api-key>,Comet-Workspace=<your-workspace>,projectName=<your-project-name>'Required headers: Authorization, Comet-Workspace
Optional headers: projectName
export OTEL_EXPORTER_OTLP_ENDPOINT=https://<comet-deployment-url>/opik/api/v1/private/otel
export OTEL_EXPORTER_OTLP_HEADERS='Authorization=<your-api-key>,Comet-Workspace=<your-workspace>,projectName=<your-project-name>'Required headers: Authorization, Comet-Workspace
Optional headers: projectName
export OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:5173/api/v1/private/otel
export OTEL_EXPORTER_OTLP_HEADERS='projectName=<your-project-name>'Required headers: none by default
Optional headers: projectName, auth headers if enabled
Example (Temporal Python SDK interceptor)
Section titled “Example (Temporal Python SDK interceptor)”Intent: Attach Temporal's OTEL interceptor so workflow/activity spans are emitted by client and worker.
Applies when: You use Temporal Python SDK with custom client/worker bootstrap code.
Required inputs:
- Temporal client and worker setup
- interceptor attached to both paths where needed
- OTEL endpoint/header env vars
Optional inputs:
- explicit resource/service-name attributes
- collector-based enrichment/sampling
Minimal valid setup:
from temporalio.client import Client
from temporalio.worker import Worker
from temporalio.contrib.opentelemetry import TracingInterceptor
tracing_interceptor = TracingInterceptor()
# In async context:
# client = await Client.connect("localhost:7233", interceptors=[tracing_interceptor])
# worker = Worker(client, task_queue="my-task-queue", workflows=[...], activities=[...], interceptors=[tracing_interceptor])Validation
Section titled “Validation”- Start worker and client with
TracingInterceptor. - Execute a workflow with at least one activity.
- Confirm workflow/activity spans land in the expected Opik project.