DeepEval OpenTelemetry Skill
Teach your agent to export raw OpenTelemetry traces to Confident AI from any language — no deepeval package required.
Overview
The deepeval-otel Agent Skill teaches your coding agent how to export raw OpenTelemetry traces from an AI application to Confident AI's Observatory — no deepeval package required. Because the mechanism is just OTLP attribute keys plus an exporter endpoint, it works with any OpenTelemetry SDK in any language, not only Python. It ships in the confident-ai/deepeval repository alongside the deepeval and deepeval-tracing skills.
The job is exactly two things: point an OTLP/HTTP span exporter at the correct Confident AI endpoint, and set the confident.span.* and confident.trace.* attributes Confident AI reads off each span. Parent/child nesting comes from native OpenTelemetry span context.
There is one OTLP/HTTP traces endpoint per region, authenticated with the x-confident-api-key header:
| Region | Base endpoint |
|---|---|
| US (default) | https://otel.confident-ai.com |
| EU | https://eu.otel.confident-ai.com |
The skill picks the endpoint from your API key's prefix — only confident_eu_... keys use the EU endpoint.
When It Triggers
The skill activates on prompts like:
Send our OpenTelemetry traces to Confident AI.
Wire our OTel Collector to export AI spans to Confident AI's Observatory.
Set confident.span.type on the LLM spans in our TypeScript agent.
Which Confident AI OTLP endpoint should our EU deployment use?Installation
Works with Cursor, Claude Code, Codex, Windsurf, OpenCode, and any other Skills-compatible assistant:
npx skills add confident-ai/deepeval --skill "deepeval-otel"The plugin bundles all three deepeval-* skills:
/plugin marketplace add confident-ai/deepeval
/plugin install deepeval@deepeval-plugins
/reload-pluginsCopy the skill folder into your agent's skills directory:
git clone https://github.com/confident-ai/deepeval
cp -r deepeval/skills/deepeval-otel .claude/skills/Prerequisites
- An exported
CONFIDENT_API_KEY - An OpenTelemetry SDK for your language (Python:
opentelemetry-sdkandopentelemetry-exporter-otlp-proto-http)
What Changes in Your Codebase
Ask for OTLP export
The agent checks for an existing
TracerProvider, span exporters, or an OpenTelemetry Collector and repoints what exists rather than adding a parallel pipeline.Prompt Send our OpenTelemetry traces to Confident AI's Observatory.Wire the exporter
The agent points an OTLP/HTTP span exporter at the region endpoint, authenticated with the
x-confident-api-keyheader — or, with no code changes at all, through the standard environment variables:export OTEL_EXPORTER_OTLP_ENDPOINT="https://otel.confident-ai.com" export OTEL_EXPORTER_OTLP_HEADERS="x-confident-api-key=<CONFIDENT_API_KEY>"See what the agent writes
import os from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter provider = TracerProvider() provider.add_span_processor( BatchSpanProcessor( OTLPSpanExporter( endpoint="https://otel.confident-ai.com/v1/traces", headers={"x-confident-api-key": os.environ["CONFIDENT_API_KEY"]}, ) ) ) trace.set_tracer_provider(provider)Set the confident.* attributes
The agent sets
confident.span.*on each AI span andconfident.trace.*for trace-wide fields, honoring OTLP data-type rules (JSON-encode dicts, native arrays for string lists) and falling back to standardgen_ai.*semantic conventions where the app already emits them.See what the agent writes
tracer = trace.get_tracer(__name__) with tracer.start_as_current_span("my-llm-app") as span: span.set_attribute("confident.span.type", "agent") span.set_attribute("confident.trace.name", "my-llm-app")Keep non-AI spans out
When the process also runs auto-instrumentation or an APM agent (HTTP/DB spans, Datadog, and the like), the agent sets up a dedicated pipeline or span filter so only AI spans reach Confident AI — then verifies the traces render in the Observatory.
FAQs
Do I need the deepeval package installed?
No — that's the point of this skill. Any OTLP-capable OpenTelemetry SDK in
any language works. The entire contract is the confident.* attribute
keys plus the exporter endpoint, which are identical everywhere.
Can I export over gRPC?
No. Confident AI's OTLP endpoint accepts HTTP only — use your SDK's
OTLP/HTTP exporter (proto-http, HttpProtobuf, or equivalent), or the
otlphttp exporter in an OpenTelemetry Collector.
I already run Datadog / OTel auto-instrumentation — will everything get sent?
Not if wired correctly. The skill isolates the Confident AI export behind a dedicated pipeline or a span filter, so HTTP requests, database queries, and other non-AI spans never reach the Observatory — only your AI spans do.
My app already emits gen_ai.* semantic conventions — do I need confident.* too?
Confident AI falls back to standard gen_ai.* attributes where they
exist, so you often need less than you think. Setting
confident.span.type explicitly is still recommended when the type is
known, with gen_ai.* inference as the fallback.
Next Steps
OpenTelemetry Integration
The full reference for Confident AI's OTLP endpoint and attribute schema.
DeepEval Tracing Skill
Prefer the DeepEval SDK instead if your app is Python.
Last updated on