Hello, I have installed phoenix on my openclaw instance and have been implementing tracing using otel. This is my current setup with phoenix running locally and diagnostics.otel configuration. As you can see, I am able to capture traces however, I am unable to fill out all the columns(input, output, tool calls, etc.). Can someone guide me as to what I am missing in my otel config to populate everything. Thanks!
💡 Hint: Mention RunLLM in the thread for followups.
Hi Muni — I'm new to Phoenix and looking for some research challenges (I don't use OpenClaw). I deleted my last response because it needed some corrections. . After taking a look at the OpenClaw repo, here is what I suspect is happening: . Two questions first:
How did you connect Phoenix? Are you using @arizeai/phoenix-otel, the diagnostics-otel plugin, or something else? (I'm assuming you used diagnostics-otel)
Click into one of those spans — what do you see in the Attributes tab?
. The problem: Looking at service.ts on main, the diagnostics-otel plugin doesn't emit the data Phoenix needs. . Two reasons:
No content capture. The plugin does not include prompt or response text in traces. There should be a captureContent option but it doesn't exist on main yet. Input/output will always show --.
Wrong semantic conventions. The plugin emits openclaw.* attributes. Phoenix expects OpenInference (input.value, output.value, openinference.span.kind). That should be why kind shows "unknown" and cost reads $0.
. PR #21290 addresses both — adds captureContent and aligns with GenAI semantic conventions — but even after it merges, you'd still need a translation step to get from gen_ai.* to OpenInference. Arize's @arizeai/openinference-genai package handles that conversion at export time. Phoenix docs here. . Mitigation . I did notice a community plugin for Phoenix. It doesn't appear to be managed by Arize - for that reason I'd rather not include links. . I hope that this provides a good starting point 🙂
After some digging, here is why I suspect that cost shows $0. . It's not that cost data is missing. It's being exported through a different OTel signal. The plugin (diagnostics-otel) does capture cost.
When a model invocation completes, service.ts calls costCounter.add(evt.costUsd, attrs), exporting it as an OTel counter metric. But Phoenix reads span attributes, not metrics .
In recordModelUsage, only token counts are written to the span (openclaw.tokens.*), not cost.
So Phoenix queries the span, finds nothing, and reports $0.
