cat_gateway/metrics/chain_follower/
mod.rs

1//! Metrics related to Chain Follower analytics.
2
3use cardano_chain_follower::{Network, Statistics};
4
5use crate::settings::Settings;
6
7mod reporter;
8
9/// Updates Chain Follower metrics to current values.
10pub(crate) fn update() {
11    let api_host_names = Settings::api_host_names().join(",");
12    let service_id = Settings::service_id();
13    let network = Settings::cardano_network();
14
15    let follower_stats = Statistics::new(network);
16
17    report_mithril(&follower_stats, &api_host_names, service_id, network);
18    report_live(&follower_stats, &api_host_names, service_id, network);
19}
20
21/// Performs reporting Chain Follower's Mithril information to Prometheus.
22#[allow(clippy::indexing_slicing)]
23fn report_mithril(stats: &Statistics, api_host_names: &str, service_id: &str, network: Network) {
24    let stats = &stats.mithril;
25    let network = network.to_string();
26
27    reporter::MITHRIL_UPDATES
28        .with_label_values(&[api_host_names, service_id, &network])
29        .set(i64::try_from(stats.updates).unwrap_or(-1));
30    reporter::MITHRIL_TIP
31        .with_label_values(&[api_host_names, service_id, &network])
32        .set(i64::try_from(u64::from(stats.tip)).unwrap_or(-1));
33    reporter::MITHRIL_DL_START
34        .with_label_values(&[api_host_names, service_id, &network])
35        .set(stats.dl_start.timestamp());
36    reporter::MITHRIL_DL_END
37        .with_label_values(&[api_host_names, service_id, &network])
38        .set(stats.dl_end.timestamp());
39    reporter::MITHRIL_DL_FAILURES
40        .with_label_values(&[api_host_names, service_id, &network])
41        .set(i64::try_from(stats.dl_failures).unwrap_or(-1));
42    reporter::MITHRIL_LAST_DL_DURATION
43        .with_label_values(&[api_host_names, service_id, &network])
44        .set(i64::try_from(stats.last_dl_duration).unwrap_or(-1));
45    reporter::MITHRIL_DL_SIZE
46        .with_label_values(&[api_host_names, service_id, &network])
47        .set(i64::try_from(stats.dl_size).unwrap_or(-1));
48    reporter::MITHRIL_EXTRACT_START
49        .with_label_values(&[api_host_names, service_id, &network])
50        .set(stats.extract_start.timestamp());
51    reporter::MITHRIL_EXTRACT_END
52        .with_label_values(&[api_host_names, service_id, &network])
53        .set(stats.extract_end.timestamp());
54    reporter::MITHRIL_EXTRACT_FAILURES
55        .with_label_values(&[api_host_names, service_id, &network])
56        .set(i64::try_from(stats.extract_failures).unwrap_or(-1));
57    reporter::MITHRIL_EXTRACT_SIZE
58        .with_label_values(&[api_host_names, service_id, &network])
59        .set(i64::try_from(stats.extract_size).unwrap_or(-1));
60    reporter::MITHRIL_DEDUPLICATED_SIZE
61        .with_label_values(&[api_host_names, service_id, &network])
62        .set(i64::try_from(stats.deduplicated_size).unwrap_or(-1));
63    reporter::MITHRIL_DEDUPLICATED
64        .with_label_values(&[api_host_names, service_id, &network])
65        .set(i64::try_from(stats.deduplicated).unwrap_or(-1));
66    reporter::MITHRIL_CHANGED
67        .with_label_values(&[api_host_names, service_id, &network])
68        .set(i64::try_from(stats.changed).unwrap_or(-1));
69    reporter::MITHRIL_NEW
70        .with_label_values(&[api_host_names, service_id, &network])
71        .set(i64::try_from(stats.new).unwrap_or(-1));
72    reporter::MITHRIL_VALIDATE_START
73        .with_label_values(&[api_host_names, service_id, &network])
74        .set(stats.validate_start.timestamp());
75    reporter::MITHRIL_VALIDATE_END
76        .with_label_values(&[api_host_names, service_id, &network])
77        .set(stats.validate_end.timestamp());
78    reporter::MITHRIL_VALIDATE_FAILURES
79        .with_label_values(&[api_host_names, service_id, &network])
80        .set(i64::try_from(stats.validate_failures).unwrap_or(-1));
81    reporter::MITHRIL_INVALID_BLOCKS
82        .with_label_values(&[api_host_names, service_id, &network])
83        .set(i64::try_from(stats.invalid_blocks).unwrap_or(-1));
84    reporter::MITHRIL_DOWNLOAD_OR_VALIDATION_FAILED
85        .with_label_values(&[api_host_names, service_id, &network])
86        .set(i64::try_from(stats.download_or_validation_failed).unwrap_or(-1));
87    reporter::MITHRIL_FAILED_TO_GET_TIP
88        .with_label_values(&[api_host_names, service_id, &network])
89        .set(i64::try_from(stats.failed_to_get_tip).unwrap_or(-1));
90    reporter::MITHRIL_TIP_DID_NOT_ADVANCE
91        .with_label_values(&[api_host_names, service_id, &network])
92        .set(i64::try_from(stats.tip_did_not_advance).unwrap_or(-1));
93    reporter::MITHRIL_TIP_FAILED_TO_SEND_TO_UPDATER
94        .with_label_values(&[api_host_names, service_id, &network])
95        .set(i64::try_from(stats.tip_failed_to_send_to_updater).unwrap_or(-1));
96    reporter::MITHRIL_FAILED_TO_ACTIVATE_NEW_SNAPSHOT
97        .with_label_values(&[api_host_names, service_id, &network])
98        .set(i64::try_from(stats.failed_to_activate_new_snapshot).unwrap_or(-1));
99}
100
101/// Performs reporting Chain Follower's Live information to Prometheus.
102#[allow(clippy::indexing_slicing)]
103fn report_live(stats: &Statistics, api_host_names: &str, service_id: &str, network: Network) {
104    let stats = &stats.live;
105    let network = network.to_string();
106
107    reporter::LIVE_SYNC_START
108        .with_label_values(&[api_host_names, service_id, &network])
109        .set(stats.sync_start.timestamp());
110    reporter::LIVE_SYNC_END
111        .with_label_values(&[api_host_names, service_id, &network])
112        .set(stats.sync_end.map_or(0, |s| s.timestamp()));
113    reporter::LIVE_BACKFILL_START
114        .with_label_values(&[api_host_names, service_id, &network])
115        .set(stats.backfill_start.map_or(0, |s| s.timestamp()));
116    reporter::LIVE_BACKFILL_SIZE
117        .with_label_values(&[api_host_names, service_id, &network])
118        .set(i64::try_from(stats.backfill_size).unwrap_or(-1));
119    reporter::LIVE_BACKFILL_END
120        .with_label_values(&[api_host_names, service_id, &network])
121        .set(stats.backfill_end.map_or(0, |s| s.timestamp()));
122    reporter::LIVE_BACKFILL_FAILURES
123        .with_label_values(&[api_host_names, service_id, &network])
124        .set(i64::try_from(stats.backfill_failures).unwrap_or(-1));
125    reporter::LIVE_BACKFILL_FAILURE_TIME
126        .with_label_values(&[api_host_names, service_id, &network])
127        .set(stats.backfill_failure_time.map_or(0, |s| s.timestamp()));
128    reporter::LIVE_BLOCKS
129        .with_label_values(&[api_host_names, service_id, &network])
130        .set(i64::try_from(stats.blocks).unwrap_or(-1));
131    reporter::LIVE_HEAD_SLOT
132        .with_label_values(&[api_host_names, service_id, &network])
133        .set(i64::try_from(u64::from(stats.head_slot)).unwrap_or(-1));
134    reporter::LIVE_TIP
135        .with_label_values(&[api_host_names, service_id, &network])
136        .set(i64::try_from(u64::from(stats.tip)).unwrap_or(-1));
137    reporter::LIVE_RECONNECTS
138        .with_label_values(&[api_host_names, service_id, &network])
139        .set(i64::try_from(stats.reconnects).unwrap_or(-1));
140    reporter::LIVE_LAST_CONNECT
141        .with_label_values(&[api_host_names, service_id, &network])
142        .set(stats.last_connect.timestamp());
143    reporter::LIVE_LAST_DISCONNECT
144        .with_label_values(&[api_host_names, service_id, &network])
145        .set(stats.last_disconnect.timestamp());
146    reporter::LIVE_CONNECTED
147        .with_label_values(&[api_host_names, service_id, &network])
148        .set(i64::from(stats.connected));
149    reporter::LIVE_ROLLBACKS_LIVE_COUNT
150        .with_label_values(&[api_host_names, service_id, &network])
151        .set(i64::try_from(stats.rollbacks.live.len()).unwrap_or(-1));
152    reporter::LIVE_ROLLBACKS_PEER_COUNT
153        .with_label_values(&[api_host_names, service_id, &network])
154        .set(i64::try_from(stats.rollbacks.peer.len()).unwrap_or(-1));
155    reporter::LIVE_ROLLBACKS_FOLLOWER_COUNT
156        .with_label_values(&[api_host_names, service_id, &network])
157        .set(i64::try_from(stats.rollbacks.follower.len()).unwrap_or(-1));
158    reporter::LIVE_NEW_BLOCKS
159        .with_label_values(&[api_host_names, service_id, &network])
160        .set(i64::try_from(stats.new_blocks).unwrap_or(-1));
161    reporter::LIVE_INVALID_BLOCKS
162        .with_label_values(&[api_host_names, service_id, &network])
163        .set(i64::try_from(stats.invalid_blocks).unwrap_or(-1));
164    reporter::LIVE_FOLLOWER_COUNT
165        .with_label_values(&[api_host_names, service_id, &network])
166        .set(i64::try_from(stats.follower.len()).unwrap_or(-1));
167}