stratus/infra/metrics/
metrics_config.rs

1use std::net::SocketAddr;
2use std::stringify;
3
4use clap::Parser;
5use display_json::DebugAsJson;
6
7use crate::infra::metrics::metrics_for_consensus;
8use crate::infra::metrics::metrics_for_evm;
9use crate::infra::metrics::metrics_for_executor;
10use crate::infra::metrics::metrics_for_importer_online;
11use crate::infra::metrics::metrics_for_json_rpc;
12use crate::infra::metrics::metrics_for_kafka;
13use crate::infra::metrics::metrics_for_rocks;
14use crate::infra::metrics::metrics_for_storage_read;
15use crate::infra::metrics::metrics_for_storage_write;
16
17#[derive(DebugAsJson, Clone, Parser, serde::Serialize)]
18pub struct MetricsConfig {
19    /// Metrics exporter binding address.
20    #[arg(long = "metrics-exporter-address", env = "METRICS_EXPORTER_ADDRESS", default_value = "0.0.0.0:9000")]
21    pub metrics_exporter_address: SocketAddr,
22}
23
24impl MetricsConfig {
25    /// Inits application global metrics exporter.
26    pub fn init(&self) -> anyhow::Result<()> {
27        tracing::info!(address = %self.metrics_exporter_address, "creating metrics exporter");
28
29        // get metric definitions
30        let mut metrics = Vec::new();
31        metrics.extend(metrics_for_importer_online());
32        metrics.extend(metrics_for_json_rpc());
33        metrics.extend(metrics_for_executor());
34        metrics.extend(metrics_for_evm());
35        metrics.extend(metrics_for_storage_read());
36        metrics.extend(metrics_for_storage_write());
37        metrics.extend(metrics_for_rocks());
38        metrics.extend(metrics_for_consensus());
39        metrics.extend(metrics_for_kafka());
40
41        // init metric exporter
42        init_metrics_exporter(self.metrics_exporter_address);
43
44        // init metric description (always after provider started)
45        for metric in &metrics {
46            metric.register_description();
47        }
48
49        Ok(())
50    }
51}
52
53#[cfg(feature = "metrics")]
54fn init_metrics_exporter(address: SocketAddr) {
55    tracing::info!(%address, "creating prometheus metrics exporter");
56    if let Err(e) = metrics_exporter_prometheus::PrometheusBuilder::new()
57        .add_global_label("service", crate::infra::build_info::service_name())
58        .add_global_label("version", crate::infra::build_info::version())
59        .with_http_listener(address)
60        .install()
61    {
62        tracing::error!(reason = ?e, %address, "failed to create metrics exporter");
63    }
64}
65
66#[cfg(not(feature = "metrics"))]
67fn init_metrics_exporter(_: SocketAddr) {
68    tracing::info!("creating noop metrics exporter");
69}