Launch Week 02 wrapped — explore all five launches

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:

RegionBase endpoint
US (default)https://otel.confident-ai.com
EUhttps://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:

Prompts that trigger the skill
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"

Prerequisites

  • An exported CONFIDENT_API_KEY
  • An OpenTelemetry SDK for your language (Python: opentelemetry-sdk and opentelemetry-exporter-otlp-proto-http)

What Changes in Your Codebase

  1. 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.
  2. Wire the exporter

    The agent points an OTLP/HTTP span exporter at the region endpoint, authenticated with the x-confident-api-key header — 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)
  3. Set the confident.* attributes

    The agent sets confident.span.* on each AI span and confident.trace.* for trace-wide fields, honoring OTLP data-type rules (JSON-encode dicts, native arrays for string lists) and falling back to standard gen_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")
  4. 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

Scaling beyond prototype?For teams evaluating Confident AI in productionTalk to us

Last updated on

Built byConfident AI