use std::sync::Arc;
use degenbot_bot::telemetry as bot_telemetry;
use tracing_subscriber::layer::{Layer as _, SubscriberExt as _};
use tracing_subscriber::EnvFilter;
use crate::progress::{self, Layer as ProgressLayer, Painter};
#[derive(Debug)]
#[must_use = "the boot guard must outlive the command run"]
pub struct TelemetryBoot {
painter: Arc<Painter>,
}
impl Drop for TelemetryBoot {
fn drop(&mut self) {
self.painter.finish();
}
}
pub fn boot() -> Result<TelemetryBoot, String> {
match degenbot_config::BotConfigLoader::new()
.with_standard_file_paths()
.load()
{
Ok(loaded) => {
let _ = degenbot_bot::bot_core::stance::install(Arc::new(loaded.config));
}
Err(error) => return Err(format!("invalid configuration - boot refused: {error}")),
}
let plan = bot_telemetry::resolve_filters(bot_telemetry::CONSOLE_WIRING_DEFAULT_PYTHON);
let painter = Arc::new(Painter::from_draw_target(progress::stderr_opt()));
let console_filter = EnvFilter::new(&plan.console);
let subscriber = tracing_subscriber::registry()
.with(
tracing_subscriber::fmt::layer()
.compact()
.with_writer(std::io::stderr)
.with_filter(console_filter.clone()),
)
.with(ProgressLayer::new(Arc::clone(&painter)).with_filter(console_filter));
let installed = tracing::subscriber::set_global_default(subscriber).is_ok();
degenbot_core::telemetry::warn_retired_env_names();
degenbot_core::telemetry::install_panic_hook();
degenbot_core::worker_census::emit_boot_table();
degenbot_core::op_info!(
domain = pump,
console = %plan.console,
"telemetry boot complete"
);
if !installed {
degenbot_core::op_warn!(
domain = pump,
"global tracing subscriber already installed; console wiring left untouched"
);
}
Ok(TelemetryBoot { painter })
}