use tracing::Span;
pub fn agent_run_span(agent_name: &str, invocation_id: &str) -> Span {
tracing::info_span!(
"agent.run",
agent.name = agent_name,
invocation.id = invocation_id,
otel.kind = "internal"
)
}
pub fn model_call_span(model_name: &str) -> Span {
tracing::info_span!("model.call", model.name = model_name, otel.kind = "client")
}
pub fn llm_generate_span(provider: &str, model_name: &str, stream: bool) -> Span {
tracing::info_span!(
"gen_ai.generate",
gen_ai.system = %provider,
gen_ai.request.model = %model_name,
gen_ai.request.stream = stream,
gen_ai.usage.input_tokens = tracing::field::Empty,
gen_ai.usage.output_tokens = tracing::field::Empty,
gen_ai.usage.total_tokens = tracing::field::Empty,
gen_ai.usage.cache_read_tokens = tracing::field::Empty,
gen_ai.usage.cache_creation_tokens = tracing::field::Empty,
gen_ai.usage.thinking_tokens = tracing::field::Empty,
gen_ai.usage.audio_input_tokens = tracing::field::Empty,
gen_ai.usage.audio_output_tokens = tracing::field::Empty,
otel.kind = "client",
)
}
#[derive(Debug, Clone, Default)]
pub struct LlmUsage {
pub input_tokens: i32,
pub output_tokens: i32,
pub total_tokens: i32,
pub cache_read_tokens: Option<i32>,
pub cache_creation_tokens: Option<i32>,
pub thinking_tokens: Option<i32>,
pub audio_input_tokens: Option<i32>,
pub audio_output_tokens: Option<i32>,
}
pub fn record_llm_usage(usage: &LlmUsage) {
let span = Span::current();
span.record("gen_ai.usage.input_tokens", i64::from(usage.input_tokens));
span.record("gen_ai.usage.output_tokens", i64::from(usage.output_tokens));
span.record("gen_ai.usage.total_tokens", i64::from(usage.total_tokens));
if let Some(v) = usage.cache_read_tokens {
span.record("gen_ai.usage.cache_read_tokens", i64::from(v));
}
if let Some(v) = usage.cache_creation_tokens {
span.record("gen_ai.usage.cache_creation_tokens", i64::from(v));
}
if let Some(v) = usage.thinking_tokens {
span.record("gen_ai.usage.thinking_tokens", i64::from(v));
}
if let Some(v) = usage.audio_input_tokens {
span.record("gen_ai.usage.audio_input_tokens", i64::from(v));
}
if let Some(v) = usage.audio_output_tokens {
span.record("gen_ai.usage.audio_output_tokens", i64::from(v));
}
}
pub fn tool_execute_span(tool_name: &str) -> Span {
tracing::info_span!("tool.execute", tool.name = tool_name, otel.kind = "internal")
}
pub fn callback_span(callback_type: &str) -> Span {
tracing::debug_span!(
"callback",
callback.type = callback_type,
)
}
pub fn add_context_attributes(user_id: &str, session_id: &str) {
let span = Span::current();
span.record("user.id", user_id);
span.record("session.id", session_id);
}