Observability for Temporal with Opik

Temporal Python SDK integrates with OpenTelemetry through TracingInterceptor.

When this guide applies

Use this if your Temporal Python client/worker should emit trace spans to Opik.

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

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:

1from temporalio.client import Client
2from temporalio.worker import Worker
3from temporalio.contrib.opentelemetry import TracingInterceptor
4
5tracing_interceptor = TracingInterceptor()
6
7# In async context:
8# client = await Client.connect("localhost:7233", interceptors=[tracing_interceptor])
9# worker = Worker(client, task_queue="my-task-queue", workflows=[...], activities=[...], interceptors=[tracing_interceptor])

Validation

  1. Start worker and client with TracingInterceptor.
  2. Execute a workflow with at least one activity.
  3. Confirm workflow/activity spans land in the expected Opik project.

Source references