Skip to main content

mur_common/
telemetry.rs

1//! OpenTelemetry GenAI semantic conventions (Q1 2026 Development status,
2//! gated by `OTEL_SEMCONV_STABILITY_OPT_IN=gen_ai_latest_experimental`)
3//! plus murmur-specific extensions.
4//!
5//! Sensitive payloads (`gen_ai.input.messages`, `output.messages`,
6//! `tool.call.arguments`, `tool.call.result`) are opt-in via
7//! `OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=true`. mur's
8//! existing redaction modes (full / redacted / metadata-only) align.
9
10// ───── gen_ai.* core (Development) ─────
11// `gen_ai.system` was deprecated in favour of `gen_ai.provider.name` (2025).
12pub const GEN_AI_PROVIDER_NAME: &str = "gen_ai.provider.name";
13pub const GEN_AI_OPERATION_NAME: &str = "gen_ai.operation.name";
14pub const GEN_AI_REQUEST_MODEL: &str = "gen_ai.request.model";
15pub const GEN_AI_RESPONSE_MODEL: &str = "gen_ai.response.model";
16pub const GEN_AI_RESPONSE_FINISH_REASONS: &str = "gen_ai.response.finish_reasons";
17pub const GEN_AI_USAGE_INPUT_TOKENS: &str = "gen_ai.usage.input_tokens";
18pub const GEN_AI_USAGE_OUTPUT_TOKENS: &str = "gen_ai.usage.output_tokens";
19
20// ───── gen_ai.agent.* + conversation correlation ─────
21pub const GEN_AI_AGENT_ID: &str = "gen_ai.agent.id";
22pub const GEN_AI_AGENT_NAME: &str = "gen_ai.agent.name";
23pub const GEN_AI_CONVERSATION_ID: &str = "gen_ai.conversation.id";
24
25// ───── gen_ai.tool.* ─────
26pub const GEN_AI_TOOL_NAME: &str = "gen_ai.tool.name";
27pub const GEN_AI_TOOL_TYPE: &str = "gen_ai.tool.type";
28pub const GEN_AI_TOOL_CALL_ID: &str = "gen_ai.tool.call.id";
29
30// ───── error / mcp / network (Stable spec) ─────
31pub const ERROR_TYPE: &str = "error.type";
32pub const MCP_METHOD_NAME: &str = "mcp.method.name";
33pub const MCP_SESSION_ID: &str = "mcp.session.id";
34pub const NETWORK_TRANSPORT: &str = "network.transport";
35
36// ───── mur.* (no spec coverage; preserve) ─────
37pub const MUR_AGENT_UUID: &str = "mur.agent.uuid";
38pub const MUR_AGENT_NAME: &str = "mur.agent.name";
39pub const MUR_TASK_ID: &str = "mur.task.id";
40pub const MUR_MCP_SERVER: &str = "mur.mcp.server";
41pub const MUR_ENTITLEMENT_DENIED: &str = "mur.entitlement.denied"; // P0b usage
42pub const MUR_COST_USD: &str = "mur.cost_usd";
43pub const MUR_TRIGGER_KIND: &str = "mur.trigger.kind";
44pub const MUR_A2A_PEER_PUBKEY: &str = "mur.a2a.peer.pubkey";
45pub const MUR_HOOK_NAME: &str = "mur.hook.name";
46pub const MUR_HOOK_PHASE: &str = "mur.hook.phase";
47pub const MUR_FIRED_SKILLS: &str = "mur.fired_skills";
48pub const MUR_EVENT_TYPE: &str = "mur.event.type";
49
50// ───── method names emitted on the JSON-RPC notification side-channel ─────
51pub const METHOD_LLM_CALL: &str = "telemetry/llm_call";
52pub const METHOD_TOOL_CALL: &str = "telemetry/tool_call";
53pub const METHOD_ERROR: &str = "telemetry/error";
54pub const METHOD_HEARTBEAT: &str = "telemetry/heartbeat";
55pub const METHOD_WARNING: &str = "telemetry/warning";
56pub const METHOD_TASK_PROGRESS: &str = "task/progress";
57pub const METHOD_HOOK_FIRED: &str = "telemetry/hook_fired";
58pub const METHOD_BRIDGE_ALIVE: &str = "telemetry/bridge_alive";
59pub const METHOD_SKILL_EXECUTED: &str = "mur.skill.executed";
60pub const METHOD_SKILL_INDEXED: &str = "mur.skill.indexed";
61pub const METHOD_SKILL_STEP_RESOLVED: &str = "mur.skill.step_resolved";
62
63pub const MUR_SKILL_NAME: &str = "mur.skill.name";
64pub const MUR_SKILL_VERSION: &str = "mur.skill.version";
65pub const MUR_SKILL_OUTCOME: &str = "mur.skill.outcome";
66pub const MUR_SKILL_DURATION_MS: &str = "mur.skill.duration_ms";
67pub const MUR_SKILL_MANIFEST_DIGEST: &str = "mur.skill.manifest_digest";