From 70eb076ab20dea6625177e2131038533c6d17223 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Wed, 11 Jan 2023 09:39:39 +0300 Subject: [PATCH] Expose relay version metric (#1750) * expose relay version metric * spelling * and clippy * clippy * typo * use version directly and determine git commit * typos and leftovers --- bridges/relays/bin-substrate/Cargo.toml | 1 + bridges/relays/bin-substrate/src/cli/mod.rs | 30 ++++++++++---- .../bin-substrate/src/cli/relay_headers.rs | 3 +- .../src/cli/relay_headers_and_messages/mod.rs | 2 +- .../bin-substrate/src/cli/relay_messages.rs | 2 +- .../bin-substrate/src/cli/relay_parachains.rs | 3 +- bridges/relays/utils/src/metrics.rs | 39 ++++++++++++++++--- 7 files changed, 62 insertions(+), 18 deletions(-) diff --git a/bridges/relays/bin-substrate/Cargo.toml b/bridges/relays/bin-substrate/Cargo.toml index 0ab3bd5634..a22bf12632 100644 --- a/bridges/relays/bin-substrate/Cargo.toml +++ b/bridges/relays/bin-substrate/Cargo.toml @@ -15,6 +15,7 @@ hex = "0.4" log = "0.4.17" num-format = "0.4" num-traits = "0.2" +rbtag = "0.3" structopt = "0.3" signal-hook = "0.3.14" signal-hook-async-std = "0.2.2" diff --git a/bridges/relays/bin-substrate/src/cli/mod.rs b/bridges/relays/bin-substrate/src/cli/mod.rs index e049a050c4..9081a397b6 100644 --- a/bridges/relays/bin-substrate/src/cli/mod.rs +++ b/bridges/relays/bin-substrate/src/cli/mod.rs @@ -21,6 +21,7 @@ use std::convert::TryInto; use async_std::prelude::*; use codec::{Decode, Encode}; use futures::{select, FutureExt}; +use rbtag::BuildInfo; use signal_hook::consts::*; use signal_hook_async_std::Signals; use structopt::{clap::arg_enum, StructOpt}; @@ -254,17 +255,30 @@ pub struct PrometheusParams { pub prometheus_port: u16, } -impl From for relay_utils::metrics::MetricsParams { - fn from(cli_params: PrometheusParams) -> relay_utils::metrics::MetricsParams { - if !cli_params.no_prometheus { +/// Struct to get git commit info and build time. +#[derive(BuildInfo)] +struct SubstrateRelayBuildInfo; + +impl PrometheusParams { + /// Tries to convert CLI metrics params into metrics params, used by the relay. + pub fn into_metrics_params(self) -> anyhow::Result { + let metrics_address = if !self.no_prometheus { Some(relay_utils::metrics::MetricsAddress { - host: cli_params.prometheus_host, - port: cli_params.prometheus_port, + host: self.prometheus_host, + port: self.prometheus_port, }) - .into() } else { - None.into() - } + None + }; + + let relay_version = option_env!("CARGO_PKG_VERSION").unwrap_or("unknown"); + let relay_commit = SubstrateRelayBuildInfo.get_build_commit(); + relay_utils::metrics::MetricsParams::new( + metrics_address, + relay_version.into(), + relay_commit.into(), + ) + .map_err(|e| anyhow::format_err!("{:?}", e)) } } diff --git a/bridges/relays/bin-substrate/src/cli/relay_headers.rs b/bridges/relays/bin-substrate/src/cli/relay_headers.rs index 37b805d720..239ab8d62f 100644 --- a/bridges/relays/bin-substrate/src/cli/relay_headers.rs +++ b/bridges/relays/bin-substrate/src/cli/relay_headers.rs @@ -77,7 +77,8 @@ where let target_transactions_mortality = data.target_sign.target_transactions_mortality; let target_sign = data.target_sign.to_keypair::()?; - let metrics_params: relay_utils::metrics::MetricsParams = data.prometheus_params.into(); + let metrics_params: relay_utils::metrics::MetricsParams = + data.prometheus_params.into_metrics_params()?; GlobalMetrics::new()?.register_and_spawn(&metrics_params.registry)?; let target_transactions_params = substrate_relay_helper::TransactionParams { diff --git a/bridges/relays/bin-substrate/src/cli/relay_headers_and_messages/mod.rs b/bridges/relays/bin-substrate/src/cli/relay_headers_and_messages/mod.rs index fd8a032066..ea6d6ad9f5 100644 --- a/bridges/relays/bin-substrate/src/cli/relay_headers_and_messages/mod.rs +++ b/bridges/relays/bin-substrate/src/cli/relay_headers_and_messages/mod.rs @@ -110,7 +110,7 @@ impl, ) -> anyhow::Result { // Create metrics registry. - let metrics_params = shared.prometheus_params.clone().into(); + let metrics_params = shared.prometheus_params.clone().into_metrics_params()?; let metrics_params = relay_utils::relay_metrics(metrics_params).into_params(); Ok(Self { shared, left, right, metrics_params }) diff --git a/bridges/relays/bin-substrate/src/cli/relay_messages.rs b/bridges/relays/bin-substrate/src/cli/relay_messages.rs index 6af042670e..e0250ef1e4 100644 --- a/bridges/relays/bin-substrate/src/cli/relay_messages.rs +++ b/bridges/relays/bin-substrate/src/cli/relay_messages.rs @@ -83,7 +83,7 @@ where source_to_target_headers_relay: None, target_to_source_headers_relay: None, lane_id: data.lane.into(), - metrics_params: data.prometheus_params.into(), + metrics_params: data.prometheus_params.into_metrics_params()?, }) .await .map_err(|e| anyhow::format_err!("{}", e)) diff --git a/bridges/relays/bin-substrate/src/cli/relay_parachains.rs b/bridges/relays/bin-substrate/src/cli/relay_parachains.rs index 1a0bba3fd1..1234b3a330 100644 --- a/bridges/relays/bin-substrate/src/cli/relay_parachains.rs +++ b/bridges/relays/bin-substrate/src/cli/relay_parachains.rs @@ -98,7 +98,8 @@ where target_transaction_params, ); - let metrics_params: relay_utils::metrics::MetricsParams = data.prometheus_params.into(); + let metrics_params: relay_utils::metrics::MetricsParams = + data.prometheus_params.into_metrics_params()?; GlobalMetrics::new()?.register_and_spawn(&metrics_params.registry)?; parachains_relay::parachains_loop::run( diff --git a/bridges/relays/utils/src/metrics.rs b/bridges/relays/utils/src/metrics.rs index fa7a79a71c..2e6c8236da 100644 --- a/bridges/relays/utils/src/metrics.rs +++ b/bridges/relays/utils/src/metrics.rs @@ -99,6 +99,39 @@ impl Default for MetricsAddress { } impl MetricsParams { + /// Creates metrics params from metrics address. + pub fn new( + address: Option, + relay_version: String, + relay_commit: String, + ) -> Result { + const BUILD_INFO_METRIC: &str = "substrate_relay_build_info"; + + let registry = Registry::new(); + register( + Gauge::::with_opts( + Opts::new( + BUILD_INFO_METRIC, + "A metric with a constant '1' value labeled by version", + ) + .const_label("version", &relay_version) + .const_label("commit", &relay_commit), + )?, + ®istry, + )? + .set(1); + + log::info!( + target: "bridge", + "Exposed {} metric: version={} commit={}", + BUILD_INFO_METRIC, + relay_version, + relay_commit, + ); + + Ok(MetricsParams { address, registry }) + } + /// Creates metrics params so that metrics are not exposed. pub fn disabled() -> Self { MetricsParams { address: None, registry: Registry::new() } @@ -112,12 +145,6 @@ impl MetricsParams { } } -impl From> for MetricsParams { - fn from(address: Option) -> Self { - MetricsParams { address, registry: Registry::new() } - } -} - /// Returns metric name optionally prefixed with given prefix. pub fn metric_name(prefix: Option<&str>, name: &str) -> String { if let Some(prefix) = prefix {