collab: Log HTTP requests (#8297)

Conrad Irwin , Marshall , and Marshall Bowers created

Co-Authored-By: Marshall <marshall@zed.dev>



Release Notes:

- N/A

---------

Co-authored-by: Marshall <marshall@zed.dev>
Co-authored-by: Marshall Bowers <elliott.codes@gmail.com>

Change summary

Cargo.lock                | 24 ++++++++++++++++++++++--
Cargo.toml                |  1 +
Procfile                  |  2 +-
crates/collab/Cargo.toml  |  1 +
crates/collab/src/main.rs | 21 ++++++++++++++-------
5 files changed, 39 insertions(+), 10 deletions(-)

Detailed changes

Cargo.lock 🔗

@@ -1188,7 +1188,7 @@ dependencies = [
  "tokio",
  "tokio-tungstenite",
  "tower",
- "tower-http",
+ "tower-http 0.3.5",
  "tower-layer",
  "tower-service",
 ]
@@ -1225,7 +1225,7 @@ dependencies = [
  "serde_json",
  "tokio",
  "tower",
- "tower-http",
+ "tower-http 0.3.5",
  "tower-layer",
  "tower-service",
 ]
@@ -2121,6 +2121,7 @@ dependencies = [
  "toml 0.8.10",
  "tonic",
  "tower",
+ "tower-http 0.4.4",
  "tracing",
  "tracing-log",
  "tracing-subscriber",
@@ -10052,6 +10053,25 @@ dependencies = [
  "tower-service",
 ]
 
+[[package]]
+name = "tower-http"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140"
+dependencies = [
+ "bitflags 2.4.1",
+ "bytes 1.5.0",
+ "futures-core",
+ "futures-util",
+ "http 0.2.9",
+ "http-body",
+ "http-range-header",
+ "pin-project-lite 0.2.13",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
 [[package]]
 name = "tower-layer"
 version = "0.3.2"

Cargo.toml 🔗

@@ -233,6 +233,7 @@ thiserror = "1.0.29"
 tiktoken-rs = "0.5.7"
 time = { version = "0.3", features = ["serde", "serde-well-known", "formatting"] }
 toml = "0.8"
+tower-http = "0.4.4"
 tree-sitter = { version = "0.20", features = ["wasm"] }
 tree-sitter-astro = { git = "https://github.com/virchau13/tree-sitter-astro.git", rev = "e924787e12e8a03194f36a113290ac11d6dc10f3" }
 tree-sitter-bash = { git = "https://github.com/tree-sitter/tree-sitter-bash", rev = "7331995b19b8f8aba2d5e26deb51d2195c18bc94" }

Procfile 🔗

@@ -1,3 +1,3 @@
-collab: RUST_LOG=${RUST_LOG:-warn,collab=info} cargo run --package=collab serve
+collab: RUST_LOG=${RUST_LOG:-warn,tower_http=info,collab=info} cargo run --package=collab serve
 livekit: livekit-server --dev
 blob_store: MINIO_ROOT_USER=the-blob-store-access-key MINIO_ROOT_PASSWORD=the-blob-store-secret-key minio server .blob_store

crates/collab/Cargo.toml 🔗

@@ -61,6 +61,7 @@ tokio-tungstenite = "0.17"
 toml.workspace = true
 tonic = "0.6"
 tower = "0.4"
+tower-http = { workspace = true, features = ["trace"] }
 tracing = "0.1.34"
 tracing-log = "0.1.3"
 tracing-subscriber = { version = "0.3.11", features = ["env-filter", "json"] }

crates/collab/src/main.rs 🔗

@@ -12,6 +12,8 @@ use std::{
     sync::Arc,
 };
 use tokio::signal::unix::SignalKind;
+use tower_http::trace::{self, TraceLayer};
+use tracing::Level;
 use tracing_log::LogTracer;
 use tracing_subscriber::{filter::EnvFilter, fmt::format::JsonFields, Layer};
 use util::ResultExt;
@@ -72,13 +74,18 @@ async fn main() -> Result<()> {
             if let Some(rpc_server) = rpc_server.clone() {
                 app = app.merge(collab::rpc::routes(rpc_server))
             }
-            app = app.merge(
-                Router::new()
-                    .route("/", get(handle_root))
-                    .route("/healthz", get(handle_liveness_probe))
-                    .merge(collab::api::events::router())
-                    .layer(Extension(state.clone())),
-            );
+            app = app
+                .merge(
+                    Router::new()
+                        .route("/", get(handle_root))
+                        .route("/healthz", get(handle_liveness_probe))
+                        .merge(collab::api::events::router())
+                        .layer(Extension(state.clone())),
+                )
+                .layer(
+                    TraceLayer::new_for_http()
+                        .on_response(trace::DefaultOnResponse::new().level(Level::INFO)),
+                );
 
             axum::Server::from_tcp(listener)?
                 .serve(app.into_make_service_with_connect_info::<SocketAddr>())