use std::time::Duration;
use crate::errors::LlmError;
use crate::providers::TokenUsage;
use super::{labels, names};
pub fn record_request_success(
provider: &str,
model: &str,
task: Option<&str>,
duration: Duration,
usage: Option<&TokenUsage>,
) {
let task_value = task.unwrap_or("default");
metrics::counter!(
names::REQUESTS_TOTAL,
labels::keys::PROVIDER => provider.to_string(),
labels::keys::MODEL => model.to_string(),
labels::keys::TASK => task_value.to_string()
)
.increment(1);
metrics::histogram!(
names::REQUEST_DURATION,
labels::keys::PROVIDER => provider.to_string(),
labels::keys::MODEL => model.to_string(),
labels::keys::TASK => task_value.to_string()
)
.record(duration.as_secs_f64());
if let Some(usage) = usage {
metrics::counter!(
names::TOKENS_PROMPT,
labels::keys::PROVIDER => provider.to_string(),
labels::keys::MODEL => model.to_string()
)
.increment(usage.prompt_tokens as u64);
metrics::counter!(
names::TOKENS_COMPLETION,
labels::keys::PROVIDER => provider.to_string(),
labels::keys::MODEL => model.to_string()
)
.increment(usage.completion_tokens as u64);
}
}
pub fn record_request_failure(
provider: &str,
model: &str,
task: Option<&str>,
error: &LlmError,
duration: Duration,
) {
let task_value = task.unwrap_or("default");
metrics::counter!(
names::REQUESTS_TOTAL,
labels::keys::PROVIDER => provider.to_string(),
labels::keys::MODEL => model.to_string(),
labels::keys::TASK => task_value.to_string()
)
.increment(1);
metrics::histogram!(
names::REQUEST_DURATION,
labels::keys::PROVIDER => provider.to_string(),
labels::keys::MODEL => model.to_string(),
labels::keys::TASK => task_value.to_string()
)
.record(duration.as_secs_f64());
metrics::counter!(
names::ERRORS_TOTAL,
labels::keys::PROVIDER => provider.to_string(),
labels::keys::MODEL => model.to_string(),
labels::keys::ERROR_TYPE => labels::error_type_label(error).to_string()
)
.increment(1);
if matches!(error, LlmError::RateLimit(_)) {
metrics::counter!(
names::RATE_LIMITS_TOTAL,
labels::keys::PROVIDER => provider.to_string()
)
.increment(1);
}
}
pub fn record_retry(provider: &str) {
metrics::counter!(
names::RETRIES_TOTAL,
labels::keys::PROVIDER => provider.to_string()
)
.increment(1);
}
pub fn set_provider_health(provider: &str, healthy: bool) {
metrics::gauge!(
names::PROVIDER_HEALTHY,
labels::keys::PROVIDER => provider.to_string()
)
.set(if healthy { 1.0 } else { 0.0 });
}