OpenTelemetry

Log destinations: a storage bucket and an OpenTelemetry collector.
- Store your collector’s headers, such as its API key, as a secret in Secrets (Platform > Agents > Secrets). The value is JSON, such as
{"api-key": "..."}, orkey=valuepairs separated by commas. - In Log destinations, under OpenTelemetry, turn on Send traces to a collector.
- Enter the collector’s Endpoint. The gateway sends OTLP over HTTP (JSON), so use the collector’s HTTP port, usually
4318./v1/tracesis added when the URL has no path. - Under Headers, pick the secret from step 1.
- Choose Save changes.
4317) receives nothing. If a collector was saved for gRPC, it shows This collector was saved for gRPC. Point the endpoint at the HTTP port and save again.
What each span carries
One span per request, named with the OpenTelemetry GenAI conventions:- the provider, the model asked for and the model that answered
- input, output, cache and reasoning tokens, and the cost in USD
- timings: start and end, time to first token and total time
- IDs: trace, person, group, agent, task and conversation, the API key’s name, the client and its version, what started the call, and the license model
- the status, and the error type of a failed call
Coralogix
- In Coralogix, create a Send-Your-Data API key.
-
In xpander, create a secret with this JSON value:
The application and subsystem names are yours to choose; they are how the spans are grouped in Coralogix.
-
Set Endpoint to
https://ingress.<your Coralogix domain>/v1/traces, such ashttps://ingress.eu2.coralogix.com/v1/traces. - Pick the secret under Headers and choose Save changes.
xpander-llm-gateway, under the application and subsystem names you set.
Other collectors
Any backend that accepts OTLP over HTTP works the same way: its OTLP HTTP endpoint, and its authentication headers in the secret.Storage bucket
A copy of every request record, as Parquet files in your own Amazon S3 bucket, Google Cloud Storage bucket or Azure Blob Storage container.1. Store a credential
Create a secret in Secrets (Platform > Agents > Secrets) holding a credential that can write to the bucket:
Log export does not support AWS IAM roles. Use an access key.
2. Add the destination
- In Logs, choose Log destinations.
- Under Destination, choose Add destination and pick Amazon S3, Google Cloud or Azure Blob Storage.
- Fill in the fields:
- Choose Send test. It writes
<prefix>/_xpander_test.jsonwith the settings on screen, saved or not. Test row written means the export can write there. The test failed says why, for example:- the bucket does not exist;
- the bucket is in another region, naming the region it is in;
- the key may not write to the bucket (access denied);
- the provider did not accept the key;
- the storage endpoint is at an address the export does not write to: a metadata address, or, on xpander cloud, a private or cluster address.
- Choose Save changes.
What lands in the bucket
Parquet files under<prefix>/dt=YYYY-MM-DD/hour=HH/, split by the hour of the call (UTC), one row per request. A request arrives within about two minutes of the call. Export starts from the moment you save the destination: earlier requests are not sent, and changing the bucket or prefix starts again from that moment. When the bucket can’t be written, the export pauses and resumes where it stopped, without losing or duplicating rows.
Each row has these columns:
Rows never hold prompt or response text, email addresses, IP addresses or error text.
Keep requests for in Policies does not delete exported files. To delete old files, set a lifecycle rule on your bucket.
Self-hosted installs
On a Hybrid or Air-Gapped install, both destinations are sent from inside your install, so the collector and the bucket only need to be reachable from your cluster. An Air-Gapped install can use S3-compatible storage inside your network throughendpoint_url in the credential.
