commonware_resolver/p2p/
metrics.rs

1use commonware_runtime::{
2    telemetry::metrics::{histogram, status},
3    Clock, Metrics as RuntimeMetrics,
4};
5use prometheus_client::metrics::{gauge::Gauge, histogram::Histogram};
6use std::sync::Arc;
7
8/// Metrics for the peer actor.
9pub struct Metrics<E: RuntimeMetrics + Clock> {
10    /// Current number of pending fetch requests
11    pub fetch_pending: Gauge,
12    /// Current number of active fetch requests
13    pub fetch_active: Gauge,
14    /// Current number of serves currently in flight
15    pub serve_processing: Gauge,
16    /// Current number of blocked peers
17    pub peers_blocked: Gauge,
18    /// Number of fetches by status
19    pub fetch: status::Counter,
20    /// Number of canceled fetches by status
21    pub cancel: status::Counter,
22    /// Number of serves by status
23    pub serve: status::Counter,
24    /// Histogram of successful serves
25    pub serve_duration: histogram::Timed<E>,
26    /// Histogram of successful fetches
27    pub fetch_duration: histogram::Timed<E>,
28}
29
30impl<E: RuntimeMetrics + Clock> Metrics<E> {
31    /// Create and return a new set of metrics, registered with the given context.
32    pub fn init(context: E) -> Self {
33        let fetch_pending = Gauge::default();
34        context.register(
35            "fetch_pending",
36            "Current number of pending fetch requests",
37            fetch_pending.clone(),
38        );
39        let fetch_active = Gauge::default();
40        context.register(
41            "fetch_active",
42            "Current number of active fetch requests",
43            fetch_active.clone(),
44        );
45        let serve_processing = Gauge::default();
46        context.register(
47            "serve_processing",
48            "Current number of serves currently processing",
49            serve_processing.clone(),
50        );
51        let peers_blocked = Gauge::default();
52        context.register(
53            "peers_blocked",
54            "Current number of blocked peers",
55            peers_blocked.clone(),
56        );
57        let fetch = status::Counter::default();
58        context.register("fetch", "Number of fetches by status", fetch.clone());
59        let cancel = status::Counter::default();
60        context.register(
61            "cancel",
62            "Number of canceled fetches by status",
63            cancel.clone(),
64        );
65        let serve = status::Counter::default();
66        context.register("serve", "Number of serves by status", serve.clone());
67        let serve_duration = Histogram::new(histogram::Buckets::LOCAL.into_iter());
68        context.register(
69            "serve_duration",
70            "Histogram of successful serves",
71            serve_duration.clone(),
72        );
73        let fetch_duration = Histogram::new(histogram::Buckets::NETWORK.into_iter());
74        context.register(
75            "fetch_duration",
76            "Histogram of successful fetches",
77            fetch_duration.clone(),
78        );
79        // TODO(#1833): Shouldn't require another clone
80        let clock = Arc::new(context.clone());
81
82        Self {
83            fetch_pending,
84            fetch_active,
85            serve_processing,
86            peers_blocked,
87            fetch,
88            cancel,
89            serve,
90            fetch_duration: histogram::Timed::new(fetch_duration, clock.clone()),
91            serve_duration: histogram::Timed::new(serve_duration, clock),
92        }
93    }
94}