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 config;
24pub mod core_metrics;
25pub mod futures;
26pub mod gas_price_metrics;
27pub mod graphql_metrics;
28pub mod importer;
29pub mod p2p_metrics;
30pub mod txpool_metrics;
31
32static GLOBAL_REGISTER: OnceLock<GlobalRegistry> = OnceLock::new();
33
34pub fn global_registry() -> &'static GlobalRegistry {
35    GLOBAL_REGISTER.get_or_init(GlobalRegistry::default)
36}
37
38pub fn encode_metrics() -> Result<String, std::fmt::Error> {
39    let mut encoded = String::new();
40
41    // encode the rest of the fuel-core metrics using latest prometheus
42    let registry = global_registry().registry.lock();
43    encode(&mut encoded, registry.deref())?;
44
45    Ok(encoded)
46}