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:latestPort 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:
- tempotempo.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/tracesimport { 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:
| Site | Endpoint |
|---|---|
| US1 (default) | https://otlp.datadoghq.com:4318/v1/traces |
| EU | https://otlp.datadoghq.eu:4318/v1/traces |
| US3 | https://otlp.us3.datadoghq.com:4318/v1/traces |
| US5 | https://otlp.us5.datadoghq.com:4318/v1/traces |
| AP1 | https://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-keyNew 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-keyHoneycomb
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-keyOpenTelemetry 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.yamlimport { 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,
});