canic_core/workflow/metrics/
query.rs1use crate::{
2 dto::{
3 metrics::{MetricEntry, MetricsKind},
4 page::{Page, PageRequest},
5 },
6 ops::runtime::metrics,
7 workflow::view::paginate::paginate_vec,
8};
9
10pub 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#[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}