diff --git a/quickwit/quickwit-cli/src/cli.rs b/quickwit/quickwit-cli/src/cli.rs index 91bb338ae89..ddf80f58439 100644 --- a/quickwit/quickwit-cli/src/cli.rs +++ b/quickwit/quickwit-cli/src/cli.rs @@ -14,6 +14,7 @@ use anyhow::{Context, bail}; use clap::{Arg, ArgAction, ArgMatches, Command, arg}; +use quickwit_common::uri::Uri; use quickwit_serve::EnvFilterReloadFn; use tracing::Level; @@ -95,4 +96,14 @@ impl CliCommand { CliCommand::Tool(subcommand) => subcommand.execute().await, } } + + pub fn config_uri(&self) -> Option<&Uri> { + match self { + CliCommand::Run(run) => Some(&run.config_uri), + CliCommand::Index(_) => None, + CliCommand::Source(_) => None, + CliCommand::Split(_) => None, + CliCommand::Tool(tools) => tools.config_uri(), + } + } } diff --git a/quickwit/quickwit-cli/src/lib.rs b/quickwit/quickwit-cli/src/lib.rs index 5a591ac76e3..854cea56ad8 100644 --- a/quickwit/quickwit-cli/src/lib.rs +++ b/quickwit/quickwit-cli/src/lib.rs @@ -221,7 +221,7 @@ pub fn start_actor_runtimes( } /// Loads a node config located at `config_uri` with the default storage configuration. -async fn load_node_config(config_uri: &Uri) -> anyhow::Result { +pub async fn load_node_config(config_uri: &Uri) -> anyhow::Result { let config_content = load_file(&StorageResolver::unconfigured(), config_uri) .await .context("failed to load node config")?; diff --git a/quickwit/quickwit-cli/src/logger.rs b/quickwit/quickwit-cli/src/logger.rs index 1ffd31cdad6..f8fb3083d1a 100644 --- a/quickwit/quickwit-cli/src/logger.rs +++ b/quickwit/quickwit-cli/src/logger.rs @@ -56,6 +56,7 @@ pub fn setup_logging_and_tracing( level: Level, ansi_colors: bool, build_info: &BuildInfo, + node_name: String, ) -> anyhow::Result { #[cfg(feature = "tokio-console")] { @@ -112,6 +113,7 @@ pub fn setup_logging_and_tracing( .with_resource(Resource::new([ KeyValue::new("service.name", "quickwit"), KeyValue::new("service.version", build_info.version.clone()), + KeyValue::new("service.node", node_name), ])) .build(); let tracer = provider.tracer("quickwit"); diff --git a/quickwit/quickwit-cli/src/main.rs b/quickwit/quickwit-cli/src/main.rs index 01b37a34266..b1129614962 100644 --- a/quickwit/quickwit-cli/src/main.rs +++ b/quickwit/quickwit-cli/src/main.rs @@ -19,12 +19,12 @@ use std::collections::BTreeMap; use anyhow::Context; use colored::Colorize; use opentelemetry::global; -use quickwit_cli::busy_detector; use quickwit_cli::checklist::RED_COLOR; use quickwit_cli::cli::{CliCommand, build_cli}; #[cfg(feature = "jemalloc")] use quickwit_cli::jemalloc::start_jemalloc_metrics_loop; use quickwit_cli::logger::setup_logging_and_tracing; +use quickwit_cli::{busy_detector, load_node_config}; use quickwit_common::runtimes::scrape_tokio_runtime_metrics; use quickwit_serve::BuildInfo; use tracing::error; @@ -101,8 +101,28 @@ async fn main_impl() -> anyhow::Result<()> { start_jemalloc_metrics_loop(); let build_info = BuildInfo::get(); - let env_filter_reload_fn = - setup_logging_and_tracing(command.default_log_level(), ansi_colors, build_info)?; + + // we need this value very early to use it in otel, but this is so early we haven't setup + // logging yet. What we do is read the config, and if it fails, provide a default value. + // Except for race conditions, an error will get logged the 2nd time the config is read, + // inside the command. In case of race condition, we just don't know the node id for tracing + // purpose + let node_id = { + async || { + let config_uri = command.config_uri()?; + let config = load_node_config(config_uri).await.ok()?; + Some(config.node_id.take()) + } + }() + .await + .unwrap_or_else(|| "unknown".to_string()); + + let env_filter_reload_fn = setup_logging_and_tracing( + command.default_log_level(), + ansi_colors, + build_info, + node_id, + )?; let return_code: i32 = if let Err(command_error) = command.execute(env_filter_reload_fn).await { error!(error=%command_error, "command failed"); diff --git a/quickwit/quickwit-cli/src/tool.rs b/quickwit/quickwit-cli/src/tool.rs index da5521c0e8c..4bb04fdfda1 100644 --- a/quickwit/quickwit-cli/src/tool.rs +++ b/quickwit/quickwit-cli/src/tool.rs @@ -394,6 +394,16 @@ impl ToolCliCommand { Self::ExtractSplit(args) => extract_split_cli(args).await, } } + + pub fn config_uri(&self) -> Option<&Uri> { + match self { + Self::GarbageCollect(args) => Some(&args.config_uri), + Self::LocalIngest(args) => Some(&args.config_uri), + Self::LocalSearch(args) => Some(&args.config_uri), + Self::Merge(args) => Some(&args.config_uri), + Self::ExtractSplit(args) => Some(&args.config_uri), + } + } } pub async fn local_ingest_docs_cli(args: LocalIngestDocsArgs) -> anyhow::Result<()> {