Skip to main content
Rootprint accepts OTLP spans at a single endpoint, authenticated with an ingest API key. Spans go to the span store, not to the key’s index — see Traces for what that means.

Endpoint

Authentication

Any existing ingest API key works. Create one at Settings → API keys if you do not have one.
The index attached to the key is ignored for spans. Every span goes to the span store named by TRACE_INDEX_ID. The key’s index still applies to that key’s log ingestion.
Ingest keys cannot be created against the span store. POST /api/api-keys rejects it with 400 INDEX_IS_TRACE_INDEX, because a key anchored there would write log documents into the span index.A key created against it before 0.4.0 keeps working for POST /v1/traces, but its log ingestion (POST /v1/logs, POST /api/ingest/ndjson) is now rejected with the same error.

Supported content types

Rootprint accepts application/x-protobuf only. Any other Content-Type returns 415 Unsupported Media Type. Set OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf on any runtime that can pick a protocol.
The JavaScript package @opentelemetry/exporter-trace-otlp-http defaults to JSON. Switch to @opentelemetry/exporter-trace-otlp-proto (same OTLPTraceExporter API).

Environment variables

The endpoint variable takes the full path, not a base URL.
The %20 after Bearer is required — OTLP expects URL-encoded header values.

Set up your service

Install the zero-code agent. opentelemetry-distro brings the agent and the SDK; opentelemetry-bootstrap reads your installed packages and adds the matching instrumentation libraries, so Flask, Django, FastAPI, requests, and psycopg are traced without touching your code.
Set the environment. Metrics and logs are switched off here — they default to otlp and would retry localhost:4318 forever.
Run your app under the agent. Exercise a route and the spans are batched and exported within a few seconds.

Correlate spans with logs

Spans are reached from a log. Ship logs from the same service as well, and Rootprint pairs the two by trace_id so any log row opens its trace. See Send logs and Read a trace. For the Collector, pairing works once the application’s own log records carry trace context — for example through an OpenTelemetry log appender. It does not work for tailed stdout or file lines, which have no trace context to carry.

Response codes

Errors use the google.rpc.Status encoding. 415 is JSON; every other error is binary protobuf, because an exporter that sent the wrong content type may not decode protobuf back.