From c75cbdea797fb96c1a59c9877bed1a91a81a99ab Mon Sep 17 00:00:00 2001 From: teor Date: Tue, 12 Jan 2021 07:46:56 +1000 Subject: [PATCH] Log configured network in every log message (#1568) * Add the configured network to error reports * Log the configured network at error level * Create the global span immediately after activating tracing And leak the span guard, so the span is always active. * Include panic metadata in the report and URL * Use `Main` and `Test` in the global span `net=Mainnet` is a bit redundant --- zebrad/src/application.rs | 52 ++++++++++++++++++++++++++++++--------- zebrad/src/commands.rs | 3 --- 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/zebrad/src/application.rs b/zebrad/src/application.rs index 60ede1e9c..0fe458dc6 100644 --- a/zebrad/src/application.rs +++ b/zebrad/src/application.rs @@ -151,13 +151,25 @@ impl Application for ZebradApp { color_eyre::config::Theme::new() }; - // This MUST happen after `Terminal::new` to ensure our preferred panic - // handler is the last one installed - let builder = color_eyre::config::HookBuilder::default() + // collect the common metadata for the issue URL and panic report + let network = config.network.network.to_string(); + let panic_metadata = vec![ + ("version", env!("CARGO_PKG_VERSION").to_string()), + ("git commit", Self::git_commit().to_string()), + ("Zcash network", network), + ]; + + let mut builder = color_eyre::config::HookBuilder::default(); + let mut metadata_section = "Metadata:".to_string(); + for (k, v) in panic_metadata { + builder = builder.add_issue_metadata(k, v.clone()); + metadata_section.push_str(&format!("\n{}: {}", k, v)); + } + + builder = builder .theme(theme) + .panic_section(metadata_section) .issue_url(concat!(env!("CARGO_PKG_REPOSITORY"), "/issues/new")) - .add_issue_metadata("version", env!("CARGO_PKG_VERSION")) - .add_issue_metadata("git commit", Self::git_commit()) .issue_filter(|kind| match kind { color_eyre::ErrorKind::NonRecoverable(_) => true, color_eyre::ErrorKind::Recoverable(error) => { @@ -173,6 +185,8 @@ impl Application for ZebradApp { } }); + // This MUST happen after `Terminal::new` to ensure our preferred panic + // handler is the last one installed let (panic_hook, eyre_hook) = builder.into_hooks(); eyre_hook.install().unwrap(); @@ -217,7 +231,7 @@ impl Application for ZebradApp { .map(ZebradCmd::is_server) .unwrap_or(false); - // Launch network endpoints only for long-running commands. + // Ignore the tracing filter for short-lived commands if is_server { // Override the default tracing filter based on the command-line verbosity. let mut tracing_config = cfg_ref.tracing.clone(); @@ -226,9 +240,6 @@ impl Application for ZebradApp { .or_else(|| Some(default_filter.to_owned())); components.push(Box::new(Tracing::new(tracing_config)?)); - components.push(Box::new(TokioComponent::new()?)); - components.push(Box::new(TracingEndpoint::new(cfg_ref)?)); - components.push(Box::new(MetricsEndpoint::new(cfg_ref)?)); } else { // Don't apply the configured filter for short-lived commands. let mut tracing_config = cfg_ref.tracing.clone(); @@ -237,6 +248,25 @@ impl Application for ZebradApp { components.push(Box::new(Tracing::new(tracing_config)?)); } + // Activate the global span, so it's visible when we load the other + // components. Space is at a premium here, so we use an empty message, + // short commit hash, and the unique part of the network name. + let global_span = error_span!( + "", + zebrad = ZebradApp::git_commit(), + net = &self.config.clone().unwrap().network.network.to_string()[..4], + ); + let global_guard = global_span.enter(); + // leak the global span, to make sure it stays active + std::mem::forget(global_guard); + + // Launch network and async endpoints only for long-running commands. + if is_server { + components.push(Box::new(TokioComponent::new()?)); + components.push(Box::new(TracingEndpoint::new(cfg_ref)?)); + components.push(Box::new(MetricsEndpoint::new(cfg_ref)?)); + } + self.state.components.register(components) } @@ -247,10 +277,8 @@ impl Application for ZebradApp { // application configuration is processed self.register_components(command)?; + // Fire callback to signal state in the application lifecycle let config = self.config.take().unwrap(); - - // Fire callback regardless of whether any config was loaded to - // in order to signal state in the application lifecycle self.after_config(config)?; Ok(()) diff --git a/zebrad/src/commands.rs b/zebrad/src/commands.rs index 5968ca56a..0f3fa49df 100644 --- a/zebrad/src/commands.rs +++ b/zebrad/src/commands.rs @@ -7,7 +7,6 @@ mod version; use self::ZebradCmd::*; use self::{generate::GenerateCmd, start::StartCmd, version::VersionCmd}; -use crate::application::ZebradApp; use crate::config::ZebradConfig; use abscissa_core::{ @@ -53,8 +52,6 @@ impl ZebradCmd { impl Runnable for ZebradCmd { fn run(&self) { - let span = error_span!("", zebrad = ZebradApp::git_commit()); - let _guard = span.enter(); match self { Generate(cmd) => cmd.run(), ZebradCmd::Help(cmd) => cmd.run(),