Skip to main content

canic_core/dto/
metrics.rs

1use crate::dto::prelude::*;
2
3pub use crate::domain::metrics::MetricsKind;
4
5//
6// Metrics DTOs
7//
8
9//
10// MetricEntry
11//
12// Unified metrics row.
13//
14
15#[derive(CandidType, Debug, Deserialize)]
16pub struct MetricEntry {
17    // Ordered labels.
18    pub labels: Vec<String>,
19
20    // Optional principal dimension.
21    pub principal: Option<Principal>,
22
23    // Metric payload.
24    pub value: MetricValue,
25}
26
27//
28// MetricValue
29//
30
31#[derive(CandidType, Debug, Deserialize)]
32pub enum MetricValue {
33    Count(u64),
34    CountAndU64 { count: u64, value_u64: u64 },
35    U128(u128),
36}
37
38//
39// QueryPerfSample
40//
41// Same-call query performance sample.
42//
43
44#[derive(CandidType, Deserialize)]
45pub struct QueryPerfSample<T> {
46    // Query result returned by the probe.
47    pub value: T,
48
49    // Local instruction counter observed in the same query call context.
50    pub local_instructions: u64,
51}
52
53#[cfg(test)]
54mod tests {
55    use super::*;
56
57    #[test]
58    fn reexported_metrics_kind_roundtrips_through_candid() {
59        let kind = crate::domain::metrics::MetricsKind::Security;
60
61        let bytes = candid::encode_one(kind).expect("encode metrics kind");
62        let decoded: MetricsKind = candid::decode_one(&bytes).expect("decode metrics kind");
63
64        assert!(matches!(decoded, MetricsKind::Security));
65    }
66}