use std::{collections::HashMap, net::SocketAddr};
use serde::{Deserialize, Serialize};
use tari_common::{SubConfigPath, configuration::bootstrap::ApplicationType};
use tari_comms::NodeIdentity;
use tari_metrics::{Registry, server::MetricsServerBuilder};
use tari_shutdown::ShutdownSignal;
use tokio::task;
pub fn install(
application: ApplicationType,
identity: &NodeIdentity,
config: &MetricsConfig,
shutdown: ShutdownSignal,
) {
let metrics_registry = create_metrics_registry(application, identity);
tari_metrics::set_default_registry(metrics_registry);
let mut metrics = MetricsServerBuilder::new();
if let Some(addr) = config.server_bind_address.as_ref() {
metrics = metrics.with_scrape_server(addr);
}
if let Some(endpoint) = config.push_endpoint.as_ref() {
metrics = metrics.with_push_gateway(endpoint);
}
task::spawn(metrics.start(shutdown));
}
fn create_metrics_registry(application: ApplicationType, identity: &NodeIdentity) -> Registry {
let mut labels = HashMap::with_capacity(4);
labels.insert("app".to_string(), application.as_config_str().to_string());
labels.insert("node_role".to_string(), identity.features().as_role_str().to_string());
labels.insert("node_id".to_string(), identity.node_id().to_string());
labels.insert("node_public_key".to_string(), identity.public_key().to_string());
Registry::new_custom(Some("tari".to_string()), Some(labels)).unwrap()
}
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct MetricsConfig {
override_from: Option<String>,
pub server_bind_address: Option<SocketAddr>,
pub push_endpoint: Option<String>,
}
impl SubConfigPath for MetricsConfig {
fn main_key_prefix() -> &'static str {
"metrics"
}
}