Set up OpenTelemetry with Authdog
Point your OTLP exporter at Authdog, authenticate with an environment API secret, and send traces, logs, and metrics as JSON.
From the changelog: OpenTelemetry ingest for traces, logs, and metrics
Authdog Team

Your app already emits OpenTelemetry traces, logs, and metrics. Until now those signals had to land in a collector you operated. Authdog now accepts the same OTLP/HTTP JSON export that SDKs, the OpenTelemetry Collector, and Grafana Alloy already know how to send.
This is the setup note behind the September 10 changelog entry.
What Authdog accepts
Three signals, on two equivalent bases:
OTEL_EXPORTER_OTLP_ENDPOINT |
Paths the exporter posts |
|---|---|
https://api.authdog.com |
/v1/traces, /v1/logs, /v1/metrics |
https://api.authdog.com/v1/otel |
/v1/otel/v1/traces, /v1/otel/v1/logs, /v1/otel/v1/metrics |
Pick one base. Do not append /v1/traces to the endpoint yourself — exporters add that path.
Self-hosted deployments use your API origin in place of api.authdog.com. The OpenAPI document at /v1/openapi lists the same operations.
This path is for application telemetry. It is not the Authdog audit or security-event stream. Those still go through Events and webhooks and SIEM channels.
Create an environment API secret
The exporter authenticates with an environment API secret (adenv_…), the same credential family used by AuthZEN, FGA, and Vault. The secret identifies the tenant and environment. No tenant or environment id appears in the path.
In the console, select the project and environment, then Vault > API Keys (/dashboard/secrets?tab=api):
- Choose Add new.
- Copy the value once. It is not shown again.
- Store it in your secret manager or the process environment of the exporter. Never ship it to a browser or mobile client.
A dev secret cannot write into prod. Mint one secret per environment you export into.
Any valid secret for that environment is enough. Ingest does not require environment:update.
Point the exporter
Set the standard OpenTelemetry environment variables on the process that already instruments your app:
OTEL_EXPORTER_OTLP_ENDPOINT=https://api.authdog.com
OTEL_EXPORTER_OTLP_PROTOCOL=http/json
OTEL_EXPORTER_OTLP_HEADERS=Authorization=Bearer adenv_…http/json is required. Many SDKs default to protobuf. Authdog returns 415 for application/x-protobuf and gRPC with an OTLP partialSuccess message that tells you to switch protocol.
The OpenTelemetry Collector (and Alloy) use the same contract:
exporters:
otlphttp/authdog:
endpoint: https://api.authdog.com
encoding: json
headers:
Authorization: Bearer ${AUTHDOG_ENV_API_SECRET}
service:
pipelines:
traces:
exporters: [otlphttp/authdog]
logs:
exporters: [otlphttp/authdog]
metrics:
exporters: [otlphttp/authdog]Keep the secret in the collector's environment, not in the config file you commit.
How the request is scoped
Authdog resolves tenant and environment from the Bearer secret. Resource attributes such as service.name and service.version travel with the payload so you can tell services apart. They are never used to choose the destination environment.
A secret minted in one environment cannot write into another, even if you set tenant.id or deployment.environment on the resource.
Empty {} and HTTP 200 means the export was fully accepted. That empty object is the OTLP success body, not a missing response.
If some records cannot be accepted, the response is still JSON:
{
"partialSuccess": {
"rejectedSpans": 12,
"errorMessage": "accepted first 500 records; 12 dropped"
}
}Logs use rejectedLogRecords. Metrics use rejectedDataPoints.
Limits that affect the exporter
- Request body at most 2 MiB. Larger bodies return 413.
- At most 500 spans, log records, or data points per request. Overflow is reported as
partialSuccess. - Missing or invalid
Authorizationreturns 401.
Batch and export intervals in your SDK or collector should stay inside those bounds. If a single flush is larger than 500 records, split it or lower the batch size.
Trust boundaries
The environment secret is a write credential for that environment's telemetry. Anyone who holds it can export traces, logs, and metrics into that environment. Treat it like a Vault or AuthZEN secret: server-side only, rotate by revoking the key in Vault > API Keys and minting a replacement.
Authdog does not authenticate end users on this path. Do not put user access tokens in OTEL_EXPORTER_OTLP_HEADERS.
This receiver does not replace Lidar or audit. Application spans are not security detections. Security events still use the dedicated event ingest and notification channels.
Verify the setup
- Export a small traces payload against a non-production environment.
- A successful call returns HTTP 200 and
{}. - Drop the
Authorizationheader and confirm 401. - Send
Content-Type: application/x-protobufand confirm 415.
A minimal traces check:
curl -sS -X POST https://api.authdog.com/v1/traces \
-H "Authorization: Bearer $AUTHDOG_ENV_API_SECRET" \
-H "Content-Type: application/json" \
-d '{"resourceSpans":[]}'Then point your existing SDK or collector at the same origin with http/json and the same secret.
OpenAPI: api.authdog.com/v1/openapi. Secret management: Vault. The original ship note is in the changelog.