O

OpenTelemetry

Send standard OTLP traces, logs, and metrics from any language or framework. If it can emit OpenTelemetry, telemetry.dev can trace it.

Built by

telemetry.dev

Language

Any

Transport

OTLP/HTTP

Packages

@telemetry-dev/otel (optional)

Category

Protocols

About the OpenTelemetry integration

No SDK is required. Point any OTLP/HTTP protobuf exporter — or an OpenTelemetry Collector — at https://ingest.telemetry.dev. Traces go to /v1/traces, logs to /v1/logs, and metrics to /v1/metrics. Authenticate with a bearer project API key. GenAI semantic-convention attributes, including gen_ai.*, are normalized into model, token, and cost fields automatically.

Key features

  • Works from any language: If your runtime can emit OpenTelemetry, it can send data to telemetry.dev.
  • Accepts traces, logs, and metrics: Use the same OTLP/HTTP endpoint for all three signal types.
  • GenAI semantic convention normalization: Model, provider, token, latency, and error attributes become queryable fields.
  • Server-side cost from real token usage: Cost is computed from emitted token counts and current model pricing.
  • Environment-scoped API keys: Keep production, staging, and development ingest separated by environment.

Get started

  1. Create a telemetry.dev project API key.

  2. Configure your OTLP/HTTP exporter:

    export OTEL_EXPORTER_OTLP_ENDPOINT="https://ingest.telemetry.dev"
    export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer%20$TELEMETRY_DEV_API_KEY"
    export OTEL_SERVICE_NAME="your-service-name"
    export OTEL_RESOURCE_ATTRIBUTES="deployment.environment.name=production"
    
    # OTLP/HTTP exporters send traces to:
    # $OTEL_EXPORTER_OTLP_ENDPOINT/v1/traces
  3. Run your app. OpenTelemetry traces, logs, and metrics arrive in telemetry.dev with GenAI spans normalized for debugging and cost analysis.

Already running OpenTelemetry?

If your app has an existing OTel setup — NodeSDK, @vercel/otel, or a BasicTracerProvider — attach the TelemetrySpanProcessor from @telemetry-dev/otel instead of swapping exporters. It ships the same OTLP/protobuf exporter used by our SDK, without requiring the SDK runtime:

import { NodeSDK } from "@opentelemetry/sdk-node";
import { TelemetrySpanProcessor } from "@telemetry-dev/otel";

const sdk = new NodeSDK({ spanProcessors: [new TelemetrySpanProcessor()] });
sdk.start();

It reads TELEMETRY_DEV_API_KEY from the environment, exports every span it sees (narrow with spanFilter), and is a safe no-op when no key is set. createTelemetrySpanExporter() is available when you'd rather keep your own batch processor.