use crate::{TelemetryConfig, TelemetryError};
use cadence::{BufferedUdpMetricSink, QueuingMetricSink, StatsdClient, UdpMetricSink};
use std::net::UdpSocket;
pub fn init_metrics(config: &TelemetryConfig) -> Result<(), TelemetryError> {
let tags_info = if config.global_tags.is_empty() {
String::new()
} else {
format!(
" with global tags: [{}]",
config
.global_tags
.iter()
.map(|(k, v)| format!("{}:{}", k, v))
.collect::<Vec<_>>()
.join(", ")
)
};
let mode = if config.sync_metrics { "sync" } else { "async" };
eprintln!(
"📊 Initializing metrics ({}): {}:{} prefix '{}'{}",
mode, config.statsd_host, config.statsd_port, config.metrics_prefix, tags_info
);
if config.sync_metrics {
let socket = UdpSocket::bind("0.0.0.0:0").map_err(TelemetryError::SocketBind)?;
let sink = UdpMetricSink::from((&config.statsd_host[..], config.statsd_port), socket)
.map_err(TelemetryError::SinkCreation)?;
let mut builder = StatsdClient::builder(&config.metrics_prefix, sink);
for (key, value) in &config.global_tags {
builder = builder.with_tag(key, value);
}
cadence_macros::set_global_default(builder.build());
} else {
let socket = UdpSocket::bind("0.0.0.0:0").map_err(TelemetryError::SocketBind)?;
let buffered =
BufferedUdpMetricSink::from((&config.statsd_host[..], config.statsd_port), socket)
.map_err(TelemetryError::SinkCreation)?;
let queued = QueuingMetricSink::from(buffered);
let mut builder = StatsdClient::builder(&config.metrics_prefix, queued);
for (key, value) in &config.global_tags {
builder = builder.with_tag(key, value);
}
cadence_macros::set_global_default(builder.build());
}
eprintln!("✅ Metrics initialized");
Ok(())
}