stratus/infra/metrics/
metrics_config.rs1use 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 #[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 pub fn init(&self) -> anyhow::Result<()> {
27 tracing::info!(address = %self.metrics_exporter_address, "creating metrics exporter");
28
29 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_metrics_exporter(self.metrics_exporter_address);
43
44 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}