From b74dd74fe6871eef698d27598e91bc70f93c1106 Mon Sep 17 00:00:00 2001 From: Brad Heller Date: Wed, 11 Jun 2025 12:28:24 +0300 Subject: [PATCH 1/2] chore: Rearrange the telemetry package and ignore some logging --- crates/tower-telemetry/src/lib.rs | 80 ++----------------- crates/tower-telemetry/src/logging.rs | 106 +++++++++++++++++++++++++- 2 files changed, 112 insertions(+), 74 deletions(-) diff --git a/crates/tower-telemetry/src/lib.rs b/crates/tower-telemetry/src/lib.rs index 7c42d40a..733049c2 100644 --- a/crates/tower-telemetry/src/lib.rs +++ b/crates/tower-telemetry/src/lib.rs @@ -1,79 +1,13 @@ pub mod logging; pub mod context; -pub use context::Context; - /// reexport tracing to make sure that it gets included everywhere. pub use tracing; -use tracing_subscriber::prelude::*; -use tracing_subscriber::{registry::Registry, layer::Layer, fmt, EnvFilter}; - -/// LogLevel describes the various log levels that can be used in the application. -pub enum LogLevel { - Debug, - Info, - Warn, - Error, -} - -impl AsRef for LogLevel { - fn as_ref(&self) -> &str { - match self { - LogLevel::Debug => "debug", - LogLevel::Info => "info", - LogLevel::Warn => "warn", - LogLevel::Error => "error", - } - } -} - -pub enum LogDestination { - Stdout, - File(String), -} -pub enum LogFormat { - Plain, - Json, -} - -type BoxedFmtLayer = Box + Send + Sync>; - -fn create_fmt_layer(format: LogFormat, destination: LogDestination) -> BoxedFmtLayer { - match destination { - LogDestination::Stdout => { - match format { - LogFormat::Plain => Box::new(fmt::layer().event_format(fmt::format().pretty())), - LogFormat::Json => Box::new(fmt::layer().event_format(fmt::format().json())), - } - } - LogDestination::File(path) => { - let file_appender = tracing_appender::rolling::daily(".", path); - match format { - LogFormat::Plain => { - Box::new( - fmt::layer() - .event_format(fmt::format().pretty()) - .with_writer(file_appender) - ) - } - LogFormat::Json => { - Box::new( - fmt::layer() - .event_format(fmt::format().json()) - .with_writer(file_appender) - ) - } - } - } - } -} - -pub fn enable_logging(level: LogLevel, format: LogFormat, destination: LogDestination) { - let fmt_layer = create_fmt_layer(format, destination); - let filter = EnvFilter::new(level); - let subscriber = tracing_subscriber::registry().with(fmt_layer).with(filter); - - tracing::subscriber::set_global_default(subscriber) - .expect("Failed to set global default subscriber"); -} +pub use context::Context; +pub use logging::{ + LogFormat, + LogDestination, + LogLevel, + enable_logging +}; diff --git a/crates/tower-telemetry/src/logging.rs b/crates/tower-telemetry/src/logging.rs index b8ebc8cf..60e0e104 100644 --- a/crates/tower-telemetry/src/logging.rs +++ b/crates/tower-telemetry/src/logging.rs @@ -1,9 +1,17 @@ +use tracing_subscriber::prelude::*; +use tracing_subscriber::{ + registry::Registry, + layer::Layer, + filter::EnvFilter, + fmt, +}; + #[macro_export] macro_rules! event_with_level { // With context ($level:expr, ctx: $ctx:expr, $fmt:expr, $($arg:tt)+) => { if let Some(runid) = &$ctx.runid { - $crate::tracing::event!($level, runid = %runid, "{}", format!($fmt, $($arg)+)) + $crate::tracing::event!($level, "tower.runid" = %runid, "{}", format!($fmt, $($arg)+)) } else { $crate::tracing::event!($level, "{}", format!($fmt, $($arg)+)) } @@ -15,6 +23,29 @@ macro_rules! event_with_level { }; } +#[macro_export] +macro_rules! trace { + // With context, format string and arguments + (ctx: $ctx:expr, $fmt:expr, $($arg:tt)+) => { + $crate::event_with_level!($crate::tracing::Level::TRACE, ctx: $ctx, $fmt, $($arg)+) + }; + + // With context, just message + (ctx: $ctx:expr, $msg:expr) => { + $crate::event_with_level!($crate::tracing::Level::TRACE, ctx: $ctx, "{}", $msg) + }; + + // Without context, format string and arguments + ($fmt:expr, $($arg:tt)*) => { + $crate::event_with_level!($crate::tracing::Level::TRACE, $fmt, $($arg)*) + }; + + // Without context, just message + ($msg:expr) => { + $crate::event_with_level!($crate::tracing::Level::TRACE, "{}", $msg) + }; +} + #[macro_export] macro_rules! debug { // With context, format string and arguments @@ -107,4 +138,77 @@ macro_rules! error { }; } +/// LogLevel describes the various log levels that can be used in the application. +pub enum LogLevel { + Debug, + Info, + Warn, + Error, +} + +impl AsRef for LogLevel { + fn as_ref(&self) -> &str { + match self { + LogLevel::Debug => "debug", + LogLevel::Info => "info", + LogLevel::Warn => "warn", + LogLevel::Error => "error", + } + } +} + +pub enum LogDestination { + Stdout, + File(String), +} + +pub enum LogFormat { + Plain, + Json, +} +type BoxedFmtLayer = Box + Send + Sync>; + +fn create_fmt_layer(format: LogFormat, destination: LogDestination) -> BoxedFmtLayer { + match destination { + LogDestination::Stdout => { + match format { + LogFormat::Plain => Box::new(fmt::layer().event_format(fmt::format().pretty())), + LogFormat::Json => Box::new(fmt::layer().event_format(fmt::format().json())), + } + } + LogDestination::File(path) => { + let file_appender = tracing_appender::rolling::daily(".", path); + match format { + LogFormat::Plain => { + Box::new( + fmt::layer() + .event_format(fmt::format().pretty()) + .with_writer(file_appender) + ) + } + LogFormat::Json => { + Box::new( + fmt::layer() + .event_format(fmt::format().json()) + .with_writer(file_appender) + ) + } + } + } + } +} + +pub fn enable_logging(level: LogLevel, format: LogFormat, destination: LogDestination) { + let filter = EnvFilter::new(level) + .add_directive("h2=off".parse().unwrap()) + .add_directive("tower::buffer=off".parse().unwrap()) + .add_directive("hyper_util=off".parse().unwrap()); + + let subscriber = tracing_subscriber::registry() + .with(create_fmt_layer(format, destination)) + .with(filter); + + tracing::subscriber::set_global_default(subscriber) + .expect("Failed to set global default subscriber"); +} From ba9ab2cd1accdb70c765171f8cef569ee589a48e Mon Sep 17 00:00:00 2001 From: Brad Heller Date: Wed, 11 Jun 2025 12:30:10 +0300 Subject: [PATCH 2/2] chore: Bump version to v0.3.18 --- Cargo.lock | 20 ++++++++++---------- Cargo.toml | 3 ++- pyproject.toml | 3 ++- uv.lock | 2 +- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c1148b3d..a8f7b6f8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -371,7 +371,7 @@ dependencies = [ [[package]] name = "config" -version = "0.3.17" +version = "0.3.18" dependencies = [ "chrono", "clap", @@ -468,7 +468,7 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crypto" -version = "0.3.17" +version = "0.3.18" dependencies = [ "aes-gcm", "base64", @@ -2567,7 +2567,7 @@ dependencies = [ [[package]] name = "testutils" -version = "0.3.17" +version = "0.3.18" dependencies = [ "pem", "rsa", @@ -2779,7 +2779,7 @@ dependencies = [ [[package]] name = "tower" -version = "0.3.17" +version = "0.3.18" dependencies = [ "tokio", "tower-api", @@ -2803,7 +2803,7 @@ dependencies = [ [[package]] name = "tower-api" -version = "0.3.17" +version = "0.3.18" dependencies = [ "reqwest", "serde", @@ -2815,7 +2815,7 @@ dependencies = [ [[package]] name = "tower-cmd" -version = "0.3.17" +version = "0.3.18" dependencies = [ "anyhow", "bytes", @@ -2854,7 +2854,7 @@ checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] name = "tower-package" -version = "0.3.17" +version = "0.3.18" dependencies = [ "async-compression", "config", @@ -2872,7 +2872,7 @@ dependencies = [ [[package]] name = "tower-runtime" -version = "0.3.17" +version = "0.3.18" dependencies = [ "chrono", "snafu", @@ -2889,7 +2889,7 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tower-telemetry" -version = "0.3.17" +version = "0.3.18" dependencies = [ "tracing", "tracing-appender", @@ -2898,7 +2898,7 @@ dependencies = [ [[package]] name = "tower-version" -version = "0.3.17" +version = "0.3.18" dependencies = [ "anyhow", "chrono", diff --git a/Cargo.toml b/Cargo.toml index 8c332e89..2b993cbe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,8 @@ resolver = "2" [workspace.package] edition = "2021" -version = "0.3.17" +version = "0.3.18" + description = "Tower is the best way to host Python data apps in production" rust-version = "1.77" diff --git a/pyproject.toml b/pyproject.toml index 465a58af..bf01a1f8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,8 @@ build-backend = "maturin" [project] name = "tower" -version = "0.3.17" +version = "0.3.18" + description = "Tower CLI and runtime environment for Tower." authors = [{ name = "Tower Computing Inc.", email = "brad@tower.dev" }] diff --git a/uv.lock b/uv.lock index d2f7ec87..070c1736 100644 --- a/uv.lock +++ b/uv.lock @@ -1201,7 +1201,7 @@ wheels = [ [[package]] name = "tower" -version = "0.3.17" +version = "0.3.18" source = { editable = "." } dependencies = [ { name = "attrs" },