fuel_core_metrics/
lib.rs

1#![deny(clippy::arithmetic_side_effects)]
2#![deny(clippy::cast_possible_truncation)]
3#![deny(unused_crate_dependencies)]
4#![deny(warnings)]
5
6use prometheus_client::{
7    encoding::text::encode,
8    registry::Registry,
9};
10use std::{
11    ops::Deref,
12    sync::OnceLock,
13};
14
15/// The global register of all metrics.
16#[derive(Default)]
17pub struct GlobalRegistry {
18    // It is okay to use std mutex because we register each metric only one time.
19    pub registry: parking_lot::Mutex<Registry>,
20}
21
22mod buckets;
23pub mod compression_metrics;
24pub mod config;
25pub mod core_metrics;
26pub mod futures;
27pub mod gas_price_metrics;
28pub mod graphql_metrics;
29pub mod importer;
30pub mod p2p_metrics;
31pub mod tx_status_manager_metrics;
32pub mod txpool_metrics;
33
34static GLOBAL_REGISTER: OnceLock<GlobalRegistry> = OnceLock::new();
35
36pub fn global_registry() -> &'static GlobalRegistry {
37    GLOBAL_REGISTER.get_or_init(GlobalRegistry::default)
38}
39
40pub fn encode_metrics() -> Result<String, std::fmt::Error> {
41    let mut encoded = String::new();
42
43    // encode the rest of the fuel-core metrics using latest prometheus
44    let registry = global_registry().registry.lock();
45    encode(&mut encoded, registry.deref())?;
46
47    Ok(encoded)
48}