Skip to main content

grate_limiter/
observation.rs

1use serde::{Deserialize, Serialize};
2
3/// An observation reported by the caller after a provider interaction.
4#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct Observation {
6    /// Which provider was used.
7    pub provider: String,
8    /// Which capability was invoked (optional, for metrics).
9    pub capability: Option<String>,
10    /// Resource usage for this interaction.
11    pub usage: Usage,
12    /// Outcome of the interaction.
13    pub outcome: Outcome,
14}
15
16/// Resource usage for a single interaction.
17#[derive(Debug, Clone, Default, Serialize, Deserialize)]
18pub struct Usage {
19    /// Number of requests consumed (typically 1).
20    pub requests: u64,
21    /// Tokens consumed (e.g., LLM tokens).
22    pub tokens: Option<u64>,
23    /// Bytes transferred.
24    pub bytes: Option<u64>,
25    /// Cost in USD (micro-dollars for precision).
26    pub cost_micro_usd: Option<u64>,
27}
28
29/// Outcome of a provider interaction.
30#[derive(Debug, Clone, Serialize, Deserialize)]
31pub struct Outcome {
32    /// Classified status of the response.
33    pub status: StatusClass,
34    /// Response latency in milliseconds.
35    pub latency_ms: u64,
36}
37
38/// Classified response status for health tracking.
39#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
40#[serde(rename_all = "snake_case")]
41pub enum StatusClass {
42    /// 2xx success.
43    Success,
44    /// 429 rate limited.
45    RateLimited,
46    /// 403 forbidden / banned.
47    Forbidden,
48    /// 5xx server error.
49    ServerError,
50    /// Request timed out.
51    Timeout,
52    /// Other client error (4xx excluding 429/403).
53    ClientError,
54}