canic_core/ops/
perf.rs

1pub use crate::perf::PerfEntry;
2
3use crate::{cdk::candid::CandidType, perf, types::PageRequest};
4use serde::{Deserialize, Serialize};
5
6///
7/// PerfSnapshot
8/// Paginated view of perf counters keyed by label.
9///
10
11#[derive(CandidType, Clone, Debug, Deserialize, Serialize)]
12pub struct PerfSnapshot {
13    pub entries: Vec<PerfEntry>,
14    pub total: u64,
15}
16
17///
18/// PerfOps
19///
20
21pub struct PerfOps;
22
23impl PerfOps {
24    pub(crate) fn record(label: &str, delta: u64) {
25        perf::record(label, delta);
26    }
27
28    #[must_use]
29    pub fn snapshot(request: PageRequest) -> PerfSnapshot {
30        let request = request.clamped();
31        let offset = usize::try_from(request.offset).unwrap_or(usize::MAX);
32        let limit = usize::try_from(request.limit).unwrap_or(usize::MAX);
33
34        let entries = perf::entries();
35        let total = entries.len() as u64;
36        let entries = entries.into_iter().skip(offset).take(limit).collect();
37
38        PerfSnapshot { entries, total }
39    }
40}