Skip to main content
ZeroEval accepts standard OTLP trace data at POST /v1/traces, so any OpenTelemetry-instrumented application can export directly — through a collector, or straight from your app using an OTLP exporter.

When to use OTLP

Use this integration when:
  • Your application already uses OpenTelemetry for instrumentation
  • You want to fan out traces to multiple backends (ZeroEval + Datadog, Jaeger, etc.)
  • You’re running infrastructure you can’t modify but can route through a collector
  • You prefer a vendor-neutral instrumentation layer
If you’re starting fresh, the Python SDK or TypeScript SDK provide a simpler setup with automatic LLM instrumentation.

Endpoint Reference

The endpoint accepts the standard ExportTraceServiceRequest payload defined in the OTLP specification. Spans are converted to ZeroEval’s internal format — trace IDs, parent-child relationships, attributes, and status are all preserved.

Option 1: OpenTelemetry Collector

Route traces through a collector when you need batching, processing, or multi-destination fan-out.

Collector Configuration

Create otel-collector-config.yaml:

Run with Docker Compose

Run with Kubernetes


Option 2: Direct from Python

Export OTLP traces directly from your Python application without a collector. Use the ZeroEvalOTLPProvider included in the SDK, or configure a standard OTLPSpanExporter.

Using ZeroEvalOTLPProvider

Using standard OTLPSpanExporter


Option 3: Direct from Node.js


Attribute Mapping

ZeroEval maps standard OpenTelemetry span attributes to its internal format:

LLM Spans

To get LLM-specific features (cost calculation, token tracking), set these attributes on your spans:

Sessions

Attach session context to your OTLP spans via attributes: The ZeroEvalOTLPProvider stamps these automatically when you configure a session via environment variables (ZEROEVAL_SESSION_ID, ZEROEVAL_SESSION_NAME).