From d635d93ace4b1375c7dfeb194b5ee8e4651c810c Mon Sep 17 00:00:00 2001 From: Asmir Avdicevic Date: Wed, 22 May 2024 22:52:46 +0200 Subject: [PATCH] feat(cli): add metrics server to iroh doctor (#2292) ## Description Folks try to look at metrics while doctor alone is running (note this clashes by default with the iroh node if both are running locally on port :9090). Also kind of inconvenient given if you want to look at a running iroh node when doctor is running. Suggestions welcome, maybe default off metrics on `doctor`? Also most metrics are not really used in the `doctor` path, but we can fix that as we figure out what's cool to measure. ## Breaking Changes ## Notes & open questions ## Change checklist - [x] Self-review. - [ ] Documentation updates if relevant. - [ ] Tests if relevant. - [ ] All breaking changes documented. --- iroh-cli/src/commands.rs | 10 ++++++++-- iroh-cli/src/commands/doctor.rs | 7 ++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/iroh-cli/src/commands.rs b/iroh-cli/src/commands.rs index 9fd279be12..2e53bd3e0e 100644 --- a/iroh-cli/src/commands.rs +++ b/iroh-cli/src/commands.rs @@ -37,7 +37,7 @@ pub(crate) struct Cli { #[clap(long, global = true)] start: bool, - /// Port to serve metrics on. -1 to disable. + /// Port to serve metrics on. Disabled by default. #[clap(long)] pub(crate) metrics_port: Option, } @@ -184,7 +184,13 @@ impl Cli { .await } Commands::Doctor { command } => { - let config = NodeConfig::load(self.config.as_deref()).await?; + let mut config = NodeConfig::load(self.config.as_deref()).await?; + if let Some(metrics_port) = self.metrics_port { + config.metrics_addr = match metrics_port { + MetricsPort::Disabled => None, + MetricsPort::Port(port) => Some(([127, 0, 0, 1], port).into()), + }; + } self::doctor::run(command, &config).await } } diff --git a/iroh-cli/src/commands/doctor.rs b/iroh-cli/src/commands/doctor.rs index 01445e2d33..156bb4dd9d 100644 --- a/iroh-cli/src/commands/doctor.rs +++ b/iroh-cli/src/commands/doctor.rs @@ -1068,7 +1068,8 @@ fn inspect_ticket(ticket: &str, zbase32: bool) -> anyhow::Result<()> { pub async fn run(command: Commands, config: &NodeConfig) -> anyhow::Result<()> { let data_dir = iroh_data_root()?; let _guard = crate::logging::init_terminal_and_file_logging(&config.file_logs, &data_dir)?; - match command { + let metrics_fut = super::start::start_metrics_server(config.metrics_addr); + let cmd_res = match command { Commands::Report { stun_host, stun_port, @@ -1200,7 +1201,11 @@ pub async fn run(command: Commands, config: &NodeConfig) -> anyhow::Result<()> { Ok(()) } + }; + if let Some(metrics_fut) = metrics_fut { + metrics_fut.abort(); } + cmd_res } async fn run_plotter(