gemini_adk_rs/telemetry/
spans.rs1pub fn agent_run_span(agent_name: &str, session_id: &str) -> tracing::Span {
7 tracing::info_span!(
8 "gemini.agent.run",
9 agent_name = agent_name,
10 session_id = session_id,
11 )
12}
13
14pub fn agent_transfer_span(from: &str, to: &str, session_id: &str) -> tracing::Span {
16 tracing::info_span!(
17 "gemini.agent.transfer",
18 from = from,
19 to = to,
20 session_id = session_id,
21 )
22}
23
24pub fn tool_dispatch_span(tool_name: &str, tool_class: &str, session_id: &str) -> tracing::Span {
26 tracing::info_span!(
27 "gemini.agent.tool_dispatch",
28 tool_name = tool_name,
29 tool_class = tool_class,
30 session_id = session_id,
31 )
32}
33
34pub fn agent_tool_span(agent_name: &str, parent_agent: &str) -> tracing::Span {
36 tracing::info_span!(
37 "gemini.agent.agent_tool",
38 agent_name = agent_name,
39 parent_agent = parent_agent,
40 )
41}
42
43pub fn runner_span(root_agent: &str) -> tracing::Span {
45 tracing::info_span!("gemini.agent.runner", root_agent = root_agent)
46}
47
48pub fn call_llm_span(model_id: &str, agent_name: &str, session_id: &str) -> tracing::Span {
50 tracing::info_span!(
51 "gemini.agent.call_llm",
52 model_id = model_id,
53 agent_name = agent_name,
54 session_id = session_id,
55 )
56}
57
58pub fn invocation_span(invocation_id: &str, root_agent: &str) -> tracing::Span {
60 tracing::info_span!(
61 "gemini.agent.invocation",
62 invocation_id = invocation_id,
63 root_agent = root_agent,
64 )
65}
66
67pub fn phase_transition_span(from_phase: &str, to_phase: &str, session_id: &str) -> tracing::Span {
69 tracing::info_span!(
70 "gemini.agent.phase_transition",
71 from_phase = from_phase,
72 to_phase = to_phase,
73 session_id = session_id,
74 )
75}
76
77pub fn extraction_span(extractor_name: &str, session_id: &str) -> tracing::Span {
79 tracing::info_span!(
80 "gemini.agent.extraction",
81 extractor_name = extractor_name,
82 session_id = session_id,
83 )
84}
85
86pub fn invoke_agent_span(agent_name: &str) -> tracing::Span {
95 tracing::info_span!(
96 "invoke_agent",
97 otel.name = %format_args!("invoke_agent {agent_name}"),
98 gen_ai.operation.name = "invoke_agent",
99 gen_ai.agent.name = agent_name,
100 )
101}
102
103pub fn chat_span(model: &str, request: &crate::llm::LlmRequest) -> tracing::Span {
106 tracing::info_span!(
107 "chat",
108 otel.name = %format_args!("chat {model}"),
109 gen_ai.operation.name = "chat",
110 gen_ai.request.model = model,
111 gen_ai.request.temperature = request.temperature.map(f64::from),
112 gen_ai.request.top_p = request.top_p.map(f64::from),
113 gen_ai.request.top_k = request.top_k,
114 gen_ai.request.max_tokens = request.max_output_tokens,
115 gen_ai.response.finish_reasons = tracing::field::Empty,
116 gen_ai.usage.input_tokens = tracing::field::Empty,
117 gen_ai.usage.output_tokens = tracing::field::Empty,
118 error.type = tracing::field::Empty,
119 )
120}
121
122pub fn record_chat_response(
124 span: &tracing::Span,
125 outcome: Result<&crate::llm::LlmResponse, &crate::llm::LlmError>,
126) {
127 match outcome {
128 Ok(response) => {
129 if let Some(reason) = &response.finish_reason {
130 span.record("gen_ai.response.finish_reasons", reason.as_str());
131 }
132 if let Some(usage) = response.usage {
133 span.record("gen_ai.usage.input_tokens", usage.prompt_tokens);
134 span.record("gen_ai.usage.output_tokens", usage.completion_tokens);
135 }
136 }
137 Err(error) => {
138 let kind = match error.status() {
139 Some(status) => status.to_string(),
140 None => "error".to_string(),
141 };
142 span.record("error.type", kind.as_str());
143 }
144 }
145}
146
147pub fn execute_tool_span(tool_name: &str, call_id: Option<&str>) -> tracing::Span {
149 tracing::info_span!(
150 "execute_tool",
151 otel.name = %format_args!("execute_tool {tool_name}"),
152 gen_ai.operation.name = "execute_tool",
153 gen_ai.tool.name = tool_name,
154 gen_ai.tool.call.id = call_id,
155 error.type = tracing::field::Empty,
156 )
157}