TypeScriptADK-TS

Platform Integrations

Connect ADK-TS to Jaeger, Grafana, Datadog, New Relic, Honeycomb, and any OTLP-compatible backend

ADK-TS exports telemetry via OTLP HTTP, making it compatible with any observability platform that accepts OTLP. Point otlpEndpoint at your backend and the framework handles the rest.

Endpoint format

The otlpEndpoint value is used as-is for traces. For metrics, ADK-TS derives the metrics URL by replacing /v1/traces with /v1/metrics in the same string. Always include the full path in your endpoint.

Jaeger

Jaeger is an open-source distributed tracing system. It only supports traces, not metrics — use it for local development or as a dedicated tracing backend.

Start Jaeger locally with Docker:

docker run -d \
  --name jaeger \
  -p 4318:4318 \
  -p 16686:16686 \
  jaegertracing/all-in-one:latest

Port 4318 accepts OTLP HTTP and port 16686 serves the Jaeger UI.

import { telemetryService } from "@iqai/adk";

await telemetryService.initialize({
  appName: "my-agent-app",
  otlpEndpoint: "http://localhost:4318/v1/traces",
  enableTracing: true,
  enableMetrics: false, // Jaeger doesn't support metrics
});
import { telemetryService } from "@iqai/adk";

await telemetryService.initialize({
  appName: "my-agent-app",
  otlpEndpoint: "https://jaeger.your-domain.com:4318/v1/traces",
  enableTracing: true,
  enableMetrics: false,
  environment: "production",
});

Open http://localhost:16686, select your service name, and click Find Traces to view spans.

Grafana + Tempo

Grafana with Tempo provides traces and metrics together. The following Docker Compose setup runs everything locally.

docker-compose.yml:

services:
  tempo:
    image: grafana/tempo:latest
    ports:
      - "4318:4318"
    volumes:
      - ./tempo.yaml:/etc/tempo.yaml
    command: ["-config.file=/etc/tempo.yaml"]

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    environment:
      - GF_AUTH_ANONYMOUS_ENABLED=true
    depends_on:
      - tempo

tempo.yaml:

server:
  http_listen_port: 3200

distributor:
  receivers:
    otlp:
      protocols:
        http:
          endpoint: 0.0.0.0:4318

storage:
  trace:
    backend: local
    local:
      path: /tmp/tempo/traces
import { telemetryService } from "@iqai/adk";

await telemetryService.initialize({
  appName: "my-agent-app",
  otlpEndpoint: "http://localhost:4318/v1/traces",
  enableMetrics: true,
  enableTracing: true,
});

Open Grafana at http://localhost:3000, add Tempo as a data source pointing to http://tempo:3200, then create dashboards for traces and metrics.

Datadog

Datadog's OTLP ingestion accepts both traces and metrics. The endpoint domain varies by Datadog site.

import { telemetryService } from "@iqai/adk";

await telemetryService.initialize({
  appName: "my-agent-app",
  otlpEndpoint: "https://otlp.datadoghq.com:4318/v1/traces",
  otlpHeaders: {
    "DD-API-KEY": process.env.DD_API_KEY,
  },
  enableMetrics: true,
  enableTracing: true,
  environment: "production",
});

Endpoint by Datadog site:

SiteEndpoint
US1 (default)https://otlp.datadoghq.com:4318/v1/traces
EUhttps://otlp.datadoghq.eu:4318/v1/traces
US3https://otlp.us3.datadoghq.com:4318/v1/traces
US5https://otlp.us5.datadoghq.com:4318/v1/traces
AP1https://otlp.ap1.datadoghq.com:4318/v1/traces

Store your API key in an environment variable and never commit it to source control:

DD_API_KEY=your-datadog-api-key

New Relic

New Relic accepts OTLP directly via its ingest endpoint:

import { telemetryService } from "@iqai/adk";

await telemetryService.initialize({
  appName: "my-agent-app",
  otlpEndpoint: "https://otlp.nr-data.net:4318/v1/traces",
  otlpHeaders: {
    "api-key": process.env.NEW_RELIC_LICENSE_KEY,
  },
  enableMetrics: true,
  enableTracing: true,
});
NEW_RELIC_LICENSE_KEY=your-license-key

Honeycomb

Honeycomb targets a specific dataset per request. Pass your API key and dataset name as headers:

import { telemetryService } from "@iqai/adk";

await telemetryService.initialize({
  appName: "my-agent-app",
  otlpEndpoint: "https://api.honeycomb.io/v1/traces",
  otlpHeaders: {
    "x-honeycomb-team": process.env.HONEYCOMB_API_KEY,
    "x-honeycomb-dataset": "my-agents",
  },
  enableMetrics: true,
  enableTracing: true,
});
HONEYCOMB_API_KEY=your-api-key

OpenTelemetry Collector

The Collector is a middleware process that receives OTLP from ADK-TS and forwards it to one or more backends. Use it when you need to route telemetry to multiple destinations, apply attribute processing, or run a sampling processor.

otel-collector-config.yaml:

receivers:
  otlp:
    protocols:
      http:
        endpoint: 0.0.0.0:4318

processors:
  batch:
    timeout: 10s
    send_batch_size: 1024

exporters:
  otlphttp/jaeger:
    endpoint: http://jaeger:4318
  otlphttp/datadog:
    endpoint: https://otlp.datadoghq.com:4318
    headers:
      DD-API-KEY: ${env:DD_API_KEY}

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlphttp/jaeger, otlphttp/datadog]
    metrics:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlphttp/datadog]

Start the Collector:

docker run -d \
  -v $(pwd)/otel-collector-config.yaml:/etc/otel-collector-config.yaml \
  -p 4318:4318 \
  -e DD_API_KEY=your-key \
  otel/opentelemetry-collector-contrib:latest \
  --config=/etc/otel-collector-config.yaml
import { telemetryService } from "@iqai/adk";

await telemetryService.initialize({
  appName: "my-agent-app",
  otlpEndpoint: "http://localhost:4318/v1/traces",
  enableMetrics: true,
  enableTracing: true,
});

ADK-TS sends to the Collector, which fans out to all configured exporters.

Custom OTLP Backends

Any backend that accepts OTLP HTTP works without additional configuration:

import { telemetryService } from "@iqai/adk";

await telemetryService.initialize({
  appName: "my-agent-app",
  otlpEndpoint: "https://telemetry.your-company.com/v1/traces",
  otlpHeaders: {
    Authorization: `Bearer ${process.env.TELEMETRY_TOKEN}`,
  },
  enableMetrics: true,
  enableTracing: true,
});

Next Steps