Skip to main content

canic_core/workflow/metrics/
query.rs

1use crate::{
2    dto::{
3        metrics::{MetricEntry, MetricsKind},
4        page::{Page, PageRequest},
5    },
6    ops::runtime::metrics,
7    workflow::view::paginate::paginate_vec,
8};
9
10///
11/// MetricsQuery
12///
13/// Read-only query façade over metric snapshots.
14/// Responsible for mapping, sorting, and pagination only.
15///
16
17pub struct MetricsQuery;
18
19impl MetricsQuery {
20    #[must_use]
21    pub fn page(kind: MetricsKind, page: PageRequest) -> Page<MetricEntry> {
22        let mut entries = metrics::entries(kind);
23        entries.sort_by(|a, b| {
24            a.labels
25                .cmp(&b.labels)
26                .then_with(|| a.principal.cmp(&b.principal))
27        });
28
29        paginate_vec(entries, page)
30    }
31}
32
33///
34/// TESTS
35///
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40    use crate::{
41        ids::AccessMetricKind,
42        ops::runtime::metrics::{self, access::AccessMetrics},
43    };
44
45    #[test]
46    fn page_sorts_metric_rows_before_paginating() {
47        metrics::reset_for_tests();
48
49        AccessMetrics::increment("zeta", AccessMetricKind::Auth, "caller_is_root");
50        AccessMetrics::increment("alpha", AccessMetricKind::Guard, "app_allows_updates");
51
52        let page = MetricsQuery::page(
53            MetricsKind::Access,
54            PageRequest {
55                limit: 1,
56                offset: 0,
57            },
58        );
59
60        assert_eq!(page.total, 2);
61        assert_eq!(
62            page.entries[0].labels,
63            ["alpha", "guard", "app_allows_updates"]
64        );
65
66        let page = MetricsQuery::page(
67            MetricsKind::Access,
68            PageRequest {
69                limit: 1,
70                offset: 1,
71            },
72        );
73
74        assert_eq!(page.total, 2);
75        assert_eq!(page.entries[0].labels, ["zeta", "auth", "caller_is_root"]);
76    }
77}