fuel_core_metrics/
core_metrics.rs

1use crate::global_registry;
2use prometheus_client::metrics::counter::Counter;
3use std::collections::HashMap;
4
5#[derive(Debug)]
6pub struct DatabaseMetrics {
7    // For descriptions of each Counter, see the `new` function where each Counter/Histogram is initialized
8    pub write_meter: Counter,
9    pub read_meter: Counter,
10    pub bytes_written: Counter,
11    pub bytes_read: Counter,
12    pub database_commit_time: Counter,
13    pub columns_read_statistic: HashMap<u32, Counter>,
14    pub columns_write_statistic: HashMap<u32, Counter>,
15}
16
17impl DatabaseMetrics {
18    pub fn new(name: &str, columns: &[(u32, String)]) -> Self {
19        let mut registry = global_registry().registry.lock();
20
21        let columns_read_statistic = columns
22            .iter()
23            .map(|(column_id, column_name)| {
24                let counter: Counter = Counter::default();
25                registry.register(
26                    format!("{}_Column_{}_Reads", name, column_name),
27                    format!(
28                        "Number of {} read operations on column {}",
29                        name, column_name
30                    ),
31                    counter.clone(),
32                );
33                (*column_id, counter)
34            })
35            .collect();
36
37        let columns_write_statistic = columns
38            .iter()
39            .map(|(column_id, column_name)| {
40                let counter: Counter = Counter::default();
41                registry.register(
42                    format!("{}_Column_{}_Writes", name, column_name),
43                    format!(
44                        "Number of {} write operations on column {}",
45                        name, column_name
46                    ),
47                    counter.clone(),
48                );
49                (*column_id, counter)
50            })
51            .collect();
52
53        let write_meter: Counter = Counter::default();
54        let read_meter: Counter = Counter::default();
55        let bytes_written = Counter::default();
56        let bytes_read = Counter::default();
57        let database_commit_time: Counter = Counter::default();
58
59        registry.register(
60            format!("{}_Database_Writes", name),
61            format!("Number of {} database write operations", name),
62            write_meter.clone(),
63        );
64        registry.register(
65            format!("{}_Database_Reads", name),
66            format!("Number of {} database read operations", name),
67            read_meter.clone(),
68        );
69        registry.register(
70            format!("{}_Bytes_Read", name),
71            format!("The total amount of read bytes from {}", name),
72            bytes_read.clone(),
73        );
74        registry.register(
75            format!("{}_Bytes_Written", name),
76            format!("The total amount of written bytes into {}", name),
77            bytes_written.clone(),
78        );
79        registry.register(
80            format!("{}_Database_Commit_Time", name),
81            format!(
82                "The total commit time of the {} database including all sub-databases",
83                name
84            ),
85            database_commit_time.clone(),
86        );
87
88        DatabaseMetrics {
89            write_meter,
90            read_meter,
91            bytes_read,
92            bytes_written,
93            database_commit_time,
94            columns_read_statistic,
95            columns_write_statistic,
96        }
97    }
98}