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