telemetry.rs

 1use anyhow::Result;
 2use serde::Serialize;
 3
 4#[derive(Serialize, Debug, clickhouse::Row)]
 5pub struct LlmUsageEventRow {
 6    pub time: i64,
 7    pub user_id: i32,
 8    pub is_staff: bool,
 9    pub plan: String,
10    pub model: String,
11    pub provider: String,
12    pub input_token_count: u64,
13    pub output_token_count: u64,
14    pub requests_this_minute: u64,
15    pub tokens_this_minute: u64,
16    pub tokens_this_day: u64,
17    pub input_tokens_this_month: u64,
18    pub output_tokens_this_month: u64,
19    pub spending_this_month: u64,
20}
21
22#[derive(Serialize, Debug, clickhouse::Row)]
23pub struct LlmRateLimitEventRow {
24    pub time: i64,
25    pub user_id: i32,
26    pub is_staff: bool,
27    pub plan: String,
28    pub model: String,
29    pub provider: String,
30    pub usage_measure: String,
31    pub requests_this_minute: u64,
32    pub tokens_this_minute: u64,
33    pub tokens_this_day: u64,
34    pub users_in_recent_minutes: u64,
35    pub users_in_recent_days: u64,
36    pub max_requests_per_minute: u64,
37    pub max_tokens_per_minute: u64,
38    pub max_tokens_per_day: u64,
39}
40
41pub async fn report_llm_usage(client: &clickhouse::Client, row: LlmUsageEventRow) -> Result<()> {
42    let mut insert = client.insert("llm_usage_events")?;
43    insert.write(&row).await?;
44    insert.end().await?;
45    Ok(())
46}
47
48pub async fn report_llm_rate_limit(
49    client: &clickhouse::Client,
50    row: LlmRateLimitEventRow,
51) -> Result<()> {
52    let mut insert = client.insert("llm_rate_limits")?;
53    insert.write(&row).await?;
54    insert.end().await?;
55    Ok(())
56}