diff --git a/Cargo.lock b/Cargo.lock index 3af9344..6107a16 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2865,6 +2865,7 @@ dependencies = [ "axum", "chrono", "config", + "once_cell", "reqwest", "serde", "sqlx", diff --git a/Cargo.toml b/Cargo.toml index d29a97d..69f1c95 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,7 +27,7 @@ sqlx = { version = "0.7", features = [ "chrono", "migrate", ] } -tokio = { version = "1", features = ["full"] } +tokio = { version = "1.36", features = ["full"] } uuid = { version = "1.8", features = ["v4", "serde"] } tracing = { version = "0.1", features = ["log"] } tracing-subscriber = { version = "0.3", features = ["registry", "env-filter"] } @@ -37,6 +37,7 @@ tracing-log = "0.2" [dev-dependencies] reqwest = "0.12" +once_cell = "1.19" [package.metadata.clippy] warn = [ diff --git a/src/main.rs b/src/main.rs index 8045c98..bcfb6f1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,7 +10,7 @@ use zero2prod::{ #[tokio::main] async fn main() -> Result<(), std::io::Error> { - let subscriber = get_subscriber("zero2prod", "info"); + let subscriber = get_subscriber("zero2prod", "info", std::io::stdout); init_subscriber(subscriber); let configuation = get_configuration().expect("Failed to read configuation."); let pool = PgPoolOptions::new() diff --git a/src/telemetry.rs b/src/telemetry.rs index 3e5ac7a..4ce1b7d 100644 --- a/src/telemetry.rs +++ b/src/telemetry.rs @@ -1,11 +1,18 @@ use tracing::{subscriber::set_global_default, Subscriber}; use tracing_bunyan_formatter::{BunyanFormattingLayer, JsonStorageLayer}; use tracing_log::LogTracer; -use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Registry}; +use tracing_subscriber::{fmt::MakeWriter, layer::SubscriberExt, EnvFilter, Registry}; -pub fn get_subscriber(name: &str, env_filter: &str) -> impl Subscriber + Sync + Send { +pub fn get_subscriber( + name: &str, + env_filter: &str, + sink: Sink, +) -> impl Subscriber + Sync + Send +where + Sink: for<'a> MakeWriter<'a> + Send + Sync + 'static, +{ let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| env_filter.into()); - let formatting_layer = BunyanFormattingLayer::new(name.into(), std::io::stdout); + let formatting_layer = BunyanFormattingLayer::new(name.into(), sink); Registry::default() .with(env_filter) .with(JsonStorageLayer) diff --git a/tests/health_check.rs b/tests/health_check.rs index 4723fad..4123564 100644 --- a/tests/health_check.rs +++ b/tests/health_check.rs @@ -1,3 +1,4 @@ +use once_cell::sync::Lazy; use reqwest::Client; use sqlx::{postgres::PgPoolOptions, Connection, Executor, PgConnection, PgPool}; use tokio::net::TcpListener; @@ -5,6 +6,7 @@ use uuid::Uuid; use zero2prod::{ configuation::{get_configuration, DatabaseSettings}, routes::route, + telemetry::{get_subscriber, init_subscriber}, }; #[tokio::test] @@ -85,7 +87,20 @@ async fn subscribe_returns_400_when_data_is_missing() { } } +static TRACING: Lazy<()> = Lazy::new(|| { + let default_filter_level = "info"; + let subscriber_name = "test"; + if std::env::var("TEST_LOG").is_ok() { + let subscriber = get_subscriber(subscriber_name, default_filter_level, std::io::stdout); + init_subscriber(subscriber); + } else { + let subscriber = get_subscriber(default_filter_level, subscriber_name, std::io::sink); + init_subscriber(subscriber); + } +}); + async fn spawn_app() -> TestApp { + Lazy::force(&TRACING); let listener = TcpListener::bind("127.0.0.1:0") .await .expect("Failed to bind random port");