Observability Exporters
Observability exporters send usage events from the gateway to destinations used for tracing, logging, storage, or accounting. This guide configures an OTLP/HTTP exporter using AISIX Cloud or the open-source AISIX gateway, then explains destination choices, content capture, and delivery behavior.
Prerequisites
Before starting, prepare the following:
- One of these configuration paths:
- AISIX Cloud with an environment, an attached gateway, and a write-scoped admin token. For On-Premises, follow the AISIX Cloud Quickstart. To request Hybrid Cloud access, contact API7.
- An open-source AISIX gateway that loads a declarative
resources.yamlfile.
- A telemetry destination for the exporter you plan to use.
For the AISIX Cloud examples, export the Admin API base URL, admin token, and environment ID:
export AISIX_CP="http://localhost:8080/api"
export AISIX_TOKEN="YOUR_ADMIN_TOKEN"
export ENV_ID="YOUR_ENVIRONMENT_ID"
Choose an Exporter Kind
All exporter kinds are available through both configuration paths. AISIX Cloud API requests and resource-file entries select a kind with the kind value, and the dashboard shows a label for the same underlying kind:
kind Value | Dashboard Label | Use When |
|---|---|---|
otlp_http | OTLP/HTTP | You already collect traces through an OTLP/HTTP collector or vendor endpoint. |
object_store | Object storage | You want batched NDJSON request events in Amazon S3, S3-compatible storage, Google Cloud Storage, or Azure Blob. |
datadog | Datadog | You use Datadog Logs HTTP intake. |
aliyun_sls | Alibaba Cloud SLS | You use Alibaba Cloud Simple Log Service as the log destination. |
The gateway sends telemetry directly to the selected destination.
Configure an OTLP Exporter
Set the collector endpoint and authorization header used by the example:
# Replace with your values
# For local testing, replace the OTLP_ENDPOINT value below with http://localhost:4318/v1/traces.
# Remove the headers block from the create request.
export OTLP_ENDPOINT="https://collector.example.com/v1/traces"
export OTLP_AUTH_HEADER="Bearer YOUR_COLLECTOR_TOKEN"
AISIX Cloud
Create the exporter and capture its ID:
EXPORTER_ID=$(curl -sS -X POST "$AISIX_CP/environments/$ENV_ID/observability_exporters" \
-H "Authorization: Bearer $AISIX_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "prod-otlp",
"kind": "otlp_http",
"endpoint": "'"${OTLP_ENDPOINT}"'",
"headers": {
"Authorization": "'"${OTLP_AUTH_HEADER}"'"
},
"sample_rate": 0.25
}' | jq -r '.observability_exporter.id')
❶ Set static headers only when the OTLP destination requires them. Header values are encrypted at rest and never returned by read operations.
❷ sample_rate reduces span volume for this OTLP exporter. When omitted, AISIX exports every request.
Retrieve the exporter to confirm the stored configuration:
curl -sS "$AISIX_CP/environments/$ENV_ID/observability_exporters/$EXPORTER_ID" \
-H "Authorization: Bearer $AISIX_TOKEN"
You should see a response similar to the following. Reads expose the configured header names through header_keys and confirm stored values through headers_set; the header values themselves are never returned.
{
"observability_exporter": {
"id": "b46a9f5d-6a4d-4bb1-ae2c-4ab1b22f5e80",
"env_id": "0f2f6a1e-9d33-4a8f-9a6e-2a7b6a9c1d2e",
"name": "prod-otlp",
"enabled": true,
"kind": "otlp_http",
"endpoint": "https://collector.example.com/v1/traces",
"header_keys": ["Authorization"],
"headers_set": true,
"sample_rate": 0.25,
"created_at": "2026-07-22T08:30:00Z",
"updated_at": "2026-07-22T08:30:00Z"
}
}
Keep $EXPORTER_ID for later updates or deletion. Exporters are enabled by default. Set enabled: false to save the resource without sending telemetry.
Open-Source AISIX Gateway
Add the exporter under observability_exporters in resources.yaml. Environment-variable interpolation keeps the collector token out of the file:
_format_version: "1"
observability_exporters:
- name: prod-otlp
kind: otlp_http
endpoint: ${OTLP_ENDPOINT}
headers:
Authorization: ${OTLP_AUTH_HEADER}
sample_rate: 0.25
Validate the file:
aisix validate --resources resources.yaml
Start or restart the gateway with OTLP_ENDPOINT and OTLP_AUTH_HEADER in its process environment. Reload a running gateway only if those variables are already available to the process. Exporters are enabled by default; add enabled: false to keep the entry without sending telemetry.
Configure Other Exporters
Use another exporter kind when telemetry should go to object storage or a logging service instead of an OTLP trace backend. With AISIX Cloud, send one of the following objects as the body of POST $AISIX_CP/environments/$ENV_ID/observability_exporters.
Object Storage
For object storage, choose the storage provider, bucket, and key prefix. The default authentication mode uses a credential reference resolved by the gateway:
{
"name": "request-events-s3",
"kind": "object_store",
"provider": "s3",
"bucket": "acme-aisix-events",
"prefix": "ai-gateway",
"region": "us-east-1",
"credential_ref": "acme_s3"
}
Object storage supports Amazon S3, Google Cloud Storage, Azure Blob, and S3-compatible targets. Cloud identity is supported only for S3 or GCS when the gateway has an attached identity that can write to the bucket. Use credential_ref for Azure Blob and for S3-compatible targets that require static credentials.
For an S3-compatible target such as MinIO, Cloudflare R2, or Alibaba Cloud OSS, set the target endpoint explicitly. Without an endpoint, the exporter uses the native AWS S3 endpoint.
Alibaba Cloud SLS
Configure the endpoint host, project, log store, and credential reference:
{
"name": "request-events-sls",
"kind": "aliyun_sls",
"endpoint": "ap-southeast-3.log.aliyuncs.com",
"project": "acme-observability",
"logstore": "ai-gateway",
"credential_ref": "acme_sls"
}
Datadog
Configure the Datadog site, service name, tags, and credential reference:
{
"name": "request-events-datadog",
"kind": "datadog",
"site": "datadoghq.com",
"service": "ai-gateway",
"tags": ["team:platform", "tier:prod"],
"credential_ref": "acme_datadog"
}
For the resources-file path, add the equivalent entry or entries under observability_exporters:
_format_version: "1"
observability_exporters:
- name: request-events-s3
kind: object_store
provider: s3
bucket: acme-aisix-events
prefix: ai-gateway
region: us-east-1
credential_ref: acme_s3
- name: request-events-sls
kind: aliyun_sls
endpoint: ap-southeast-3.log.aliyuncs.com
project: acme-observability
logstore: ai-gateway
credential_ref: acme_sls
- name: request-events-datadog
kind: datadog
site: datadoghq.com
service: ai-gateway
tags: ["team:platform", "tier:prod"]
credential_ref: acme_datadog
Keep only the destinations you use, then validate the resources file and start or reload the gateway as described for the OTLP example.
SLS, Datadog, and object-storage exporters keep destination credentials out of the exporter resource by using credential references or cloud identity. The gateway resolves those credentials locally when it sends telemetry.
Configure Content Capture
Exporters include request status, token counts, model and provider identifiers, request IDs, finish reason, and timing by default. Prompt and response bodies remain excluded unless full content capture is enabled on an OTLP/HTTP, SLS, or Datadog exporter.
Enable Full Content Capture
Add content_mode and content_max_bytes when creating an exporter. In AISIX Cloud, patch an existing exporter with the same fields:
curl -sS -X PATCH "$AISIX_CP/environments/$ENV_ID/observability_exporters/$EXPORTER_ID" \
-H "Authorization: Bearer $AISIX_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"content_mode": "full",
"content_max_bytes": 131072
}'
In the dashboard, set Content mode to Full, then adjust Max content bytes in the exporter form.
For the resources-file path, add the fields to the exporter entry, then validate and reload the file:
observability_exporters:
- name: prod-otlp
kind: otlp_http
endpoint: ${OTLP_ENDPOINT}
headers:
Authorization: ${OTLP_AUTH_HEADER}
content_mode: full
content_max_bytes: 131072
Use full content capture only when the destination is approved to receive end-user prompt and response text. AISIX applies the configured byte cap independently to captured prompt and response fields.
Understand Truncated Records
When valid JSON exceeds content_max_bytes, AISIX first tries to reduce the value structurally so the exported field remains valid JSON. If the reduced value still cannot fit the configured cap, AISIX falls back to a UTF-8-safe byte cut. The captured prompt is the serialized request body and follows the same behavior.
| Content | Truncation Behavior |
|---|---|
| Long string | Keeps a prefix and adds the inline marker ...[aisix: truncated, N bytes total]. |
| Base64 data URI | Replaces the encoded data with a size placeholder. |
| Long array | Keeps head and tail samples around an {"_aisix_truncated": true, "omitted_items": N} element that accounts for every omitted item. |
| Non-JSON content, or JSON that cannot fit after structural reduction | Cuts the value at a UTF-8 character boundary. |
When truncation occurs, OTLP records include aisix.content_truncated: true. Datadog and SLS records include content_truncated: true.
Capture Failed Requests
Full content capture applies to the supported AI proxy endpoint types summarized below. It does not apply to A2A, MCP, Realtime, passthrough, or job and batch telemetry.
On /v1/chat/completions, /v1/messages, and /v1/responses, a failure that produces a usage event after request parsing records the request body in the prompt field, except for 401 and 403 responses. This includes input guardrail blocks (422), upstream failures other than 401 and 403, and validation failures after parsing, such as an empty messages array. When data masking runs, AISIX captures the post-mask request body. Malformed JSON is rejected before a usage event is created and is not captured.
The following boundaries also apply:
- Caller authentication failures are rejected before a usage event is created.
- When every routing target fails, the last attempt's record carries the prompt.
- A response-side guardrail block never captures the blocked output.
These boundaries keep rejected credentials and blocked output out of exported content while retaining the request context needed to investigate other failures.
Review Captured Content by Endpoint
| Endpoint Type | Captured Response |
|---|---|
| Text generation | Response text. |
| Embeddings, rerank, and image generation | Full response JSON. |
| Audio transcription | Returned transcript. Uploaded audio is not captured; its SHA-256 checksum is recorded alongside the request's text fields. |
| Text to speech | Binary speech response is not captured. |
Model Fields in Exported Telemetry
Usage telemetry records both the model alias requested by the caller and the model that served an attempt when those values differ. This distinction matters for routed and ensemble traffic, where one caller-facing alias can resolve to several target calls.
Destinations render these values in their own telemetry format. OTLP traces use the following fields:
gen_ai.request.modelcontains the caller-requested alias.gen_ai.response.modelcontains the concrete response model version when the provider reports one.aisix.model_ididentifies the resolved model resource.
Gateway-Protocol Spans
An A2A or MCP call is not a model inference, so its span is not encoded as one. A2A exports as invoke_agent <agent> and MCP as execute_tool <tool>, following the OpenTelemetry generative-AI semantic conventions, and carries the protocol's own detail:
- A2A:
gen_ai.agent.name,gen_ai.conversation.id(the A2A context), andaisix.a2a.operation,aisix.a2a.method,aisix.a2a.protocol_version,aisix.a2a.task_id,aisix.a2a.task_state,aisix.a2a.stream_event_count. - MCP:
gen_ai.tool.nameandaisix.mcp.server_name.
Model traffic keeps the chat.completions span name and gen_ai.operation.name: chat. A trace query written against those values used to match agent and tool calls as well. It now matches model traffic only, which is what it was meant to describe.
Datadog logs use aisix.requested_model for the caller-requested alias, gen_ai.response.model for the concrete response model version, and aisix.model_id for the resolved model resource.
Object storage and Alibaba Cloud SLS retain usage-event field names such as requested_model, model_id, and provider_model_version.
AISIX Cloud Control Plane
The dashboard manages the same exporter resources from the target environment's Observability view. The exporter form collects the destination fields, content mode, and any kind-specific options.
Whether an exporter is saved through the API or the dashboard, the control plane projects the configuration to the AISIX gateways attached to that environment.
The following behavior applies to exporters projected to AISIX gateways:
- The AISIX gateway sends request telemetry directly to your destination. The control plane does not proxy exported telemetry.
- Prompt and response content stays on the gateway unless you enable full content capture on an exporter.
- Credential references are resolved by the AISIX gateway. When a destination needs runtime credentials, the dashboard shows the environment variables to configure on the gateway.
- Delivery health comes from gateway heartbeat data and shows whether batches are being shipped or whether the gateway is reporting a delivery error.
For OTLP/HTTP exporters, the dashboard provides presets for Langfuse, Honeycomb, and Grafana Cloud Tempo, and accepts custom OTLP endpoints.
The trace UI URL template is optional. Use it when the Request Logs view should link a request record to an external trace UI. The template must include {request_id} so the control plane can replace it with the request ID from the log record.
Next Steps
Continue with Load Request Telemetry into Snowflake to query object-storage telemetry in Snowflake. Use Metrics and Logs to correlate exported records with gateway metrics, access logs, and response headers.