How do I send traces from OpenLLMetry to Rius?
Rius receives OpenLLMetry traces once you set the Traceloop exporter endpoint to the Rius ingest host and add an Authorization Bearer header with your API key. You keep your existing instrumentation. Run one traced call, open the trace in the console, and check that the span shows a model name and token counts. For every sender path side by side, see Trace LLM calls with OpenTelemetry.
How it works
Three values connect OpenLLMetry to Rius:
- Endpoint: the base ingest URL,
https://ingest.eu.console.rius-glassflow.com. Traces post to that base plus/v1/traces, so you give OpenLLMetry the base only. The host carries your workspace’s region in the subdomain, and the host shown here is theeuone. - Protocol: OTLP over HTTP. OpenLLMetry exports http/protobuf by default, which is what the endpoint expects (http/json also works). There is no gRPC endpoint.
- Header:
Authorization: Bearerfollowed by your API key. The key also decides which workspace the traces land in.
The request that reaches Rius looks like this:
POST https://ingest.eu.console.rius-glassflow.com/v1/traces
Authorization: Bearer <your API key>
Content-Type: application/x-protobufOpenLLMetry has used several attribute conventions across versions. Rius normalizes all of them at ingest. Current releases already emit OpenTelemetry GenAI (gen_ai.*) attributes. Older releases flatten messages into gen_ai.prompt.* and gen_ai.completion.* and spell usage as gen_ai.usage.prompt_tokens. Rius stores those values under keys such as gen_ai.usage.input_tokens, so search and filter on the normalized names. The traceloop.span.kind of your decorators (workflow, task, agent, tool) becomes the span type in Rius.
Set it up
- Create an API key in the console at
https://console.rius-glassflow.com. Keys start withri_. - Change the
Traceloop.initcall in your app to use the Rius endpoint and header:
from traceloop.sdk import Traceloop
Traceloop.init(
app_name="my-agent",
api_endpoint="https://ingest.eu.console.rius-glassflow.com",
headers={"Authorization": "Bearer <your API key>"},
)-
If you prefer configuration over code, OpenLLMetry’s own environment variables carry the same values:
TRACELOOP_BASE_URLtakes the base URL, andTRACELOOP_HEADERStakes the header, with%20for the space. In Python, leftoverTRACELOOP_*values overrideTraceloop.init(), so remove old ones. SetTRACELOOP_METRICS_ENABLEDtofalsetoo, because Rius ingests traces only and the Python SDK’s metric exports otherwise fail with a logged 404. -
Run one traced LLM call.
-
Open Traces in the console and open the new trace. Check these things:
- The span for the model call shows a model name and token counts.
- Rius shows a cost on that span. It computes cost itself from the model and tokens, so you never send a cost value. It is a list-price estimate in US dollars.
- Spans nest the way your decorated workflow, task and tool functions do.
- Prompt and completion content is visible in the span details.
-
If nothing arrives, a
401from the endpoint means the API key is wrong or revoked. If you set the endpoint to the full/v1/tracespath, switch to the base URL, because the exporter adds the path itself. -
If spans arrive without a model or tokens, attributes were probably lost on the way. Look for a Collector
attributesortransformprocessor that stripsgen_ai.*keys, or a span that passed OpenTelemetry’s default limit of 128 attributes. Older OpenLLMetry releases record messages one attribute per field, so long agent runs hit that limit first. Raise the per-span attribute limit in that case.
Two older OpenLLMetry attributes are not mapped: the per-completion gen_ai.completion.N.finish_reason, and the flattened tool definitions under llm.request.functions.*. Rius stores both under their own names, so you can still find them on the span.
What you get
- Your existing OpenLLMetry traces in Rius with no re-instrumentation.
- Model, token and cost analytics that work across OpenLLMetry’s attribute versions, because Rius normalizes them at ingest.
- Nested spans that follow your Traceloop workflow, task, agent and tool decorators. The decorated function’s name becomes the tool or agent name, and
traceloop.entity.inputandtraceloop.entity.outputbecome the span’s input and output. - A quick pass or fail check: a model name and token counts on the first trace tell you the mapping works.
The OpenLLMetry page lists the mapping in more detail.
When something else fits
- If your code uses Traceloop’s prompts, guardrails, feedback, datasets or experiments, re-pointing the base URL stops them in Python. Keep OpenLLMetry pointed at Traceloop and add Rius through a Collector instead.
- If you have no tracing yet in Python or TypeScript, the Rius SDK needs one
init()call and sets up the exporter for you. The OpenTelemetry guide above compares it with the other paths. - If you want to send to Rius and an existing backend at once, route through an OpenTelemetry Collector. The Interoperability section has the sender guides for the Collector, OpenInference and vanilla OpenTelemetry SDKs.