Trace Exports

Stream gateway trace data to an external observability or evaluation tool in near-real-time.

Overview

Export configs stream gateway trace data to an external observability or evaluation tool in near-real-time, either as OTLP traces (Arize Phoenix, Langfuse, any OTel collector) or as signed webhook deliveries to your own ingest endpoint. Delivery runs on a background exporter fed by the async logging pipeline; it never blocks the proxied request.

Entitlement and roles

Exports require the integrations entitlement (Enterprise plan). Reads need the viewer role; writes (create/update/delete) need admin.

Export Kinds

otlp

Entries are batched (up to 100 entries, flushed at least every 5s) and POSTed as one ExportTraceServiceRequest with Content-Type application/x-protobuf. Spans use OTel GenAI semantic conventions, so any GenAI-OTel-aware backend can read them:

  • gen_ai.provider.name
  • gen_ai.request.model
  • gen_ai.usage.input_tokens / gen_ai.usage.output_tokens
  • gen_ai.input.messages
  • gen_ai.output.messages
  • gen_ai.user.id
  • gen_ai.session.id

webhook

Each entry is delivered individually as JSON with Content-Type application/json, signed with the X-Ingate-Export-Signature header: a hex-encoded HMAC-SHA256 of the raw request body, keyed by the config's secret. To verify, compute HMAC-SHA256 of the exact bytes you received, hex-encode, and compare in constant time.

Delivery Guarantees

Delivery is best-effort: one immediate retry on failure, then the entry is dropped (never queued to disk). If the exporter's internal buffer is full, the entry is dropped without any retry.

Source Filtering

include_sources controls which log sources feed a config. Values are drawn from logging.UnifiedLog.Source:

  • proxy: passthrough/translation traffic
  • api: agent monitoring / SDK ingest
  • otel: receiver-ingested spans

An entry is exported through a config only if its source appears in that config's include_sources. Omit the field on create to default to ["proxy", "api"].

Secrets

headers and secret are write-only: they are encrypted at rest and never echoed back by any endpoint, including GET. has_secret is the only visible signal that a webhook secret is set; use it to check configuration state without ever seeing the secret value again. To rotate a secret or headers, PUT new values to the config.

Hot Reload

Create, update, and delete take effect immediately: a live registry hot-reloads on every successful write, so no restart is required for a new or edited config to start (or stop) receiving traffic.

The ExportConfig Object

json
{
  "id": "d290f1ee-6c54-4b01-90e6-d701748f0851",
  "org_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "name": "phoenix-otlp",
  "kind": "otlp",
  "endpoint": "http://phoenix.internal:6006/v1/traces",
  "has_secret": false,
  "include_sources": ["proxy", "api"],
  "enabled": true,
  "created_at": "2026-08-29T12:00:00Z",
  "updated_at": "2026-08-29T12:00:00Z"
}
FieldTypeDescription
iduuidExport config ID
org_iduuidOwning org
namestringUnique per org
kindstringotlp or webhook
endpointstringDestination URL
has_secretboolWhether a webhook HMAC secret is configured
include_sourcesstring[]Which logging.UnifiedLog sources feed this config: proxy, api, otel
enabledboolWhether this config is live in the exporter registry
created_at / updated_attimestampRFC 3339

Next Steps