iota_network/state_sync/
metrics.rs

1// Copyright (c) Mysten Labs, Inc.
2// Modifications Copyright (c) 2024 IOTA Stiftung
3// SPDX-License-Identifier: Apache-2.0
4
5use std::sync::Arc;
6
7use iota_metrics::histogram::Histogram;
8use iota_types::messages_checkpoint::CheckpointSequenceNumber;
9use prometheus::{IntGauge, Registry, register_int_gauge_with_registry};
10use tap::Pipe;
11
12#[derive(Clone)]
13pub(super) struct Metrics(Option<Arc<Inner>>);
14
15impl std::fmt::Debug for Metrics {
16    fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {
17        fmt.debug_struct("Metrics").finish()
18    }
19}
20
21impl Metrics {
22    pub fn enabled(registry: &Registry) -> Self {
23        Metrics(Some(Inner::new(registry)))
24    }
25
26    pub fn disabled() -> Self {
27        Metrics(None)
28    }
29
30    pub fn set_highest_known_checkpoint(&self, sequence_number: CheckpointSequenceNumber) {
31        if let Some(inner) = &self.0 {
32            inner.highest_known_checkpoint.set(sequence_number as i64);
33        }
34    }
35
36    pub fn set_highest_verified_checkpoint(&self, sequence_number: CheckpointSequenceNumber) {
37        if let Some(inner) = &self.0 {
38            inner
39                .highest_verified_checkpoint
40                .set(sequence_number as i64);
41        }
42    }
43
44    pub fn set_highest_synced_checkpoint(&self, sequence_number: CheckpointSequenceNumber) {
45        if let Some(inner) = &self.0 {
46            inner.highest_synced_checkpoint.set(sequence_number as i64);
47        }
48    }
49
50    pub fn checkpoint_summary_age_metric(&self) -> Option<&Histogram> {
51        if let Some(inner) = &self.0 {
52            return Some(&inner.checkpoint_summary_age_ms);
53        }
54        None
55    }
56}
57
58struct Inner {
59    highest_known_checkpoint: IntGauge,
60    highest_verified_checkpoint: IntGauge,
61    highest_synced_checkpoint: IntGauge,
62    checkpoint_summary_age_ms: Histogram,
63}
64
65impl Inner {
66    pub fn new(registry: &Registry) -> Arc<Self> {
67        Self {
68            highest_known_checkpoint: register_int_gauge_with_registry!(
69                "highest_known_checkpoint",
70                "Highest known checkpoint",
71                registry
72            )
73            .unwrap(),
74
75            highest_verified_checkpoint: register_int_gauge_with_registry!(
76                "highest_verified_checkpoint",
77                "Highest verified checkpoint",
78                registry
79            )
80            .unwrap(),
81
82            highest_synced_checkpoint: register_int_gauge_with_registry!(
83                "highest_synced_checkpoint",
84                "Highest synced checkpoint",
85                registry
86            )
87            .unwrap(),
88
89            checkpoint_summary_age_ms: Histogram::new_in_registry(
90                "checkpoint_summary_age_ms",
91                "Age of checkpoints summaries when they arrive and are verified.",
92                registry,
93            ),
94        }
95        .pipe(Arc::new)
96    }
97}