From 8483eef6eab1d4aa1da1b4c1f4ff3aaa93365f7a Mon Sep 17 00:00:00 2001 From: Duncan Harvey Date: Tue, 16 Dec 2025 12:49:13 -0500 Subject: [PATCH 1/3] move config to a dedicated crate --- Cargo.lock | 15 ++++++++++ crates/datadog-serverless-compat/Cargo.toml | 1 + crates/datadog-serverless-compat/src/main.rs | 3 +- crates/datadog-serverless-config/Cargo.toml | 25 ++++++++++++++++ .../src/lib.rs} | 29 ++++++++++++------- crates/datadog-trace-agent/Cargo.toml | 1 + crates/datadog-trace-agent/src/lib.rs | 1 - crates/datadog-trace-agent/src/mini_agent.rs | 7 +++-- .../datadog-trace-agent/src/stats_flusher.rs | 2 +- .../src/stats_processor.rs | 2 +- .../datadog-trace-agent/src/trace_flusher.rs | 2 +- .../src/trace_processor.rs | 4 +-- 12 files changed, 71 insertions(+), 21 deletions(-) create mode 100644 crates/datadog-serverless-config/Cargo.toml rename crates/{datadog-trace-agent/src/config.rs => datadog-serverless-config/src/lib.rs} (95%) diff --git a/Cargo.lock b/Cargo.lock index dc618d7..eb3df81 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -441,6 +441,7 @@ dependencies = [ name = "datadog-serverless-compat" version = "0.1.0" dependencies = [ + "datadog-serverless-config", "datadog-trace-agent", "dogstatsd", "libdd-trace-utils", @@ -451,12 +452,26 @@ dependencies = [ "zstd", ] +[[package]] +name = "datadog-serverless-config" +version = "0.1.0" +dependencies = [ + "anyhow", + "duplicate", + "hyper", + "libdd-common", + "libdd-trace-obfuscation", + "libdd-trace-utils", + "serial_test", +] + [[package]] name = "datadog-trace-agent" version = "0.1.0" dependencies = [ "anyhow", "async-trait", + "datadog-serverless-config", "duplicate", "http-body-util", "hyper", diff --git a/crates/datadog-serverless-compat/Cargo.toml b/crates/datadog-serverless-compat/Cargo.toml index 068db28..894dbba 100644 --- a/crates/datadog-serverless-compat/Cargo.toml +++ b/crates/datadog-serverless-compat/Cargo.toml @@ -6,6 +6,7 @@ license.workspace = true description = "Binary to run trace-agent and dogstatsd servers in Serverless environments" [dependencies] +datadog-serverless-config = { path = "../datadog-serverless-config" } datadog-trace-agent = { path = "../datadog-trace-agent" } libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog", rev = "435107c245112397914935c0f7148a18b91cafc6" } dogstatsd = { path = "../dogstatsd", default-features = true } diff --git a/crates/datadog-serverless-compat/src/main.rs b/crates/datadog-serverless-compat/src/main.rs index 5b91a91..8217102 100644 --- a/crates/datadog-serverless-compat/src/main.rs +++ b/crates/datadog-serverless-compat/src/main.rs @@ -16,9 +16,10 @@ use tracing::{debug, error, info}; use tracing_subscriber::EnvFilter; use zstd::zstd_safe::CompressionLevel; +use datadog_serverless_config as config; use datadog_trace_agent::{ aggregator::TraceAggregator, - config, env_verifier, mini_agent, stats_flusher, stats_processor, + env_verifier, mini_agent, stats_flusher, stats_processor, trace_flusher::{self, TraceFlusher}, trace_processor, }; diff --git a/crates/datadog-serverless-config/Cargo.toml b/crates/datadog-serverless-config/Cargo.toml new file mode 100644 index 0000000..2bb875a --- /dev/null +++ b/crates/datadog-serverless-config/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "datadog-serverless-config" +version = "0.1.0" +license.workspace = true +edition.workspace = true + +[lib] +bench = false + +[dependencies] +anyhow = "1.0" +hyper = { version = "1.6", features = ["http1"] } +libdd-common = { git = "https://github.com/DataDog/libdatadog", rev = "435107c245112397914935c0f7148a18b91cafc6" } +libdd-trace-obfuscation = { git = "https://github.com/DataDog/libdatadog", rev = "435107c245112397914935c0f7148a18b91cafc6" } +libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog", rev = "435107c245112397914935c0f7148a18b91cafc6", features = [ + "mini_agent", +] } + +[dev-dependencies] +serial_test = "2.0.0" +duplicate = "0.4.1" +libdd-trace-utils = { git = "https://github.com/DataDog/libdatadog", rev = "435107c245112397914935c0f7148a18b91cafc6", features = [ + "test-utils", +] } + diff --git a/crates/datadog-trace-agent/src/config.rs b/crates/datadog-serverless-config/src/lib.rs similarity index 95% rename from crates/datadog-trace-agent/src/config.rs rename to crates/datadog-serverless-config/src/lib.rs index e6ac540..50d63b8 100644 --- a/crates/datadog-trace-agent/src/config.rs +++ b/crates/datadog-serverless-config/src/lib.rs @@ -1,6 +1,12 @@ // Copyright 2023-Present Datadog, Inc. https://www.datadoghq.com/ // SPDX-License-Identifier: Apache-2.0 +#![cfg_attr(not(test), deny(clippy::panic))] +#![cfg_attr(not(test), deny(clippy::unwrap_used))] +#![cfg_attr(not(test), deny(clippy::expect_used))] +#![cfg_attr(not(test), deny(clippy::todo))] +#![cfg_attr(not(test), deny(clippy::unimplemented))] + use libdd_common::Endpoint; use std::borrow::Cow; use std::collections::HashMap; @@ -168,14 +174,14 @@ mod tests { use std::collections::HashMap; use std::env; - use crate::config; + use crate::{Config, Tags}; #[test] #[serial] fn test_error_if_unable_to_identify_env() { env::set_var("DD_API_KEY", "_not_a_real_key_"); - let config = config::Config::new(); + let config = Config::new(); assert!(config.is_err()); assert_eq!( config.unwrap_err().to_string(), @@ -188,7 +194,7 @@ mod tests { #[serial] fn test_error_if_no_api_key_env_var() { env::remove_var("DD_API_KEY"); - let config = config::Config::new(); + let config = Config::new(); assert!(config.is_err()); assert_eq!( config.unwrap_err().to_string(), @@ -201,7 +207,7 @@ mod tests { fn test_default_trace_and_trace_stats_urls() { env::set_var("DD_API_KEY", "_not_a_real_key_"); env::set_var("K_SERVICE", "function_name"); - let config_res = config::Config::new(); + let config_res = Config::new(); assert!(config_res.is_ok()); let config = config_res.unwrap(); assert_eq!( @@ -231,7 +237,7 @@ mod tests { env::set_var("DD_API_KEY", "_not_a_real_key_"); env::set_var("K_SERVICE", "function_name"); env::set_var("DD_SITE", dd_site); - let config_res = config::Config::new(); + let config_res = Config::new(); assert!(config_res.is_ok()); let config = config_res.unwrap(); assert_eq!(config.trace_intake.url, expected_url); @@ -255,7 +261,7 @@ mod tests { env::set_var("DD_API_KEY", "_not_a_real_key_"); env::set_var("K_SERVICE", "function_name"); env::set_var("DD_SITE", dd_site); - let config_res = config::Config::new(); + let config_res = Config::new(); assert!(config_res.is_ok()); let config = config_res.unwrap(); assert_eq!(config.trace_stats_intake.url, expected_url); @@ -270,7 +276,7 @@ mod tests { env::set_var("DD_API_KEY", "_not_a_real_key_"); env::set_var("K_SERVICE", "function_name"); env::set_var("DD_APM_DD_URL", "http://127.0.0.1:3333"); - let config_res = config::Config::new(); + let config_res = Config::new(); assert!(config_res.is_ok()); let config = config_res.unwrap(); assert_eq!( @@ -291,7 +297,7 @@ mod tests { fn test_default_dogstatsd_port() { env::set_var("DD_API_KEY", "_not_a_real_key_"); env::set_var("ASCSVCRT_SPRING__APPLICATION__NAME", "test-spring-app"); - let config_res = config::Config::new(); + let config_res = Config::new(); assert!(config_res.is_ok()); let config = config_res.unwrap(); assert_eq!(config.dd_dogstatsd_port, 8125); @@ -305,7 +311,7 @@ mod tests { env::set_var("DD_API_KEY", "_not_a_real_key_"); env::set_var("ASCSVCRT_SPRING__APPLICATION__NAME", "test-spring-app"); env::set_var("DD_DOGSTATSD_PORT", "18125"); - let config_res = config::Config::new(); + let config_res = Config::new(); println!("{:?}", config_res); assert!(config_res.is_ok()); let config = config_res.unwrap(); @@ -315,11 +321,11 @@ mod tests { env::remove_var("DD_DOGSTATSD_PORT"); } - fn test_config_with_dd_tags(dd_tags: &str) -> config::Config { + fn test_config_with_dd_tags(dd_tags: &str) -> Config { env::set_var("DD_API_KEY", "_not_a_real_key_"); env::set_var("ASCSVCRT_SPRING__APPLICATION__NAME", "test-spring-app"); env::set_var("DD_TAGS", dd_tags); - let config_res = config::Config::new(); + let config_res = Config::new(); assert!(config_res.is_ok()); let config = config_res.unwrap(); env::remove_var("DD_API_KEY"); @@ -392,3 +398,4 @@ mod tests { assert_eq!(config.tags.function_tags(), None); } } + diff --git a/crates/datadog-trace-agent/Cargo.toml b/crates/datadog-trace-agent/Cargo.toml index 26b8290..79e4843 100644 --- a/crates/datadog-trace-agent/Cargo.toml +++ b/crates/datadog-trace-agent/Cargo.toml @@ -20,6 +20,7 @@ async-trait = "0.1.64" tracing = { version = "0.1", default-features = false } serde = { version = "1.0.145", features = ["derive"] } serde_json = "1.0" +datadog-serverless-config = { path = "../datadog-serverless-config" } libdd-common = { git = "https://github.com/DataDog/libdatadog", rev = "435107c245112397914935c0f7148a18b91cafc6" } libdd-trace-obfuscation = { git = "https://github.com/DataDog/libdatadog", rev = "435107c245112397914935c0f7148a18b91cafc6" } libdd-trace-protobuf = { git = "https://github.com/DataDog/libdatadog", rev = "435107c245112397914935c0f7148a18b91cafc6" } diff --git a/crates/datadog-trace-agent/src/lib.rs b/crates/datadog-trace-agent/src/lib.rs index 165c263..3ca287e 100644 --- a/crates/datadog-trace-agent/src/lib.rs +++ b/crates/datadog-trace-agent/src/lib.rs @@ -8,7 +8,6 @@ #![cfg_attr(not(test), deny(clippy::unimplemented))] pub mod aggregator; -pub mod config; pub mod env_verifier; pub mod http_utils; pub mod mini_agent; diff --git a/crates/datadog-trace-agent/src/mini_agent.rs b/crates/datadog-trace-agent/src/mini_agent.rs index dcfa6ae..00f19e0 100644 --- a/crates/datadog-trace-agent/src/mini_agent.rs +++ b/crates/datadog-trace-agent/src/mini_agent.rs @@ -13,7 +13,8 @@ use tokio::sync::mpsc::{self, Receiver, Sender}; use tracing::{debug, error}; use crate::http_utils::log_and_create_http_response; -use crate::{config, env_verifier, stats_flusher, stats_processor, trace_flusher, trace_processor}; +use crate::{env_verifier, stats_flusher, stats_processor, trace_flusher, trace_processor}; +use datadog_serverless_config::Config; use libdd_trace_protobuf::pb; use libdd_trace_utils::trace_utils; use libdd_trace_utils::trace_utils::SendData; @@ -26,7 +27,7 @@ const TRACER_PAYLOAD_CHANNEL_BUFFER_SIZE: usize = 10; const STATS_PAYLOAD_CHANNEL_BUFFER_SIZE: usize = 10; pub struct MiniAgent { - pub config: Arc, + pub config: Arc, pub trace_processor: Arc, pub trace_flusher: Arc, pub stats_processor: Arc, @@ -163,7 +164,7 @@ impl MiniAgent { } async fn trace_endpoint_handler( - config: Arc, + config: Arc, req: hyper_migration::HttpRequest, trace_processor: Arc, trace_tx: Sender, diff --git a/crates/datadog-trace-agent/src/stats_flusher.rs b/crates/datadog-trace-agent/src/stats_flusher.rs index fbadeda..1437f8b 100644 --- a/crates/datadog-trace-agent/src/stats_flusher.rs +++ b/crates/datadog-trace-agent/src/stats_flusher.rs @@ -9,7 +9,7 @@ use tracing::{debug, error}; use libdd_trace_protobuf::pb; use libdd_trace_utils::stats_utils; -use crate::config::Config; +use datadog_serverless_config::Config; #[async_trait] pub trait StatsFlusher { diff --git a/crates/datadog-trace-agent/src/stats_processor.rs b/crates/datadog-trace-agent/src/stats_processor.rs index d15be85..e3cc990 100644 --- a/crates/datadog-trace-agent/src/stats_processor.rs +++ b/crates/datadog-trace-agent/src/stats_processor.rs @@ -13,7 +13,7 @@ use tracing::debug; use libdd_trace_protobuf::pb; use libdd_trace_utils::stats_utils; -use crate::config::Config; +use datadog_serverless_config::Config; use crate::http_utils::{self, log_and_create_http_response}; #[async_trait] diff --git a/crates/datadog-trace-agent/src/trace_flusher.rs b/crates/datadog-trace-agent/src/trace_flusher.rs index c65fd4b..d3bf2cc 100644 --- a/crates/datadog-trace-agent/src/trace_flusher.rs +++ b/crates/datadog-trace-agent/src/trace_flusher.rs @@ -11,7 +11,7 @@ use libdd_trace_utils::trace_utils; use libdd_trace_utils::trace_utils::SendData; use crate::aggregator::TraceAggregator; -use crate::config::Config; +use datadog_serverless_config::Config; #[async_trait] pub trait TraceFlusher { diff --git a/crates/datadog-trace-agent/src/trace_processor.rs b/crates/datadog-trace-agent/src/trace_processor.rs index 96f2758..a52e126 100644 --- a/crates/datadog-trace-agent/src/trace_processor.rs +++ b/crates/datadog-trace-agent/src/trace_processor.rs @@ -16,9 +16,9 @@ use libdd_trace_utils::trace_utils::{EnvironmentType, SendData}; use libdd_trace_utils::tracer_payload::{TraceChunkProcessor, TracerPayloadCollection}; use crate::{ - config::Config, http_utils::{self, log_and_create_http_response, log_and_create_traces_success_http_response}, }; +use datadog_serverless_config::Config; const TRACER_PAYLOAD_FUNCTION_TAGS_TAG_KEY: &str = "_dd.tags.function"; @@ -164,9 +164,9 @@ mod tests { use tokio::sync::mpsc::{self, Receiver, Sender}; use crate::{ - config::{Config, Tags}, trace_processor::{self, TraceProcessor, TRACER_PAYLOAD_FUNCTION_TAGS_TAG_KEY}, }; + use datadog_serverless_config::{Config, Tags}; use libdd_common::{hyper_migration, Endpoint}; use libdd_trace_protobuf::pb; use libdd_trace_utils::test_utils::{create_test_gcp_json_span, create_test_gcp_span}; From 4830172f482d646baa4abfacc3e17fcca6bf0b7f Mon Sep 17 00:00:00 2001 From: Duncan Harvey Date: Tue, 16 Dec 2025 14:46:56 -0500 Subject: [PATCH 2/3] fix clippy warnings and apply formatting --- crates/datadog-serverless-config/src/lib.rs | 7 ++++++- crates/datadog-trace-agent/src/stats_processor.rs | 2 +- crates/datadog-trace-agent/src/trace_processor.rs | 10 ++++------ 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/crates/datadog-serverless-config/src/lib.rs b/crates/datadog-serverless-config/src/lib.rs index 50d63b8..c28596b 100644 --- a/crates/datadog-serverless-config/src/lib.rs +++ b/crates/datadog-serverless-config/src/lib.rs @@ -29,6 +29,12 @@ pub struct Tags { function_tags_string: OnceLock, } +impl Default for Tags { + fn default() -> Self { + Self::new() + } +} + impl Tags { pub fn from_env_string(env_tags: &str) -> Self { let mut tags = HashMap::new(); @@ -398,4 +404,3 @@ mod tests { assert_eq!(config.tags.function_tags(), None); } } - diff --git a/crates/datadog-trace-agent/src/stats_processor.rs b/crates/datadog-trace-agent/src/stats_processor.rs index e3cc990..cc8160b 100644 --- a/crates/datadog-trace-agent/src/stats_processor.rs +++ b/crates/datadog-trace-agent/src/stats_processor.rs @@ -13,8 +13,8 @@ use tracing::debug; use libdd_trace_protobuf::pb; use libdd_trace_utils::stats_utils; -use datadog_serverless_config::Config; use crate::http_utils::{self, log_and_create_http_response}; +use datadog_serverless_config::Config; #[async_trait] pub trait StatsProcessor { diff --git a/crates/datadog-trace-agent/src/trace_processor.rs b/crates/datadog-trace-agent/src/trace_processor.rs index a52e126..efa66e2 100644 --- a/crates/datadog-trace-agent/src/trace_processor.rs +++ b/crates/datadog-trace-agent/src/trace_processor.rs @@ -15,8 +15,8 @@ use libdd_trace_utils::trace_utils::{self}; use libdd_trace_utils::trace_utils::{EnvironmentType, SendData}; use libdd_trace_utils::tracer_payload::{TraceChunkProcessor, TracerPayloadCollection}; -use crate::{ - http_utils::{self, log_and_create_http_response, log_and_create_traces_success_http_response}, +use crate::http_utils::{ + self, log_and_create_http_response, log_and_create_traces_success_http_response, }; use datadog_serverless_config::Config; @@ -101,7 +101,7 @@ impl TraceProcessor for ServerlessTraceProcessor { // double check content length is < max request content length in case transfer encoding is used if body_size > config.max_request_content_length { return log_and_create_http_response( - &format!("Error processing traces: Payload too large"), + "Error processing traces: Payload too large", StatusCode::PAYLOAD_TOO_LARGE, ); } @@ -163,9 +163,7 @@ mod tests { use std::{collections::HashMap, sync::Arc, time::UNIX_EPOCH}; use tokio::sync::mpsc::{self, Receiver, Sender}; - use crate::{ - trace_processor::{self, TraceProcessor, TRACER_PAYLOAD_FUNCTION_TAGS_TAG_KEY}, - }; + use crate::trace_processor::{self, TraceProcessor, TRACER_PAYLOAD_FUNCTION_TAGS_TAG_KEY}; use datadog_serverless_config::{Config, Tags}; use libdd_common::{hyper_migration, Endpoint}; use libdd_trace_protobuf::pb; From 2daee5b25a9f54045d26af53212d40db6bd8cf9b Mon Sep 17 00:00:00 2001 From: Duncan Harvey Date: Tue, 16 Dec 2025 14:51:57 -0500 Subject: [PATCH 3/3] remove [lib] bench = false since there are no benchmarks --- crates/datadog-serverless-config/Cargo.toml | 3 --- crates/datadog-trace-agent/Cargo.toml | 3 --- crates/dogstatsd/Cargo.toml | 3 --- 3 files changed, 9 deletions(-) diff --git a/crates/datadog-serverless-config/Cargo.toml b/crates/datadog-serverless-config/Cargo.toml index 2bb875a..c316c88 100644 --- a/crates/datadog-serverless-config/Cargo.toml +++ b/crates/datadog-serverless-config/Cargo.toml @@ -4,9 +4,6 @@ version = "0.1.0" license.workspace = true edition.workspace = true -[lib] -bench = false - [dependencies] anyhow = "1.0" hyper = { version = "1.6", features = ["http1"] } diff --git a/crates/datadog-trace-agent/Cargo.toml b/crates/datadog-trace-agent/Cargo.toml index 79e4843..4247c2b 100644 --- a/crates/datadog-trace-agent/Cargo.toml +++ b/crates/datadog-trace-agent/Cargo.toml @@ -4,9 +4,6 @@ version = "0.1.0" license.workspace = true edition.workspace = true -[lib] -bench = false - [dependencies] anyhow = "1.0" hyper = { version = "1.6", features = ["http1", "client", "server"] } diff --git a/crates/dogstatsd/Cargo.toml b/crates/dogstatsd/Cargo.toml index 14f7255..88acad1 100644 --- a/crates/dogstatsd/Cargo.toml +++ b/crates/dogstatsd/Cargo.toml @@ -4,9 +4,6 @@ version = "0.1.0" edition.workspace = true license.workspace = true -[lib] -bench = false - [dependencies] datadog-protos = { version = "0.1.0", default-features = false, git = "https://github.com/DataDog/saluki/", rev = "f863626dbfe3c59bb390985fa6530b0621c2a0a2" } ddsketch-agent = { version = "0.1.0", default-features = false, git = "https://github.com/DataDog/saluki/", rev = "f863626dbfe3c59bb390985fa6530b0621c2a0a2" }