Skip to main content
Add Tessary as a second OpenTelemetry exporter, sending OTLP (OpenTelemetry Protocol) traces. Your existing one keeps working and traces go to both. Whichever form below you pick, add a destination rather than replacing one: replacing the exporter is the single most common way a working setup ends with the old backend still receiving traces and Tessary receiving nothing. This is half of instrumenting an agent. The other half is the tessary.call_site.id attribute, which the exporter cannot supply for you: see The call-site tag.

Prerequisites

  • The Endpoint and Bearer Token from the connect gate. Past the gate, use SettingsSourcesConnect a source: select Create a connection token, then take the token out of the Header field, which shows it as Authorization: Bearer <token>. The endpoint is your Tessary origin plus /v1/traces.
  • An application that already builds OpenTelemetry spans, or a collector that already receives them. If neither exists yet, instrument your agent first.
The token is a secret. Never hardcode it in application source and never commit a real one. Put it wherever the repository already keeps secrets: a .env file, a settings module, a secret store, a deployment manifest. If the repository has no convention, introduce environment-variable configuration. The endpoint is not a secret, but a deployment usually wants it configurable too.

Use environment variables

Reach for this form first. Every OpenTelemetry SDK reads these variables, they need no code change, and they cannot drift from an SDK’s own API.
Replace the endpoint with your own origin and <token> with the value from the connect screen.
Use the _TRACES_ variables, never the unsuffixed OTEL_EXPORTER_OTLP_* pair. The unsuffixed variables redirect metrics and logs as well, which Tessary drops. Your metrics backend goes quiet and nothing says why.
Where an application already sets one of these variables for another destination, this form cannot express both. Use one of the forms below instead.

Add a span processor in code

For a codebase that builds its exporter programmatically. Add a processor to the provider that already exists. Never construct a second TracerProvider: spans on a provider the Tessary exporter is not registered on are never exported, which looks identical to a missing tag.
TESSARY_ENDPOINT and TESSARY_TOKEN stand in for however the repository reads configuration. Read the token from the environment or a secret store, not from a literal in source.

Fan out from a collector

Where an OpenTelemetry Collector already runs, add Tessary as another exporter on the traces pipeline and change nothing in the application.
Keep the existing exporter in the list. Replacing it reroutes your traces rather than copying them. A collector is also where you tag spans that come from software you cannot edit, using a transform processor to set tessary.call_site.id one layer out.

Verify it works

Run the application and watch the connect screen, which updates itself.
Spans arrive. The connect gate either opens, if the spans carry tessary.call_site.id, or replaces itself with the untagged state and a live count of spans received against spans tagged. Either outcome means the exporter is working.
Nothing arriving is an exporter problem, not a tagging problem. Instrumentation troubleshooting separates the two.

Reference

Environment variables

What the endpoint accepts

Span requirements carries every attribute the receiver reads, and Ingestion contract carries the batch, body, and payload limits.

Transports

The HTTP receiver is always on. A gRPC receiver exists and is opt-in through TESSARY_INGEST_OTLP_TRANSPORT, documented in Ingest and OTLP. The default Docker Compose configuration does not publish the gRPC port to the host, so HTTP is the reachable transport on a stock self-hosted install.

The call-site tag

The attribute an exporter cannot supply for you.

Instrumentation troubleshooting

When nothing arrives, or the old backend still gets traces and Tessary does not.