IBM watsonx.governance
watsonx.governance has no native OpenTelemetry intake for external agents. IBM’s route for
agent observability is its Langfuse and Arize integrations, and watsonx Orchestrate accepts
OTLP/HTTP traces from external agents. Kurahi therefore exports its runs as OpenTelemetry spans
with the attribute names Langfuse maps, through the existing diagnostics-otel plugin:
- to a Langfuse (or Arize, or any OTLP) endpoint that the governance integration reads, and
- optionally, to the Orchestrate trace intake, so runs appear next to Orchestrate’s own traces.
Status: Available. Attribute names follow the Langfuse OpenTelemetry documentation and the Orchestrate trace-intake documentation; see References.
What is exported
Section titled “What is exported”Two span kinds, one span per finished run:
| Span | When | Langfuse observation type |
|---|---|---|
kurahi.agent.run |
every embedded agent run (channels, A2A, sessions) | agent |
kurahi.autopilot.run |
every autopilot routine run | chain |
By default a span carries ids, timings, decisions and counts only:
langfuse.trace.name,langfuse.session.id(the session id, orautopilot:<project>:<routine>),langfuse.user.id(defaultusr_kurahi),langfuse.observation.level(ERRORon failure,WARNINGfor an escalated or watchdog-held autopilot run).- Agent runs:
gen_ai.system(provider),gen_ai.request.model,gen_ai.usage.input_tokens,gen_ai.usage.output_tokens,langfuse.observation.usage_details, and metadata: run, agent, job and lane ids, outcome (completed,error,aborted,timeout), error kind, steps, tool calls, duration. - Autopilot runs: project, routine, edition, area, autonomy level, trigger, status, reasoner
backend and model and time, gather call count, work items created, decision counts
(
decision_allow,decision_needs_person,decision_refuse,decision_allow_failed), run counts, watchdog verdict, and the run’s evidence root hash, which ties the span to the signed run evidence kept in Kurahi.
Never exported: prompts, replies, gathered data, tool arguments or results, error messages, and
names of people. Content is attached only when an administrator sets
diagnostics.otel.captureContent: true; then the agent run span also gets
langfuse.observation.input / output (and input / output), truncated to
maxContentChars (default 4000). Autopilot spans never carry content.
Configure (Langfuse)
Section titled “Configure (Langfuse)”{ plugins: { entries: { "diagnostics-otel": { enabled: true } } }, diagnostics: { enabled: true, otel: { enabled: true, endpoint: "https://langfuse.example.com/api/public/otel", // traces go to /v1/traces headers: { Authorization: { $secret: "langfuse-otlp-basic" }, // "Basic <base64 public:secret>" }, traces: true, metrics: false, // Langfuse accepts traces only // captureContent: false, // the default; turn on only with a documented reason }, },}Store the header value with kurahi secrets set langfuse-otlp-basic. Connect the Langfuse
project to watsonx.governance as IBM describes for its Langfuse integration.
Push to the watsonx Orchestrate trace intake
Section titled “Push to the watsonx Orchestrate trace intake”{ diagnostics: { enabled: true, otel: { enabled: true, orchestrate: { enabled: true, url: "https://<orchestrate-host>/instances/<instance-id>/v1/orchestrate/inject/traces", apiKey: { $secret: "orchestrate-api-key" }, // IBM Cloud API key tenantId: "<tenant id>", environment: "draft", // deployment.environment agentId: "<orchestrate agent id>", // agent.id on every span // auth: "api-key", // legacy: key in x-api-key instead of an IAM bearer // userId: "usr_kurahi", }, }, },}- The push has its own tracer: only
kurahi.agent.runandkurahi.autopilot.runreach it. - The API key is exchanged at IBM Cloud IAM for a bearer token, cached and refreshed before it
expires (
iamUrloverrides the token endpoint). - The resource carries
tenant.idanddeployment.environment, which the intake routes on; the spans carryagent.id,langfuse.session.idandlangfuse.user.id, which it requires. - The URL must be https and of the documented shape; anything else turns the push off with a warning in the gateway log.
References
Section titled “References”| Item | Source |
|---|---|
| Langfuse and Arize integrations in watsonx.governance | IBM announcement |
| No native OTel intake for external agents | IBM idea WGOV-I-268 |
| Langfuse attribute names, OTLP endpoint, Basic auth | Langfuse OpenTelemetry |
Orchestrate trace intake URL, IAM or x-api-key, tenant.id, deployment.environment, agent.id, langfuse.session.id, langfuse.user.id |
Orchestrate OTel export |
| External models evaluated through detached prompt templates (register Kurahi agents manually) | Detached prompt evaluation |
Overview of the pack: IBM watsonx. Other span and metric names: Logging.