From ee2f555c7b0d1c2801b5e7a929fe4ec42e3e3b85 Mon Sep 17 00:00:00 2001 From: Ammar Arif Date: Tue, 15 Oct 2024 13:54:47 -0400 Subject: [PATCH] refactor(katana): separate metrics address and port into 2 args (#2537) --- bin/katana/src/cli/node.rs | 53 +++++++++++++++++------- crates/katana/node/src/config/metrics.rs | 18 +++++++- crates/katana/node/src/lib.rs | 2 +- 3 files changed, 56 insertions(+), 17 deletions(-) diff --git a/bin/katana/src/cli/node.rs b/bin/katana/src/cli/node.rs index e1e945ece1..dffc8e9c5b 100644 --- a/bin/katana/src/cli/node.rs +++ b/bin/katana/src/cli/node.rs @@ -11,14 +11,13 @@ //! for more info. use std::collections::HashSet; -use std::net::{IpAddr, SocketAddr}; +use std::net::IpAddr; use std::path::PathBuf; use alloy_primitives::U256; use anyhow::{Context, Result}; use clap::{Args, Parser}; use console::Style; -use dojo_utils::parse::parse_socket_address; use katana_core::backend::config::{Environment, StarknetConfig}; use katana_core::constants::{ DEFAULT_ETH_L1_GAS_PRICE, DEFAULT_INVOKE_MAX_STEPS, DEFAULT_SEQUENCER_ADDRESS, @@ -27,7 +26,7 @@ use katana_core::constants::{ use katana_core::service::messaging::MessagingConfig; use katana_node::config::db::DbConfig; use katana_node::config::dev::DevConfig; -use katana_node::config::metrics::MetricsConfig; +use katana_node::config::metrics::{MetricsConfig, DEFAULT_METRICS_ADDR, DEFAULT_METRICS_PORT}; use katana_node::config::rpc::{ ApiKind, RpcConfig, DEFAULT_RPC_ADDR, DEFAULT_RPC_MAX_CONNECTIONS, DEFAULT_RPC_PORT, }; @@ -85,12 +84,6 @@ pub struct NodeArgs { #[arg(help = "Output logs in JSON format.")] pub json_log: bool, - /// Enable Prometheus metrics. - /// - /// The metrics will be served at the given interface and port. - #[arg(long, value_name = "SOCKET", value_parser = parse_socket_address, help_heading = "Metrics")] - pub metrics: Option, - #[arg(long)] #[arg(requires = "rpc_url")] #[arg(value_name = "BLOCK_NUMBER")] @@ -107,20 +100,46 @@ pub struct NodeArgs { pub messaging: Option, #[command(flatten)] - #[command(next_help_heading = "Server options")] + pub metrics: MetricsOptions, + + #[command(flatten)] pub server: ServerOptions, #[command(flatten)] - #[command(next_help_heading = "Starknet options")] pub starknet: StarknetOptions, #[cfg(feature = "slot")] #[command(flatten)] - #[command(next_help_heading = "Slot options")] pub slot: SlotOptions, } #[derive(Debug, Args, Clone)] +#[command(next_help_heading = "Metrics options")] +pub struct MetricsOptions { + /// Whether to enable metrics. + /// + /// For now, metrics will still be collected even if this flag is not set. This only + /// controls whether the metrics server is started or not. + #[arg(long)] + pub metrics: bool, + + /// The metrics will be served at the given address. + #[arg(long = "metrics.addr")] + #[arg(value_name = "ADD")] + #[arg(requires = "metrics")] + #[arg(default_value_t = DEFAULT_METRICS_ADDR)] + pub metrics_addr: IpAddr, + + /// The metrics will be served at the given port. + #[arg(long = "metrics.port")] + #[arg(value_name = "PORT")] + #[arg(requires = "metrics")] + #[arg(default_value_t = DEFAULT_METRICS_PORT)] + pub metrics_port: u16, +} + +#[derive(Debug, Args, Clone)] +#[command(next_help_heading = "Server options")] pub struct ServerOptions { #[arg(short, long)] #[arg(default_value_t = DEFAULT_RPC_PORT)] @@ -144,6 +163,7 @@ pub struct ServerOptions { } #[derive(Debug, Args, Clone)] +#[command(next_help_heading = "Starknet options")] pub struct StarknetOptions { #[arg(long)] #[arg(default_value = "0")] @@ -165,7 +185,6 @@ pub struct StarknetOptions { pub disable_validate: bool, #[command(flatten)] - #[command(next_help_heading = "Environment options")] pub environment: EnvironmentOptions, #[arg(long)] @@ -175,6 +194,7 @@ pub struct StarknetOptions { } #[derive(Debug, Args, Clone)] +#[command(next_help_heading = "Environment options")] pub struct EnvironmentOptions { #[arg(long)] #[arg(help = "The chain ID.")] @@ -209,6 +229,7 @@ pub struct EnvironmentOptions { #[cfg(feature = "slot")] #[derive(Debug, Args, Clone)] +#[command(next_help_heading = "Slot options")] pub struct SlotOptions { #[arg(hide = true)] #[arg(long = "slot.controller")] @@ -361,7 +382,11 @@ impl NodeArgs { } fn metrics_config(&self) -> Option { - self.metrics.map(|addr| MetricsConfig { addr }) + if self.metrics.metrics { + Some(MetricsConfig { addr: self.metrics.metrics_addr, port: self.metrics.metrics_port }) + } else { + None + } } } diff --git a/crates/katana/node/src/config/metrics.rs b/crates/katana/node/src/config/metrics.rs index 40a1b234ad..9830660485 100644 --- a/crates/katana/node/src/config/metrics.rs +++ b/crates/katana/node/src/config/metrics.rs @@ -1,8 +1,22 @@ -use std::net::SocketAddr; +use std::net::{IpAddr, Ipv4Addr, SocketAddr}; + +/// Metrics server default address. +pub const DEFAULT_METRICS_ADDR: IpAddr = IpAddr::V4(Ipv4Addr::LOCALHOST); +/// Metrics server default port. +pub const DEFAULT_METRICS_PORT: u16 = 9100; /// Node metrics configurations. #[derive(Debug, Clone)] pub struct MetricsConfig { /// The address to bind the metrics server to. - pub addr: SocketAddr, + pub addr: IpAddr, + /// The port to bind the metrics server to. + pub port: u16, +} + +impl MetricsConfig { + /// Returns the [`SocketAddr`] for the metrics server. + pub fn socket_addr(&self) -> SocketAddr { + SocketAddr::new(self.addr, self.port) + } } diff --git a/crates/katana/node/src/lib.rs b/crates/katana/node/src/lib.rs index e3e8765c7b..f089285d41 100644 --- a/crates/katana/node/src/lib.rs +++ b/crates/katana/node/src/lib.rs @@ -104,7 +104,7 @@ impl Node { /// This method will start all the node process, running them until the node is stopped. pub async fn launch(self) -> Result { if let Some(ref cfg) = self.metrics_config { - let addr = cfg.addr; + let addr = cfg.socket_addr(); let mut reports = Vec::new(); if let Some(ref db) = self.db {