From a79a547adb79c5ba52c965fe150789893a8ba156 Mon Sep 17 00:00:00 2001 From: Yiming Luo Date: Thu, 6 Nov 2025 19:54:40 -0500 Subject: [PATCH 1/6] Allow sending trace stats via proxy --- libdd-trace-utils/src/stats_utils.rs | 35 +++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/libdd-trace-utils/src/stats_utils.rs b/libdd-trace-utils/src/stats_utils.rs index 4bd951e360..bbc32b71ef 100644 --- a/libdd-trace-utils/src/stats_utils.rs +++ b/libdd-trace-utils/src/stats_utils.rs @@ -58,6 +58,15 @@ mod mini_agent { data: Vec, target: &Endpoint, api_key: &str, + ) -> anyhow::Result<()> { + send_stats_payload_proxy(data, target, api_key, None).await + } + + pub async fn send_stats_payload_proxy( + data: Vec, + target: &Endpoint, + api_key: &str, + http_proxy: Option<&str>, ) -> anyhow::Result<()> { let req = Request::builder() .method(Method::POST) @@ -67,7 +76,31 @@ mod mini_agent { .header("DD-API-KEY", api_key) .body(hyper_migration::Body::from(data.clone()))?; - let client = hyper_migration::new_default_client(); + #[cfg(feature = "proxy")] + #[allow(clippy::unwrap_used)] + let client = { + if let Some(proxy) = http_proxy { + let proxy = hyper_http_proxy::Proxy::new( + hyper_http_proxy::Intercept::Https, + proxy.parse().unwrap(), + ); + let proxy_connector = hyper_http_proxy::ProxyConnector::from_proxy( + ddcommon::connector::Connector::default(), + proxy, + ) + .unwrap(); + hyper_migration::client_builder().build(proxy_connector) + } else { + hyper_migration::new_default_client() + } + }; + + #[cfg(not(feature = "proxy"))] + let client = { + let _ = http_proxy; + hyper_migration::new_default_client() + }; + match client.request(req).await { Ok(response) => { if response.status() != StatusCode::ACCEPTED { From 30009e373c06a0793b100e20f6d3124bbe7cad95 Mon Sep 17 00:00:00 2001 From: Yiming Luo Date: Thu, 13 Nov 2025 13:58:49 -0500 Subject: [PATCH 2/6] Fix proxy feature --- Cargo.lock | 18 ++++++++++++++++++ libdd-trace-utils/Cargo.toml | 4 ++++ libdd-trace-utils/src/stats_utils.rs | 2 +- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Cargo.lock b/Cargo.lock index 55a872731e..973542e4a5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2171,6 +2171,23 @@ dependencies = [ "want", ] +[[package]] +name = "hyper-http-proxy" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ad4b0a1e37510028bc4ba81d0e38d239c39671b0f0ce9e02dfa93a8133f7c08" +dependencies = [ + "bytes", + "futures-util", + "headers", + "http", + "hyper", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + [[package]] name = "hyper-multipart-rfc7578" version = "0.9.0" @@ -2943,6 +2960,7 @@ dependencies = [ "http-body-util", "httpmock", "hyper", + "hyper-http-proxy", "indexmap 2.12.0", "libdd-common", "libdd-tinybytes", diff --git a/libdd-trace-utils/Cargo.toml b/libdd-trace-utils/Cargo.toml index b17f97e44e..af3abfb25b 100644 --- a/libdd-trace-utils/Cargo.toml +++ b/libdd-trace-utils/Cargo.toml @@ -45,6 +45,9 @@ libdd-tinybytes = { version = "1.0.0", path = "../libdd-tinybytes", features = [ flate2 = { version = "1.0", optional = true } zstd = { version = "0.13.3", default-features = false, optional = true } +# Proxy feature +hyper-http-proxy = { version = "1.1.0", default-features = false, optional = true } + # test-utils feature cargo_metadata = { version = "0.18.1", optional = true } # Dependency of cargo metadata, but 0.1.8 requires too new of a rust version. @@ -74,5 +77,6 @@ test-utils = [ "urlencoding", ] compression = ["zstd", "flate2"] +proxy = ["hyper-http-proxy"] # FIPS mode uses the FIPS-compliant cryptographic provider (Unix only) fips = ["libdd-common/fips"] diff --git a/libdd-trace-utils/src/stats_utils.rs b/libdd-trace-utils/src/stats_utils.rs index bbc32b71ef..af55dbc773 100644 --- a/libdd-trace-utils/src/stats_utils.rs +++ b/libdd-trace-utils/src/stats_utils.rs @@ -85,7 +85,7 @@ mod mini_agent { proxy.parse().unwrap(), ); let proxy_connector = hyper_http_proxy::ProxyConnector::from_proxy( - ddcommon::connector::Connector::default(), + libdd_common::connector::Connector::default(), proxy, ) .unwrap(); From 0df254b9179d875fe57a46781e2048a9d0480e0e Mon Sep 17 00:00:00 2001 From: Yiming Luo Date: Thu, 13 Nov 2025 14:11:35 -0500 Subject: [PATCH 3/6] Make function take in client --- Cargo.lock | 17 ---------------- libdd-trace-utils/Cargo.toml | 4 ---- libdd-trace-utils/src/stats_utils.rs | 29 +++------------------------- 3 files changed, 3 insertions(+), 47 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 973542e4a5..bb57a3ca02 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2171,23 +2171,6 @@ dependencies = [ "want", ] -[[package]] -name = "hyper-http-proxy" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ad4b0a1e37510028bc4ba81d0e38d239c39671b0f0ce9e02dfa93a8133f7c08" -dependencies = [ - "bytes", - "futures-util", - "headers", - "http", - "hyper", - "hyper-util", - "pin-project-lite", - "tokio", - "tower-service", -] - [[package]] name = "hyper-multipart-rfc7578" version = "0.9.0" diff --git a/libdd-trace-utils/Cargo.toml b/libdd-trace-utils/Cargo.toml index af3abfb25b..b17f97e44e 100644 --- a/libdd-trace-utils/Cargo.toml +++ b/libdd-trace-utils/Cargo.toml @@ -45,9 +45,6 @@ libdd-tinybytes = { version = "1.0.0", path = "../libdd-tinybytes", features = [ flate2 = { version = "1.0", optional = true } zstd = { version = "0.13.3", default-features = false, optional = true } -# Proxy feature -hyper-http-proxy = { version = "1.1.0", default-features = false, optional = true } - # test-utils feature cargo_metadata = { version = "0.18.1", optional = true } # Dependency of cargo metadata, but 0.1.8 requires too new of a rust version. @@ -77,6 +74,5 @@ test-utils = [ "urlencoding", ] compression = ["zstd", "flate2"] -proxy = ["hyper-http-proxy"] # FIPS mode uses the FIPS-compliant cryptographic provider (Unix only) fips = ["libdd-common/fips"] diff --git a/libdd-trace-utils/src/stats_utils.rs b/libdd-trace-utils/src/stats_utils.rs index af55dbc773..de3e73b74b 100644 --- a/libdd-trace-utils/src/stats_utils.rs +++ b/libdd-trace-utils/src/stats_utils.rs @@ -62,11 +62,11 @@ mod mini_agent { send_stats_payload_proxy(data, target, api_key, None).await } - pub async fn send_stats_payload_proxy( + pub async fn send_stats_payload_with_client( data: Vec, target: &Endpoint, api_key: &str, - http_proxy: Option<&str>, + client: Option<&GenericHttpClient>, ) -> anyhow::Result<()> { let req = Request::builder() .method(Method::POST) @@ -76,30 +76,7 @@ mod mini_agent { .header("DD-API-KEY", api_key) .body(hyper_migration::Body::from(data.clone()))?; - #[cfg(feature = "proxy")] - #[allow(clippy::unwrap_used)] - let client = { - if let Some(proxy) = http_proxy { - let proxy = hyper_http_proxy::Proxy::new( - hyper_http_proxy::Intercept::Https, - proxy.parse().unwrap(), - ); - let proxy_connector = hyper_http_proxy::ProxyConnector::from_proxy( - libdd_common::connector::Connector::default(), - proxy, - ) - .unwrap(); - hyper_migration::client_builder().build(proxy_connector) - } else { - hyper_migration::new_default_client() - } - }; - - #[cfg(not(feature = "proxy"))] - let client = { - let _ = http_proxy; - hyper_migration::new_default_client() - }; + let client = client.unwrap_or(hyper_migration::new_default_client()); match client.request(req).await { Ok(response) => { From b010144997b4ccebdb84df94af3a2087da369ba0 Mon Sep 17 00:00:00 2001 From: Yiming Luo Date: Thu, 13 Nov 2025 14:16:29 -0500 Subject: [PATCH 4/6] Fix name --- libdd-trace-utils/src/stats_utils.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libdd-trace-utils/src/stats_utils.rs b/libdd-trace-utils/src/stats_utils.rs index de3e73b74b..279998c0a2 100644 --- a/libdd-trace-utils/src/stats_utils.rs +++ b/libdd-trace-utils/src/stats_utils.rs @@ -59,7 +59,7 @@ mod mini_agent { target: &Endpoint, api_key: &str, ) -> anyhow::Result<()> { - send_stats_payload_proxy(data, target, api_key, None).await + send_stats_payload_with_client(data, target, api_key, None).await } pub async fn send_stats_payload_with_client( From 4f5656f378864652b7bc8c7ef69073611ef0ac7e Mon Sep 17 00:00:00 2001 From: Yiming Luo Date: Thu, 13 Nov 2025 14:28:48 -0500 Subject: [PATCH 5/6] Fix type error --- libdd-trace-utils/src/stats_utils.rs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/libdd-trace-utils/src/stats_utils.rs b/libdd-trace-utils/src/stats_utils.rs index 279998c0a2..96b0da5726 100644 --- a/libdd-trace-utils/src/stats_utils.rs +++ b/libdd-trace-utils/src/stats_utils.rs @@ -10,6 +10,8 @@ mod mini_agent { use hyper::{body::Buf, Method, Request, StatusCode}; use libdd_common::hyper_migration; use libdd_common::Endpoint; + use libdd_common::GenericHttpClient; + use libdd_common::Connect; use libdd_trace_protobuf::pb; use std::io::Write; use tracing::debug; @@ -59,10 +61,10 @@ mod mini_agent { target: &Endpoint, api_key: &str, ) -> anyhow::Result<()> { - send_stats_payload_with_client(data, target, api_key, None).await + send_stats_payload_with_client::(data, target, api_key, None).await } - pub async fn send_stats_payload_with_client( + pub async fn send_stats_payload_with_client( data: Vec, target: &Endpoint, api_key: &str, @@ -76,9 +78,14 @@ mod mini_agent { .header("DD-API-KEY", api_key) .body(hyper_migration::Body::from(data.clone()))?; - let client = client.unwrap_or(hyper_migration::new_default_client()); + let response = if let Some(client) = client { + client.request(req).await + } else { + let default_client = hyper_migration::new_default_client(); + default_client.request(req).await + }; - match client.request(req).await { + match response { Ok(response) => { if response.status() != StatusCode::ACCEPTED { let body_bytes = response.into_body().collect().await?.to_bytes(); From c5e295a7d9692142044ebc9ef38601275d5450df Mon Sep 17 00:00:00 2001 From: Yiming Luo Date: Thu, 13 Nov 2025 14:29:49 -0500 Subject: [PATCH 6/6] fmt --- libdd-trace-utils/src/stats_utils.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libdd-trace-utils/src/stats_utils.rs b/libdd-trace-utils/src/stats_utils.rs index 96b0da5726..405077d52b 100644 --- a/libdd-trace-utils/src/stats_utils.rs +++ b/libdd-trace-utils/src/stats_utils.rs @@ -9,9 +9,9 @@ mod mini_agent { use http_body_util::BodyExt; use hyper::{body::Buf, Method, Request, StatusCode}; use libdd_common::hyper_migration; + use libdd_common::Connect; use libdd_common::Endpoint; use libdd_common::GenericHttpClient; - use libdd_common::Connect; use libdd_trace_protobuf::pb; use std::io::Write; use tracing::debug; @@ -61,7 +61,10 @@ mod mini_agent { target: &Endpoint, api_key: &str, ) -> anyhow::Result<()> { - send_stats_payload_with_client::(data, target, api_key, None).await + send_stats_payload_with_client::( + data, target, api_key, None, + ) + .await } pub async fn send_stats_payload_with_client(