metrics: allow customizing address in full; add tests

This commit is contained in:
raf 2025-05-01 20:42:48 +03:00
commit 2da4d6d203
Signed by: NotAShelf
GPG key ID: 29D95B64378DB4BF
3 changed files with 103 additions and 18 deletions

View file

@ -43,10 +43,10 @@ struct Args {
#[clap(
long,
default_value = "9100",
help = "Port to expose Prometheus metrics and status endpoint"
default_value = "0.0.0.0:9100",
help = "Address and port to expose Prometheus metrics and status endpoint (format: ip:port)"
)]
metrics_port: u16,
metrics_addr: String,
#[clap(long, help = "Disable Prometheus metrics server completely")]
disable_metrics: bool,
@ -110,7 +110,7 @@ struct Args {
#[derive(Clone, Debug, Deserialize, Serialize)]
struct Config {
listen_addr: String,
metrics_port: u16,
metrics_addr: String,
disable_metrics: bool,
backend_addr: String,
min_delay: u64,
@ -130,7 +130,7 @@ impl Default for Config {
fn default() -> Self {
Self {
listen_addr: "0.0.0.0:8888".to_string(),
metrics_port: 9100,
metrics_addr: "0.0.0.0:9100".to_string(),
disable_metrics: false,
backend_addr: "127.0.0.1:80".to_string(),
min_delay: 1000,
@ -216,7 +216,7 @@ impl Config {
Self {
listen_addr: args.listen_addr.clone(),
metrics_port: args.metrics_port,
metrics_addr: args.metrics_addr.clone(),
disable_metrics: args.disable_metrics,
backend_addr: args.backend_addr.clone(),
min_delay: args.min_delay,
@ -1192,8 +1192,7 @@ async fn main() -> std::io::Result<()> {
log::info!("Metrics server disabled via configuration");
None
} else {
let metrics_addr = format!("0.0.0.0:{}", metrics_config.metrics_port);
log::info!("Starting metrics server on {metrics_addr}");
log::info!("Starting metrics server on {}", metrics_config.metrics_addr);
let server = HttpServer::new(move || {
App::new()
@ -1204,12 +1203,16 @@ async fn main() -> std::io::Result<()> {
HttpResponse::Ok().body("Botpot Server is running. Visit /metrics for metrics or /status for status.")
}))
})
.bind(&metrics_addr);
.bind(&metrics_config.metrics_addr);
match server {
Ok(server) => Some(server.run()),
Err(e) => {
log::error!("Failed to bind metrics server to {metrics_addr}: {e}");
log::error!(
"Failed to bind metrics server to {}: {}",
metrics_config.metrics_addr,
e
);
None
}
}
@ -1265,7 +1268,7 @@ mod tests {
fn test_config_from_args() {
let args = Args {
listen_addr: "127.0.0.1:8080".to_string(),
metrics_port: 9000,
metrics_addr: "127.0.0.1:9000".to_string(),
disable_metrics: true,
backend_addr: "127.0.0.1:8081".to_string(),
min_delay: 500,
@ -1279,7 +1282,7 @@ mod tests {
let config = Config::from_args(&args);
assert_eq!(config.listen_addr, "127.0.0.1:8080");
assert_eq!(config.metrics_port, 9000);
assert_eq!(config.metrics_addr, "127.0.0.1:9000");
assert!(config.disable_metrics);
assert_eq!(config.backend_addr, "127.0.0.1:8081");
assert_eq!(config.min_delay, 500);