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}