diff --git a/.env.example b/.env.example index d6acc3c..9f9c6c5 100644 --- a/.env.example +++ b/.env.example @@ -2,6 +2,11 @@ # default value = 9100 PROMETHEUS_EXPORTER_PORT = 9100 + +# prefix for metric naming +# default value = "zvks" +PROMETHEUS_EXPORTER_PREFIX = "zvks" + # setting up max level of logging # default - INFO # values : WARN, ERROR, INFO, DEBUG, TRACE diff --git a/src/endpoints.rs b/src/endpoints.rs index eb45056..b62d7c7 100644 --- a/src/endpoints.rs +++ b/src/endpoints.rs @@ -101,24 +101,6 @@ pub async fn update_metrics( &i.desc.clone().unwrap_or_else(|| std::borrow::Cow::Borrowed(&i.id)) ); metrics.push(gauge); - // if let Some(gauge) = gauge { - // match state.registry.lock() { - // Err(er) => { - // error!("Cannot lock Metric Registry due to {} ", er) - // }, - // Ok(registry) => { - // // todo: error handler - // if let Err(er) = update_or_insert_metric( - // gauge, - // registry, - // &metric_name - // ) { - // error!("Update or insert metric crushed: {}", er); - // return (http::StatusCode::INTERNAL_SERVER_ERROR, er.to_string()) - // } - // }, - // } - // } }, MetricsValueType::ArrayOfStrings => { trace!("processing an array of strings"); diff --git a/src/main.rs b/src/main.rs index 8a237c5..f560d90 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,7 +11,7 @@ use axum::{ routing::{get, post}, Router}; use prometheus::Registry; -use std::{str::FromStr, sync::{Arc, Mutex}}; +use std::{collections::HashMap, str::FromStr, sync::{Arc, Mutex}}; use endpoints::*; use tokio::net::TcpListener; use tracing::info; @@ -43,8 +43,12 @@ async fn main() -> anyhow::Result<()> { .init(); info!("Logger was created and configurated, dotenv vars were loaded (if exist)"); + + let prefix = std::env::var("PROMETHEUS_EXPORTER_PREFIX") + .unwrap_or_else(|_| "zvks".to_owned()); + info!("Initializing local Prometehus metrics registry ..."); - let registry = Registry::new(); + let registry = Registry::new_custom(Some(prefix), None)?; info!("Initializing shared state for Prometheus Exporter web-server ..."); let state = Arc::new(AppState { diff --git a/src/metrics.rs b/src/metrics.rs index 40e0a10..e17c115 100644 --- a/src/metrics.rs +++ b/src/metrics.rs @@ -50,19 +50,19 @@ impl MetricsProcesser { if let Some(status) = metric.status { if let Some(device) = metric.device { if let Some(source_id) = &metric.source_id { - let vec = GaugeVec::new(opts!(metric_name, metric_desc), &["status", "device", "source_id"]).unwrap(); + let vec = GaugeVec::new(opts!(metric.name.clone(), metric_desc), &["status", "device", "source_id"]).unwrap(); vec.with_label_values(&[&status.to_string(), &device.to_string(), &source_id.to_string()]).set(metric.value.as_f64().unwrap_or_else(|| 0.0)); debug!("processed metric: {:?}", &vec); return Some(Box::new(vec)); } else { - let vec = GaugeVec::new(opts!(metric_name, metric_desc), &["status", "device"]).unwrap(); + let vec = GaugeVec::new(opts!(metric.name.clone(), metric_desc), &["status", "device"]).unwrap(); vec.with_label_values(&[&status.to_string(), &device.to_string()]).set(metric.value.as_f64().unwrap_or_else(|| 0.0)); debug!("processed metric: {:?}", &vec); return Some(Box::new(vec)); } } else { - let vec = GaugeVec::new(opts!(metric_name, metric_desc), &["status"]).unwrap(); + let vec = GaugeVec::new(opts!(metric.name.clone(), metric_desc), &["status"]).unwrap(); vec.with_label_values(&[&status.to_string()]).set(metric.value.as_f64().unwrap_or_else(|| 0.0)); debug!("processed metric: {:?}", &vec); return Some(Box::new(vec)); @@ -70,7 +70,7 @@ impl MetricsProcesser { } let gauge = Gauge::new( - metric_name, + metric.name.clone(), metric_desc ); diff --git a/src/structs.rs b/src/structs.rs index 86b60e9..150ef13 100644 --- a/src/structs.rs +++ b/src/structs.rs @@ -11,6 +11,7 @@ pub mod v3 { #[derive(Serialize, Deserialize, Debug, Clone)] pub struct MetricOutput<'a> { pub id : String, + pub name : String, #[serde(rename = "type")] json_type : String, addr : String,