Skip to Content

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 the eu one.
  • 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: Bearer followed 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-protobuf

OpenLLMetry 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

  1. Create an API key in the console at https://console.rius-glassflow.com. Keys start with ri_.
  2. Change the Traceloop.init call 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>"}, )
  1. If you prefer configuration over code, OpenLLMetry’s own environment variables carry the same values: TRACELOOP_BASE_URL takes the base URL, and TRACELOOP_HEADERS takes the header, with %20 for the space. In Python, leftover TRACELOOP_* values override Traceloop.init(), so remove old ones. Set TRACELOOP_METRICS_ENABLED to false too, because Rius ingests traces only and the Python SDK’s metric exports otherwise fail with a logged 404.

  2. Run one traced LLM call.

  3. 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.
  4. If nothing arrives, a 401 from the endpoint means the API key is wrong or revoked. If you set the endpoint to the full /v1/traces path, switch to the base URL, because the exporter adds the path itself.

  5. If spans arrive without a model or tokens, attributes were probably lost on the way. Look for a Collector attributes or transform processor that strips gen_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.input and traceloop.entity.output become 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.

Still stuck? Get help

Last updated on