diff --git a/Cargo.lock b/Cargo.lock index b97980c1c8..2c24b72012 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4705,6 +4705,7 @@ dependencies = [ "tokio-stream", "tokio-tungstenite", "tracing", + "tracing-opentelemetry", "tracing-subscriber", "url", "uuid", diff --git a/engine/packages/api-builder/src/middleware.rs b/engine/packages/api-builder/src/middleware.rs index 4503a722a5..878a491113 100644 --- a/engine/packages/api-builder/src/middleware.rs +++ b/engine/packages/api-builder/src/middleware.rs @@ -3,7 +3,7 @@ use std::{net::SocketAddr, time::Instant}; use anyhow::Result; use axum::{ body::{Body, HttpBody}, - extract::{ConnectInfo, State}, + extract::{ConnectInfo, MatchedPath, State}, http::{Request, StatusCode}, middleware::Next, response::Response, @@ -67,6 +67,11 @@ pub async fn http_logging_middleware( ray_id = %request_ids.ray_id, req_id = %request_ids.req_id, ); + req_span.set_attribute("http.request.method", req.method().to_string()); + req_span.set_attribute("http.path", req.uri().to_string()); + if let Some(path) = req.extensions().get::() { + req_span.set_attribute("http.route", path.as_str().to_string()); + } req_span.add_link(current_span_ctx); // Extract headers for logging @@ -122,6 +127,8 @@ pub async fn http_logging_middleware( let status = response.status(); let status_code = status.as_u16(); + tracing::Span::current().set_attribute("http.response.status_code", status_code as i64); + let error = response.extensions().get::(); // Log based on status diff --git a/engine/packages/guard-core/Cargo.toml b/engine/packages/guard-core/Cargo.toml index b29fbcb0e5..f72ff7527b 100644 --- a/engine/packages/guard-core/Cargo.toml +++ b/engine/packages/guard-core/Cargo.toml @@ -41,6 +41,7 @@ serde.workspace = true tokio-rustls.workspace = true tokio-tungstenite.workspace = true tokio.workspace = true +tracing-opentelemetry.workspace = true tracing-subscriber = { workspace = true, features = ["env-filter"] } tracing.workspace = true url.workspace = true diff --git a/engine/packages/guard-core/src/proxy_service.rs b/engine/packages/guard-core/src/proxy_service.rs index f8560dd7d6..77ff4ae923 100644 --- a/engine/packages/guard-core/src/proxy_service.rs +++ b/engine/packages/guard-core/src/proxy_service.rs @@ -12,6 +12,7 @@ use rivet_api_builder::{RequestIds, X_RIVET_RAY_ID}; use rivet_error::{INTERNAL_ERROR, RivetError}; use rivet_util::Id; use serde_json; +use tracing_opentelemetry::OpenTelemetrySpanExt; use rivet_runner_protocol as protocol; use std::{ @@ -2009,9 +2010,10 @@ impl ProxyService { let request_ids = RequestIds::new(self.state.config.dc_label()); req.extensions_mut().insert(request_ids); - tracing::Span::current() - .record("req_id", request_ids.req_id.to_string()) - .record("ray_id", request_ids.ray_id.to_string()); + let current_span = tracing::Span::current(); + + current_span.record("req_id", request_ids.req_id.to_string()); + current_span.record("ray_id", request_ids.ray_id.to_string()); // Extract request information for logging and analytics before consuming the request let incoming_ray_id = req @@ -2033,6 +2035,9 @@ impl ProxyService { .unwrap_or_else(|| req.uri().path().to_string()); let method = req.method().clone(); + current_span.set_attribute("http.request.method", method.to_string()); + current_span.set_attribute("http.path", uri_string.clone()); + let user_agent = req .headers() .get(hyper::header::USER_AGENT) @@ -2213,6 +2218,8 @@ impl ProxyService { let status = res.status().as_u16(); + current_span.set_attribute("http.response.status_code", status as i64); + let content_length = res .headers() .get(hyper::header::CONTENT_LENGTH)