From 4e13ea3beef7ed6ecddcaf792e22e18f46f5be41 Mon Sep 17 00:00:00 2001 From: Kathie Huang Date: Wed, 8 Apr 2026 11:37:40 -0400 Subject: [PATCH 1/9] Check for multiple cloud-specific environment variables to detect environment --- libdd-trace-utils/src/config_utils.rs | 262 ++++++++++++++++++++++++-- 1 file changed, 247 insertions(+), 15 deletions(-) diff --git a/libdd-trace-utils/src/config_utils.rs b/libdd-trace-utils/src/config_utils.rs index e071072f18..8daa672a82 100644 --- a/libdd-trace-utils/src/config_utils.rs +++ b/libdd-trace-utils/src/config_utils.rs @@ -3,6 +3,7 @@ use crate::trace_utils; use std::env; +use tracing::{debug, error}; pub const PROD_INTAKE_SUBDOMAIN: &str = "trace.agent"; @@ -10,26 +11,63 @@ const TRACE_INTAKE_ROUTE: &str = "/api/v0.2/traces"; const TRACE_STATS_INTAKE_ROUTE: &str = "/api/v0.2/stats"; pub fn read_cloud_env() -> Option<(String, trace_utils::EnvironmentType)> { - if let Ok(res) = env::var("AWS_LAMBDA_FUNCTION_NAME") { - return Some((res, trace_utils::EnvironmentType::LambdaFunction)); - } - if let Ok(res) = env::var("K_SERVICE") { - // Set by Google Cloud Functions for newer runtimes - return Some((res, trace_utils::EnvironmentType::CloudFunction)); + let mut detected: Vec<(String, trace_utils::EnvironmentType)> = Vec::new(); + + if env::var("AWS_LAMBDA_INITIALIZATION_TYPE").is_ok() { + match env::var("AWS_LAMBDA_FUNCTION_NAME") { + Ok(name) => detected.push((name, trace_utils::EnvironmentType::LambdaFunction)), + Err(_) => { + error!("AWS Lambda environment detected but AWS_LAMBDA_FUNCTION_NAME is not set") + } + } } - if let Ok(res) = env::var("FUNCTION_NAME") { - // Set by Google Cloud Functions for older runtimes - return Some((res, trace_utils::EnvironmentType::CloudFunction)); + + if env::var("FUNCTIONS_EXTENSION_VERSION").is_ok() + && env::var("FUNCTIONS_WORKER_RUNTIME").is_ok() + { + match env::var("WEBSITE_SITE_NAME") { + Ok(name) => detected.push((name, trace_utils::EnvironmentType::AzureFunction)), + Err(_) => { + error!("Azure Functions environment detected but WEBSITE_SITE_NAME is not set") + } + } } - if let Ok(res) = env::var("WEBSITE_SITE_NAME") { - // Set by Azure Functions - return Some((res, trace_utils::EnvironmentType::AzureFunction)); + + if let (Ok(name), Ok(_)) = (env::var("K_SERVICE"), env::var("FUNCTION_TARGET")) { + // Set by Google Cloud Run Functions Gen 2 + detected.push((name, trace_utils::EnvironmentType::CloudFunction)); + } else if let (Ok(name), Ok(_)) = (env::var("FUNCTION_NAME"), env::var("GCP_PROJECT")) { + // Set by Google Cloud Functions Gen 1 + detected.push((name, trace_utils::EnvironmentType::CloudFunction)); } - if let Ok(res) = env::var("ASCSVCRT_SPRING__APPLICATION__NAME") { + + if let Ok(name) = env::var("ASCSVCRT_SPRING__APPLICATION__NAME") { // Set by Azure Spring Apps - return Some((res, trace_utils::EnvironmentType::AzureSpringApp)); + detected.push((name, trace_utils::EnvironmentType::AzureSpringApp)); + } + + match detected.len() { + 0 => { + error!("No cloud environment detected"); + None + } + 1 => { + let (ref name, ref env_type) = detected[0]; + debug!("Cloud environment detected: {env_type:?}({name})"); + detected.into_iter().next() + } + _ => { + let env_names: Vec = detected + .iter() + .map(|(name, env_type)| format!("{env_type:?}({name})")) + .collect(); + error!( + "Multiple cloud environments detected: {}", + env_names.join(", ") + ); + None + } } - None } pub fn trace_intake_url(site: &str) -> String { @@ -51,3 +89,197 @@ pub fn trace_stats_url_prefixed(endpoint_prefix: &str) -> String { fn construct_trace_intake_url(prefix: &str, route: &str) -> String { format!("https://{PROD_INTAKE_SUBDOMAIN}.{prefix}{route}") } + +#[cfg(test)] +mod tests { + use super::*; + + const ALL_VARS: &[&str] = &[ + "AWS_LAMBDA_INITIALIZATION_TYPE", + "AWS_LAMBDA_FUNCTION_NAME", + "FUNCTIONS_EXTENSION_VERSION", + "FUNCTIONS_WORKER_RUNTIME", + "WEBSITE_SITE_NAME", + "FUNCTION_NAME", + "GCP_PROJECT", + "K_SERVICE", + "FUNCTION_TARGET", + "ASCSVCRT_SPRING__APPLICATION__NAME", + ]; + + /// RAII guard that restores an environment variable to its previous value when dropped. + struct EnvGuard { + key: &'static str, + saved: Option, + } + + impl EnvGuard { + fn set(key: &'static str, value: &str) -> Self { + let saved = env::var(key).ok(); + unsafe { env::set_var(key, value) }; + EnvGuard { key, saved } + } + + fn remove(key: &'static str) -> Self { + let saved = env::var(key).ok(); + unsafe { env::remove_var(key) }; + EnvGuard { key, saved } + } + } + + impl Drop for EnvGuard { + fn drop(&mut self) { + match &self.saved { + Some(s) => unsafe { env::set_var(self.key, s) }, + None => unsafe { env::remove_var(self.key) }, + } + } + } + + fn clear_all_env_vars() -> Vec { + ALL_VARS.iter().map(|k| EnvGuard::remove(k)).collect() + } + + #[test] + fn test_aws_lambda_detected() { + let _guards = clear_all_env_vars(); + let _init = EnvGuard::set("AWS_LAMBDA_INITIALIZATION_TYPE", "on-demand"); + let _name = EnvGuard::set("AWS_LAMBDA_FUNCTION_NAME", "my-function"); + let result = read_cloud_env(); + assert_eq!( + result, + Some(( + "my-function".to_string(), + trace_utils::EnvironmentType::LambdaFunction + )) + ); + } + + #[test] + fn test_aws_lambda_missing_function_name() { + let _guards = clear_all_env_vars(); + let _init = EnvGuard::set("AWS_LAMBDA_INITIALIZATION_TYPE", "on-demand"); + let result = read_cloud_env(); + assert_eq!(result, None); + } + + #[test] + fn test_aws_lambda_not_detected_without_init_type() { + let _guards = clear_all_env_vars(); + let _name = EnvGuard::set("AWS_LAMBDA_FUNCTION_NAME", "my-function"); + let result = read_cloud_env(); + assert_eq!(result, None); + } + + #[test] + fn test_azure_function_detected() { + let _guards = clear_all_env_vars(); + let _ext = EnvGuard::set("FUNCTIONS_EXTENSION_VERSION", "~4"); + let _rt = EnvGuard::set("FUNCTIONS_WORKER_RUNTIME", "java"); + let _site = EnvGuard::set("WEBSITE_SITE_NAME", "my-azure-app"); + let result = read_cloud_env(); + assert_eq!( + result, + Some(( + "my-azure-app".to_string(), + trace_utils::EnvironmentType::AzureFunction + )) + ); + } + + #[test] + fn test_azure_function_missing_site_name() { + let _guards = clear_all_env_vars(); + let _ext = EnvGuard::set("FUNCTIONS_EXTENSION_VERSION", "~4"); + let _rt = EnvGuard::set("FUNCTIONS_WORKER_RUNTIME", "java"); + let result = read_cloud_env(); + assert_eq!(result, None); + } + + #[test] + fn test_azure_function_not_detected_with_only_one_var() { + let _guards = clear_all_env_vars(); + let _ext = EnvGuard::set("FUNCTIONS_EXTENSION_VERSION", "~4"); + let result = read_cloud_env(); + assert_eq!(result, None); + } + + #[test] + fn test_gcp_1st_gen_detected() { + let _guards = clear_all_env_vars(); + let _name = EnvGuard::set("FUNCTION_NAME", "my-gcp-function"); + let _project = EnvGuard::set("GCP_PROJECT", "my-project"); + let result = read_cloud_env(); + assert_eq!( + result, + Some(( + "my-gcp-function".to_string(), + trace_utils::EnvironmentType::CloudFunction + )) + ); + } + + #[test] + fn test_gcp_1st_gen_not_detected_without_gcp_project() { + let _guards = clear_all_env_vars(); + let _name = EnvGuard::set("FUNCTION_NAME", "my-gcp-function"); + let result = read_cloud_env(); + assert_eq!(result, None); + } + + #[test] + fn test_gcp_2nd_gen_detected() { + let _guards = clear_all_env_vars(); + let _service = EnvGuard::set("K_SERVICE", "my-cloud-run-fn"); + let _target = EnvGuard::set("FUNCTION_TARGET", "myHandler"); + let result = read_cloud_env(); + assert_eq!( + result, + Some(( + "my-cloud-run-fn".to_string(), + trace_utils::EnvironmentType::CloudFunction + )) + ); + } + + #[test] + fn test_gcp_2nd_gen_not_detected_without_function_target() { + let _guards = clear_all_env_vars(); + let _service = EnvGuard::set("K_SERVICE", "my-cloud-run-fn"); + let result = read_cloud_env(); + assert_eq!(result, None); + } + + #[test] + fn test_azure_spring_app_detected() { + let _guards = clear_all_env_vars(); + let _app = EnvGuard::set("ASCSVCRT_SPRING__APPLICATION__NAME", "my-spring-app"); + let result = read_cloud_env(); + assert_eq!( + result, + Some(( + "my-spring-app".to_string(), + trace_utils::EnvironmentType::AzureSpringApp + )) + ); + } + + #[test] + fn test_no_environment_detected() { + let _guards = clear_all_env_vars(); + let result = read_cloud_env(); + assert_eq!(result, None); + } + + #[test] + fn test_multiple_environments_returns_none() { + let _guards = clear_all_env_vars(); + let _init = EnvGuard::set("AWS_LAMBDA_INITIALIZATION_TYPE", "on-demand"); + let _fn_name = EnvGuard::set("AWS_LAMBDA_FUNCTION_NAME", "my-lambda"); + let _ext = EnvGuard::set("FUNCTIONS_EXTENSION_VERSION", "~4"); + let _rt = EnvGuard::set("FUNCTIONS_WORKER_RUNTIME", "java"); + let _site = EnvGuard::set("WEBSITE_SITE_NAME", "my-azure-app"); + let result = read_cloud_env(); + assert_eq!(result, None); + } +} From 89fcc56d6f80054ac2c69bca2170e1408a4bbbae Mon Sep 17 00:00:00 2001 From: Kathie Huang Date: Wed, 8 Apr 2026 14:23:01 -0400 Subject: [PATCH 2/9] Fix syntax --- libdd-trace-utils/src/config_utils.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libdd-trace-utils/src/config_utils.rs b/libdd-trace-utils/src/config_utils.rs index 8daa672a82..ec1a3cdad6 100644 --- a/libdd-trace-utils/src/config_utils.rs +++ b/libdd-trace-utils/src/config_utils.rs @@ -17,7 +17,7 @@ pub fn read_cloud_env() -> Option<(String, trace_utils::EnvironmentType)> { match env::var("AWS_LAMBDA_FUNCTION_NAME") { Ok(name) => detected.push((name, trace_utils::EnvironmentType::LambdaFunction)), Err(_) => { - error!("AWS Lambda environment detected but AWS_LAMBDA_FUNCTION_NAME is not set") + error!("AWS Lambda environment detected but AWS_LAMBDA_FUNCTION_NAME is not set"); } } } @@ -28,7 +28,7 @@ pub fn read_cloud_env() -> Option<(String, trace_utils::EnvironmentType)> { match env::var("WEBSITE_SITE_NAME") { Ok(name) => detected.push((name, trace_utils::EnvironmentType::AzureFunction)), Err(_) => { - error!("Azure Functions environment detected but WEBSITE_SITE_NAME is not set") + error!("Azure Functions environment detected but WEBSITE_SITE_NAME is not set"); } } } From a1b3fea6a9784c9e74f2f8d93fce96e036f98ae0 Mon Sep 17 00:00:00 2001 From: Kathie Huang Date: Wed, 8 Apr 2026 14:45:36 -0400 Subject: [PATCH 3/9] Serialize unit tests so they don't run concurrently --- libdd-trace-utils/Cargo.toml | 1 + libdd-trace-utils/src/config_utils.rs | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/libdd-trace-utils/Cargo.toml b/libdd-trace-utils/Cargo.toml index 0253160853..874d7d4166 100644 --- a/libdd-trace-utils/Cargo.toml +++ b/libdd-trace-utils/Cargo.toml @@ -72,6 +72,7 @@ httpmock = { version = "0.8.0-alpha.1" } serde_json = "1.0" tokio = { version = "1", features = ["macros", "rt-multi-thread"] } libdd-trace-utils = { path = ".", features = ["test-utils"] } +serial_test = "3.2" tempfile = "3.3.0" [features] diff --git a/libdd-trace-utils/src/config_utils.rs b/libdd-trace-utils/src/config_utils.rs index ec1a3cdad6..d3f959960c 100644 --- a/libdd-trace-utils/src/config_utils.rs +++ b/libdd-trace-utils/src/config_utils.rs @@ -141,6 +141,7 @@ mod tests { } #[test] + #[serial_test::serial] fn test_aws_lambda_detected() { let _guards = clear_all_env_vars(); let _init = EnvGuard::set("AWS_LAMBDA_INITIALIZATION_TYPE", "on-demand"); @@ -156,6 +157,7 @@ mod tests { } #[test] + #[serial_test::serial] fn test_aws_lambda_missing_function_name() { let _guards = clear_all_env_vars(); let _init = EnvGuard::set("AWS_LAMBDA_INITIALIZATION_TYPE", "on-demand"); @@ -164,6 +166,7 @@ mod tests { } #[test] + #[serial_test::serial] fn test_aws_lambda_not_detected_without_init_type() { let _guards = clear_all_env_vars(); let _name = EnvGuard::set("AWS_LAMBDA_FUNCTION_NAME", "my-function"); @@ -172,6 +175,7 @@ mod tests { } #[test] + #[serial_test::serial] fn test_azure_function_detected() { let _guards = clear_all_env_vars(); let _ext = EnvGuard::set("FUNCTIONS_EXTENSION_VERSION", "~4"); @@ -188,6 +192,7 @@ mod tests { } #[test] + #[serial_test::serial] fn test_azure_function_missing_site_name() { let _guards = clear_all_env_vars(); let _ext = EnvGuard::set("FUNCTIONS_EXTENSION_VERSION", "~4"); @@ -197,6 +202,7 @@ mod tests { } #[test] + #[serial_test::serial] fn test_azure_function_not_detected_with_only_one_var() { let _guards = clear_all_env_vars(); let _ext = EnvGuard::set("FUNCTIONS_EXTENSION_VERSION", "~4"); @@ -205,6 +211,7 @@ mod tests { } #[test] + #[serial_test::serial] fn test_gcp_1st_gen_detected() { let _guards = clear_all_env_vars(); let _name = EnvGuard::set("FUNCTION_NAME", "my-gcp-function"); @@ -220,6 +227,7 @@ mod tests { } #[test] + #[serial_test::serial] fn test_gcp_1st_gen_not_detected_without_gcp_project() { let _guards = clear_all_env_vars(); let _name = EnvGuard::set("FUNCTION_NAME", "my-gcp-function"); @@ -228,6 +236,7 @@ mod tests { } #[test] + #[serial_test::serial] fn test_gcp_2nd_gen_detected() { let _guards = clear_all_env_vars(); let _service = EnvGuard::set("K_SERVICE", "my-cloud-run-fn"); @@ -243,6 +252,7 @@ mod tests { } #[test] + #[serial_test::serial] fn test_gcp_2nd_gen_not_detected_without_function_target() { let _guards = clear_all_env_vars(); let _service = EnvGuard::set("K_SERVICE", "my-cloud-run-fn"); @@ -251,6 +261,7 @@ mod tests { } #[test] + #[serial_test::serial] fn test_azure_spring_app_detected() { let _guards = clear_all_env_vars(); let _app = EnvGuard::set("ASCSVCRT_SPRING__APPLICATION__NAME", "my-spring-app"); @@ -265,6 +276,7 @@ mod tests { } #[test] + #[serial_test::serial] fn test_no_environment_detected() { let _guards = clear_all_env_vars(); let result = read_cloud_env(); @@ -272,6 +284,7 @@ mod tests { } #[test] + #[serial_test::serial] fn test_multiple_environments_returns_none() { let _guards = clear_all_env_vars(); let _init = EnvGuard::set("AWS_LAMBDA_INITIALIZATION_TYPE", "on-demand"); From 47a7c91384148c027ebb0d091c390ca125c6e50e Mon Sep 17 00:00:00 2001 From: Kathie Huang Date: Wed, 8 Apr 2026 16:39:21 -0400 Subject: [PATCH 4/9] Update Cargo.lock --- Cargo.lock | 1 + 1 file changed, 1 insertion(+) diff --git a/Cargo.lock b/Cargo.lock index f2783f39a4..21847f436e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3378,6 +3378,7 @@ dependencies = [ "rmpv", "serde", "serde_json", + "serial_test", "tempfile", "tokio", "tracing", From 4bb7666e03ef9cee897541da1c7841c1aee3e419 Mon Sep 17 00:00:00 2001 From: Kathie Huang Date: Thu, 9 Apr 2026 16:44:38 -0400 Subject: [PATCH 5/9] Add debug log --- libdd-trace-utils/src/config_utils.rs | 5 +- .../Debug/net7.0/libdatadog.AssemblyInfo.cs | 25 ++++++ .../libdatadog.AssemblyInfoInputs.cache | 1 + ....GeneratedMSBuildEditorConfig.editorconfig | 17 ++++ .../obj/Debug/net7.0/libdatadog.assets.cache | Bin 0 -> 157 bytes .../obj/libdatadog.csproj.nuget.dgspec.json | 78 ++++++++++++++++ windows/obj/libdatadog.csproj.nuget.g.props | 15 ++++ windows/obj/libdatadog.csproj.nuget.g.targets | 2 + windows/obj/project.assets.json | 83 ++++++++++++++++++ windows/obj/project.nuget.cache | 11 +++ 10 files changed, 236 insertions(+), 1 deletion(-) create mode 100644 windows/obj/Debug/net7.0/libdatadog.AssemblyInfo.cs create mode 100644 windows/obj/Debug/net7.0/libdatadog.AssemblyInfoInputs.cache create mode 100644 windows/obj/Debug/net7.0/libdatadog.GeneratedMSBuildEditorConfig.editorconfig create mode 100644 windows/obj/Debug/net7.0/libdatadog.assets.cache create mode 100644 windows/obj/libdatadog.csproj.nuget.dgspec.json create mode 100644 windows/obj/libdatadog.csproj.nuget.g.props create mode 100644 windows/obj/libdatadog.csproj.nuget.g.targets create mode 100644 windows/obj/project.assets.json create mode 100644 windows/obj/project.nuget.cache diff --git a/libdd-trace-utils/src/config_utils.rs b/libdd-trace-utils/src/config_utils.rs index d3f959960c..494d293a08 100644 --- a/libdd-trace-utils/src/config_utils.rs +++ b/libdd-trace-utils/src/config_utils.rs @@ -11,6 +11,7 @@ const TRACE_INTAKE_ROUTE: &str = "/api/v0.2/traces"; const TRACE_STATS_INTAKE_ROUTE: &str = "/api/v0.2/stats"; pub fn read_cloud_env() -> Option<(String, trace_utils::EnvironmentType)> { + debug!("In libdatadog read_cloud_env"); let mut detected: Vec<(String, trace_utils::EnvironmentType)> = Vec::new(); if env::var("AWS_LAMBDA_INITIALIZATION_TYPE").is_ok() { @@ -35,9 +36,11 @@ pub fn read_cloud_env() -> Option<(String, trace_utils::EnvironmentType)> { if let (Ok(name), Ok(_)) = (env::var("K_SERVICE"), env::var("FUNCTION_TARGET")) { // Set by Google Cloud Run Functions Gen 2 + debug!("Detected Cloud Function gen 2"); detected.push((name, trace_utils::EnvironmentType::CloudFunction)); } else if let (Ok(name), Ok(_)) = (env::var("FUNCTION_NAME"), env::var("GCP_PROJECT")) { // Set by Google Cloud Functions Gen 1 + debug!("Detected Cloud Function gen 1"); detected.push((name, trace_utils::EnvironmentType::CloudFunction)); } @@ -53,7 +56,7 @@ pub fn read_cloud_env() -> Option<(String, trace_utils::EnvironmentType)> { } 1 => { let (ref name, ref env_type) = detected[0]; - debug!("Cloud environment detected: {env_type:?}({name})"); + debug!("Cloud environment detected: {env_type:?} ({name})"); detected.into_iter().next() } _ => { diff --git a/windows/obj/Debug/net7.0/libdatadog.AssemblyInfo.cs b/windows/obj/Debug/net7.0/libdatadog.AssemblyInfo.cs new file mode 100644 index 0000000000..95a1560bac --- /dev/null +++ b/windows/obj/Debug/net7.0/libdatadog.AssemblyInfo.cs @@ -0,0 +1,25 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("Datadog")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyCopyrightAttribute("Copyright 2022 Datadog, Inc.")] +[assembly: System.Reflection.AssemblyDescriptionAttribute(("libdatadog provides a shared library containing common code used in the\n imp" + + "lementation of Datadog\'s libraries, including Datadog Continuous Profilers"))] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+47a7c91384148c027ebb0d091c390ca125c6e50e")] +[assembly: System.Reflection.AssemblyProductAttribute("libdatadog")] +[assembly: System.Reflection.AssemblyTitleAttribute("libdatadog")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Generated by the MSBuild WriteCodeFragment class. + diff --git a/windows/obj/Debug/net7.0/libdatadog.AssemblyInfoInputs.cache b/windows/obj/Debug/net7.0/libdatadog.AssemblyInfoInputs.cache new file mode 100644 index 0000000000..b97fa84ea3 --- /dev/null +++ b/windows/obj/Debug/net7.0/libdatadog.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +6ea5f05c102110ffbc4ab3be4732b2518ae955574b505e2b2087f5f3424a1e13 diff --git a/windows/obj/Debug/net7.0/libdatadog.GeneratedMSBuildEditorConfig.editorconfig b/windows/obj/Debug/net7.0/libdatadog.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000000..e9b9751990 --- /dev/null +++ b/windows/obj/Debug/net7.0/libdatadog.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,17 @@ +is_global = true +build_property.TargetFramework = net7.0 +build_property.TargetFrameworkIdentifier = .NETCoreApp +build_property.TargetFrameworkVersion = v7.0 +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = libdatadog +build_property.ProjectDir = /Users/kathie.huang/go/src/github.com/DataDog/libdatadog/windows/ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.EffectiveAnalysisLevelStyle = 7.0 +build_property.EnableCodeStyleSeverity = diff --git a/windows/obj/Debug/net7.0/libdatadog.assets.cache b/windows/obj/Debug/net7.0/libdatadog.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..a16c589ed6eafc119ec034e0667211952caa090a GIT binary patch literal 157 zcmWIWc6a1qU|^WKIedomr-uR0G}9Ru{J4K$NmbG3e~Z++51#(>B7|2mcP3B`v49b% sP(?qqIJKx)KRdA`BQsSmqckxuU0*M+G(ELMzaTL=J25@ASf7xA08IWNsQ>@~ literal 0 HcmV?d00001 diff --git a/windows/obj/libdatadog.csproj.nuget.dgspec.json b/windows/obj/libdatadog.csproj.nuget.dgspec.json new file mode 100644 index 0000000000..cfeeaef42f --- /dev/null +++ b/windows/obj/libdatadog.csproj.nuget.dgspec.json @@ -0,0 +1,78 @@ +{ + "format": 1, + "restore": { + "/Users/kathie.huang/go/src/github.com/DataDog/libdatadog/windows/libdatadog.csproj": {} + }, + "projects": { + "/Users/kathie.huang/go/src/github.com/DataDog/libdatadog/windows/libdatadog.csproj": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/Users/kathie.huang/go/src/github.com/DataDog/libdatadog/windows/libdatadog.csproj", + "projectName": "libdatadog", + "projectPath": "/Users/kathie.huang/go/src/github.com/DataDog/libdatadog/windows/libdatadog.csproj", + "packagesPath": "/Users/kathie.huang/.nuget/packages/", + "outputPath": "/Users/kathie.huang/go/src/github.com/DataDog/libdatadog/windows/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/Users/kathie.huang/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net7.0" + ], + "sources": { + "/Users/kathie.huang/dd/serverless-compat-self-monitoring/libs/datadog-serverless-compat-dotnet": {}, + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net7.0": { + "targetAlias": "net7.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.100" + }, + "frameworks": { + "net7.0": { + "targetAlias": "net7.0", + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Ref", + "version": "[7.0.20, 7.0.20]" + }, + { + "name": "Microsoft.NETCore.App.Ref", + "version": "[7.0.20, 7.0.20]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/10.0.102/RuntimeIdentifierGraph.json" + } + } + } + } +} \ No newline at end of file diff --git a/windows/obj/libdatadog.csproj.nuget.g.props b/windows/obj/libdatadog.csproj.nuget.g.props new file mode 100644 index 0000000000..3e31e53b27 --- /dev/null +++ b/windows/obj/libdatadog.csproj.nuget.g.props @@ -0,0 +1,15 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + /Users/kathie.huang/.nuget/packages/ + /Users/kathie.huang/.nuget/packages/ + PackageReference + 7.0.0 + + + + + \ No newline at end of file diff --git a/windows/obj/libdatadog.csproj.nuget.g.targets b/windows/obj/libdatadog.csproj.nuget.g.targets new file mode 100644 index 0000000000..3dc06ef3cc --- /dev/null +++ b/windows/obj/libdatadog.csproj.nuget.g.targets @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/windows/obj/project.assets.json b/windows/obj/project.assets.json new file mode 100644 index 0000000000..394c494b5d --- /dev/null +++ b/windows/obj/project.assets.json @@ -0,0 +1,83 @@ +{ + "version": 3, + "targets": { + "net7.0": {} + }, + "libraries": {}, + "projectFileDependencyGroups": { + "net7.0": [] + }, + "packageFolders": { + "/Users/kathie.huang/.nuget/packages/": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/Users/kathie.huang/go/src/github.com/DataDog/libdatadog/windows/libdatadog.csproj", + "projectName": "libdatadog", + "projectPath": "/Users/kathie.huang/go/src/github.com/DataDog/libdatadog/windows/libdatadog.csproj", + "packagesPath": "/Users/kathie.huang/.nuget/packages/", + "outputPath": "/Users/kathie.huang/go/src/github.com/DataDog/libdatadog/windows/obj/", + "projectStyle": "PackageReference", + "configFilePaths": [ + "/Users/kathie.huang/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "net7.0" + ], + "sources": { + "/Users/kathie.huang/dd/serverless-compat-self-monitoring/libs/datadog-serverless-compat-dotnet": {}, + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "net7.0": { + "targetAlias": "net7.0", + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + }, + "restoreAuditProperties": { + "enableAudit": "true", + "auditLevel": "low", + "auditMode": "direct" + }, + "SdkAnalysisLevel": "10.0.100" + }, + "frameworks": { + "net7.0": { + "targetAlias": "net7.0", + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48", + "net481" + ], + "assetTargetFallback": true, + "warn": true, + "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Ref", + "version": "[7.0.20, 7.0.20]" + }, + { + "name": "Microsoft.NETCore.App.Ref", + "version": "[7.0.20, 7.0.20]" + } + ], + "frameworkReferences": { + "Microsoft.NETCore.App": { + "privateAssets": "all" + } + }, + "runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/10.0.102/RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/windows/obj/project.nuget.cache b/windows/obj/project.nuget.cache new file mode 100644 index 0000000000..0b594789fb --- /dev/null +++ b/windows/obj/project.nuget.cache @@ -0,0 +1,11 @@ +{ + "version": 2, + "dgSpecHash": "zShLRmrcF7A=", + "success": true, + "projectFilePath": "/Users/kathie.huang/go/src/github.com/DataDog/libdatadog/windows/libdatadog.csproj", + "expectedPackageFiles": [ + "/Users/kathie.huang/.nuget/packages/microsoft.netcore.app.ref/7.0.20/microsoft.netcore.app.ref.7.0.20.nupkg.sha512", + "/Users/kathie.huang/.nuget/packages/microsoft.aspnetcore.app.ref/7.0.20/microsoft.aspnetcore.app.ref.7.0.20.nupkg.sha512" + ], + "logs": [] +} \ No newline at end of file From f7987e8a0c4e2658caf27658309112033d07b6e9 Mon Sep 17 00:00:00 2001 From: Kathie Huang Date: Thu, 9 Apr 2026 17:16:52 -0400 Subject: [PATCH 6/9] Remove debug log --- libdd-trace-utils/src/config_utils.rs | 3 - .../Debug/net7.0/libdatadog.AssemblyInfo.cs | 25 ------ .../libdatadog.AssemblyInfoInputs.cache | 1 - ....GeneratedMSBuildEditorConfig.editorconfig | 17 ---- .../obj/Debug/net7.0/libdatadog.assets.cache | Bin 157 -> 0 bytes .../obj/libdatadog.csproj.nuget.dgspec.json | 78 ---------------- windows/obj/libdatadog.csproj.nuget.g.props | 15 ---- windows/obj/libdatadog.csproj.nuget.g.targets | 2 - windows/obj/project.assets.json | 83 ------------------ windows/obj/project.nuget.cache | 11 --- 10 files changed, 235 deletions(-) delete mode 100644 windows/obj/Debug/net7.0/libdatadog.AssemblyInfo.cs delete mode 100644 windows/obj/Debug/net7.0/libdatadog.AssemblyInfoInputs.cache delete mode 100644 windows/obj/Debug/net7.0/libdatadog.GeneratedMSBuildEditorConfig.editorconfig delete mode 100644 windows/obj/Debug/net7.0/libdatadog.assets.cache delete mode 100644 windows/obj/libdatadog.csproj.nuget.dgspec.json delete mode 100644 windows/obj/libdatadog.csproj.nuget.g.props delete mode 100644 windows/obj/libdatadog.csproj.nuget.g.targets delete mode 100644 windows/obj/project.assets.json delete mode 100644 windows/obj/project.nuget.cache diff --git a/libdd-trace-utils/src/config_utils.rs b/libdd-trace-utils/src/config_utils.rs index 494d293a08..06a044526a 100644 --- a/libdd-trace-utils/src/config_utils.rs +++ b/libdd-trace-utils/src/config_utils.rs @@ -11,7 +11,6 @@ const TRACE_INTAKE_ROUTE: &str = "/api/v0.2/traces"; const TRACE_STATS_INTAKE_ROUTE: &str = "/api/v0.2/stats"; pub fn read_cloud_env() -> Option<(String, trace_utils::EnvironmentType)> { - debug!("In libdatadog read_cloud_env"); let mut detected: Vec<(String, trace_utils::EnvironmentType)> = Vec::new(); if env::var("AWS_LAMBDA_INITIALIZATION_TYPE").is_ok() { @@ -36,11 +35,9 @@ pub fn read_cloud_env() -> Option<(String, trace_utils::EnvironmentType)> { if let (Ok(name), Ok(_)) = (env::var("K_SERVICE"), env::var("FUNCTION_TARGET")) { // Set by Google Cloud Run Functions Gen 2 - debug!("Detected Cloud Function gen 2"); detected.push((name, trace_utils::EnvironmentType::CloudFunction)); } else if let (Ok(name), Ok(_)) = (env::var("FUNCTION_NAME"), env::var("GCP_PROJECT")) { // Set by Google Cloud Functions Gen 1 - debug!("Detected Cloud Function gen 1"); detected.push((name, trace_utils::EnvironmentType::CloudFunction)); } diff --git a/windows/obj/Debug/net7.0/libdatadog.AssemblyInfo.cs b/windows/obj/Debug/net7.0/libdatadog.AssemblyInfo.cs deleted file mode 100644 index 95a1560bac..0000000000 --- a/windows/obj/Debug/net7.0/libdatadog.AssemblyInfo.cs +++ /dev/null @@ -1,25 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.Reflection; - -[assembly: System.Reflection.AssemblyCompanyAttribute("Datadog")] -[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] -[assembly: System.Reflection.AssemblyCopyrightAttribute("Copyright 2022 Datadog, Inc.")] -[assembly: System.Reflection.AssemblyDescriptionAttribute(("libdatadog provides a shared library containing common code used in the\n imp" + - "lementation of Datadog\'s libraries, including Datadog Continuous Profilers"))] -[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+47a7c91384148c027ebb0d091c390ca125c6e50e")] -[assembly: System.Reflection.AssemblyProductAttribute("libdatadog")] -[assembly: System.Reflection.AssemblyTitleAttribute("libdatadog")] -[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] - -// Generated by the MSBuild WriteCodeFragment class. - diff --git a/windows/obj/Debug/net7.0/libdatadog.AssemblyInfoInputs.cache b/windows/obj/Debug/net7.0/libdatadog.AssemblyInfoInputs.cache deleted file mode 100644 index b97fa84ea3..0000000000 --- a/windows/obj/Debug/net7.0/libdatadog.AssemblyInfoInputs.cache +++ /dev/null @@ -1 +0,0 @@ -6ea5f05c102110ffbc4ab3be4732b2518ae955574b505e2b2087f5f3424a1e13 diff --git a/windows/obj/Debug/net7.0/libdatadog.GeneratedMSBuildEditorConfig.editorconfig b/windows/obj/Debug/net7.0/libdatadog.GeneratedMSBuildEditorConfig.editorconfig deleted file mode 100644 index e9b9751990..0000000000 --- a/windows/obj/Debug/net7.0/libdatadog.GeneratedMSBuildEditorConfig.editorconfig +++ /dev/null @@ -1,17 +0,0 @@ -is_global = true -build_property.TargetFramework = net7.0 -build_property.TargetFrameworkIdentifier = .NETCoreApp -build_property.TargetFrameworkVersion = v7.0 -build_property.TargetPlatformMinVersion = -build_property.UsingMicrosoftNETSdkWeb = -build_property.ProjectTypeGuids = -build_property.InvariantGlobalization = -build_property.PlatformNeutralAssembly = -build_property.EnforceExtendedAnalyzerRules = -build_property._SupportedPlatformList = Linux,macOS,Windows -build_property.RootNamespace = libdatadog -build_property.ProjectDir = /Users/kathie.huang/go/src/github.com/DataDog/libdatadog/windows/ -build_property.EnableComHosting = -build_property.EnableGeneratedComInterfaceComImportInterop = -build_property.EffectiveAnalysisLevelStyle = 7.0 -build_property.EnableCodeStyleSeverity = diff --git a/windows/obj/Debug/net7.0/libdatadog.assets.cache b/windows/obj/Debug/net7.0/libdatadog.assets.cache deleted file mode 100644 index a16c589ed6eafc119ec034e0667211952caa090a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmWIWc6a1qU|^WKIedomr-uR0G}9Ru{J4K$NmbG3e~Z++51#(>B7|2mcP3B`v49b% sP(?qqIJKx)KRdA`BQsSmqckxuU0*M+G(ELMzaTL=J25@ASf7xA08IWNsQ>@~ diff --git a/windows/obj/libdatadog.csproj.nuget.dgspec.json b/windows/obj/libdatadog.csproj.nuget.dgspec.json deleted file mode 100644 index cfeeaef42f..0000000000 --- a/windows/obj/libdatadog.csproj.nuget.dgspec.json +++ /dev/null @@ -1,78 +0,0 @@ -{ - "format": 1, - "restore": { - "/Users/kathie.huang/go/src/github.com/DataDog/libdatadog/windows/libdatadog.csproj": {} - }, - "projects": { - "/Users/kathie.huang/go/src/github.com/DataDog/libdatadog/windows/libdatadog.csproj": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "/Users/kathie.huang/go/src/github.com/DataDog/libdatadog/windows/libdatadog.csproj", - "projectName": "libdatadog", - "projectPath": "/Users/kathie.huang/go/src/github.com/DataDog/libdatadog/windows/libdatadog.csproj", - "packagesPath": "/Users/kathie.huang/.nuget/packages/", - "outputPath": "/Users/kathie.huang/go/src/github.com/DataDog/libdatadog/windows/obj/", - "projectStyle": "PackageReference", - "configFilePaths": [ - "/Users/kathie.huang/.nuget/NuGet/NuGet.Config" - ], - "originalTargetFrameworks": [ - "net7.0" - ], - "sources": { - "/Users/kathie.huang/dd/serverless-compat-self-monitoring/libs/datadog-serverless-compat-dotnet": {}, - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net7.0": { - "targetAlias": "net7.0", - "projectReferences": {} - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - }, - "restoreAuditProperties": { - "enableAudit": "true", - "auditLevel": "low", - "auditMode": "direct" - }, - "SdkAnalysisLevel": "10.0.100" - }, - "frameworks": { - "net7.0": { - "targetAlias": "net7.0", - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "downloadDependencies": [ - { - "name": "Microsoft.AspNetCore.App.Ref", - "version": "[7.0.20, 7.0.20]" - }, - { - "name": "Microsoft.NETCore.App.Ref", - "version": "[7.0.20, 7.0.20]" - } - ], - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/10.0.102/RuntimeIdentifierGraph.json" - } - } - } - } -} \ No newline at end of file diff --git a/windows/obj/libdatadog.csproj.nuget.g.props b/windows/obj/libdatadog.csproj.nuget.g.props deleted file mode 100644 index 3e31e53b27..0000000000 --- a/windows/obj/libdatadog.csproj.nuget.g.props +++ /dev/null @@ -1,15 +0,0 @@ - - - - True - NuGet - $(MSBuildThisFileDirectory)project.assets.json - /Users/kathie.huang/.nuget/packages/ - /Users/kathie.huang/.nuget/packages/ - PackageReference - 7.0.0 - - - - - \ No newline at end of file diff --git a/windows/obj/libdatadog.csproj.nuget.g.targets b/windows/obj/libdatadog.csproj.nuget.g.targets deleted file mode 100644 index 3dc06ef3cc..0000000000 --- a/windows/obj/libdatadog.csproj.nuget.g.targets +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/windows/obj/project.assets.json b/windows/obj/project.assets.json deleted file mode 100644 index 394c494b5d..0000000000 --- a/windows/obj/project.assets.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "version": 3, - "targets": { - "net7.0": {} - }, - "libraries": {}, - "projectFileDependencyGroups": { - "net7.0": [] - }, - "packageFolders": { - "/Users/kathie.huang/.nuget/packages/": {} - }, - "project": { - "version": "1.0.0", - "restore": { - "projectUniqueName": "/Users/kathie.huang/go/src/github.com/DataDog/libdatadog/windows/libdatadog.csproj", - "projectName": "libdatadog", - "projectPath": "/Users/kathie.huang/go/src/github.com/DataDog/libdatadog/windows/libdatadog.csproj", - "packagesPath": "/Users/kathie.huang/.nuget/packages/", - "outputPath": "/Users/kathie.huang/go/src/github.com/DataDog/libdatadog/windows/obj/", - "projectStyle": "PackageReference", - "configFilePaths": [ - "/Users/kathie.huang/.nuget/NuGet/NuGet.Config" - ], - "originalTargetFrameworks": [ - "net7.0" - ], - "sources": { - "/Users/kathie.huang/dd/serverless-compat-self-monitoring/libs/datadog-serverless-compat-dotnet": {}, - "https://api.nuget.org/v3/index.json": {} - }, - "frameworks": { - "net7.0": { - "targetAlias": "net7.0", - "projectReferences": {} - } - }, - "warningProperties": { - "warnAsError": [ - "NU1605" - ] - }, - "restoreAuditProperties": { - "enableAudit": "true", - "auditLevel": "low", - "auditMode": "direct" - }, - "SdkAnalysisLevel": "10.0.100" - }, - "frameworks": { - "net7.0": { - "targetAlias": "net7.0", - "imports": [ - "net461", - "net462", - "net47", - "net471", - "net472", - "net48", - "net481" - ], - "assetTargetFallback": true, - "warn": true, - "downloadDependencies": [ - { - "name": "Microsoft.AspNetCore.App.Ref", - "version": "[7.0.20, 7.0.20]" - }, - { - "name": "Microsoft.NETCore.App.Ref", - "version": "[7.0.20, 7.0.20]" - } - ], - "frameworkReferences": { - "Microsoft.NETCore.App": { - "privateAssets": "all" - } - }, - "runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/10.0.102/RuntimeIdentifierGraph.json" - } - } - } -} \ No newline at end of file diff --git a/windows/obj/project.nuget.cache b/windows/obj/project.nuget.cache deleted file mode 100644 index 0b594789fb..0000000000 --- a/windows/obj/project.nuget.cache +++ /dev/null @@ -1,11 +0,0 @@ -{ - "version": 2, - "dgSpecHash": "zShLRmrcF7A=", - "success": true, - "projectFilePath": "/Users/kathie.huang/go/src/github.com/DataDog/libdatadog/windows/libdatadog.csproj", - "expectedPackageFiles": [ - "/Users/kathie.huang/.nuget/packages/microsoft.netcore.app.ref/7.0.20/microsoft.netcore.app.ref.7.0.20.nupkg.sha512", - "/Users/kathie.huang/.nuget/packages/microsoft.aspnetcore.app.ref/7.0.20/microsoft.aspnetcore.app.ref.7.0.20.nupkg.sha512" - ], - "logs": [] -} \ No newline at end of file From 70a4ee862889ceeb29c0136a9cc85c061fe58f7f Mon Sep 17 00:00:00 2001 From: Kathie Huang Date: Thu, 9 Apr 2026 17:22:23 -0400 Subject: [PATCH 7/9] Clarify comment --- libdd-trace-utils/src/config_utils.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libdd-trace-utils/src/config_utils.rs b/libdd-trace-utils/src/config_utils.rs index 06a044526a..c3c2480820 100644 --- a/libdd-trace-utils/src/config_utils.rs +++ b/libdd-trace-utils/src/config_utils.rs @@ -34,10 +34,10 @@ pub fn read_cloud_env() -> Option<(String, trace_utils::EnvironmentType)> { } if let (Ok(name), Ok(_)) = (env::var("K_SERVICE"), env::var("FUNCTION_TARGET")) { - // Set by Google Cloud Run Functions Gen 2 + // Set by Google Cloud Functions for newer runtimes detected.push((name, trace_utils::EnvironmentType::CloudFunction)); } else if let (Ok(name), Ok(_)) = (env::var("FUNCTION_NAME"), env::var("GCP_PROJECT")) { - // Set by Google Cloud Functions Gen 1 + // Set by Google Cloud Functions for older runtimes detected.push((name, trace_utils::EnvironmentType::CloudFunction)); } From c457a6097427d10fca5d66f685c58781ecec789f Mon Sep 17 00:00:00 2001 From: Kathie Huang Date: Fri, 10 Apr 2026 10:48:00 -0400 Subject: [PATCH 8/9] Skip serial_tests in miri as they leak --- libdd-trace-utils/src/config_utils.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/libdd-trace-utils/src/config_utils.rs b/libdd-trace-utils/src/config_utils.rs index c3c2480820..7115990eda 100644 --- a/libdd-trace-utils/src/config_utils.rs +++ b/libdd-trace-utils/src/config_utils.rs @@ -141,6 +141,7 @@ mod tests { } #[test] + #[cfg_attr(miri, ignore)] // serial_test has intentional leaks that Miri flags #[serial_test::serial] fn test_aws_lambda_detected() { let _guards = clear_all_env_vars(); @@ -157,6 +158,7 @@ mod tests { } #[test] + #[cfg_attr(miri, ignore)] // serial_test has intentional leaks that Miri flags #[serial_test::serial] fn test_aws_lambda_missing_function_name() { let _guards = clear_all_env_vars(); @@ -166,6 +168,7 @@ mod tests { } #[test] + #[cfg_attr(miri, ignore)] // serial_test has intentional leaks that Miri flags #[serial_test::serial] fn test_aws_lambda_not_detected_without_init_type() { let _guards = clear_all_env_vars(); @@ -175,6 +178,7 @@ mod tests { } #[test] + #[cfg_attr(miri, ignore)] // serial_test has intentional leaks that Miri flags #[serial_test::serial] fn test_azure_function_detected() { let _guards = clear_all_env_vars(); @@ -192,6 +196,7 @@ mod tests { } #[test] + #[cfg_attr(miri, ignore)] // serial_test has intentional leaks that Miri flags #[serial_test::serial] fn test_azure_function_missing_site_name() { let _guards = clear_all_env_vars(); @@ -202,6 +207,7 @@ mod tests { } #[test] + #[cfg_attr(miri, ignore)] // serial_test has intentional leaks that Miri flags #[serial_test::serial] fn test_azure_function_not_detected_with_only_one_var() { let _guards = clear_all_env_vars(); @@ -211,6 +217,7 @@ mod tests { } #[test] + #[cfg_attr(miri, ignore)] // serial_test has intentional leaks that Miri flags #[serial_test::serial] fn test_gcp_1st_gen_detected() { let _guards = clear_all_env_vars(); @@ -227,6 +234,7 @@ mod tests { } #[test] + #[cfg_attr(miri, ignore)] // serial_test has intentional leaks that Miri flags #[serial_test::serial] fn test_gcp_1st_gen_not_detected_without_gcp_project() { let _guards = clear_all_env_vars(); @@ -236,6 +244,7 @@ mod tests { } #[test] + #[cfg_attr(miri, ignore)] // serial_test has intentional leaks that Miri flags #[serial_test::serial] fn test_gcp_2nd_gen_detected() { let _guards = clear_all_env_vars(); @@ -252,6 +261,7 @@ mod tests { } #[test] + #[cfg_attr(miri, ignore)] // serial_test has intentional leaks that Miri flags #[serial_test::serial] fn test_gcp_2nd_gen_not_detected_without_function_target() { let _guards = clear_all_env_vars(); @@ -261,6 +271,7 @@ mod tests { } #[test] + #[cfg_attr(miri, ignore)] // serial_test has intentional leaks that Miri flags #[serial_test::serial] fn test_azure_spring_app_detected() { let _guards = clear_all_env_vars(); @@ -276,6 +287,7 @@ mod tests { } #[test] + #[cfg_attr(miri, ignore)] // serial_test has intentional leaks that Miri flags #[serial_test::serial] fn test_no_environment_detected() { let _guards = clear_all_env_vars(); @@ -284,6 +296,7 @@ mod tests { } #[test] + #[cfg_attr(miri, ignore)] // serial_test has intentional leaks that Miri flags #[serial_test::serial] fn test_multiple_environments_returns_none() { let _guards = clear_all_env_vars(); From 21a56899f3e9f50f5a7e9c58bb392fe35bd0a6bb Mon Sep 17 00:00:00 2001 From: Kathie Huang Date: Fri, 10 Apr 2026 10:58:30 -0400 Subject: [PATCH 9/9] Use static Mutex for test serialization instead of serial_test --- Cargo.lock | 1 - libdd-trace-utils/Cargo.toml | 1 - libdd-trace-utils/src/config_utils.rs | 182 +++++++++++--------------- 3 files changed, 77 insertions(+), 107 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 21847f436e..f2783f39a4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3378,7 +3378,6 @@ dependencies = [ "rmpv", "serde", "serde_json", - "serial_test", "tempfile", "tokio", "tracing", diff --git a/libdd-trace-utils/Cargo.toml b/libdd-trace-utils/Cargo.toml index 874d7d4166..0253160853 100644 --- a/libdd-trace-utils/Cargo.toml +++ b/libdd-trace-utils/Cargo.toml @@ -72,7 +72,6 @@ httpmock = { version = "0.8.0-alpha.1" } serde_json = "1.0" tokio = { version = "1", features = ["macros", "rt-multi-thread"] } libdd-trace-utils = { path = ".", features = ["test-utils"] } -serial_test = "3.2" tempfile = "3.3.0" [features] diff --git a/libdd-trace-utils/src/config_utils.rs b/libdd-trace-utils/src/config_utils.rs index 7115990eda..51b03362de 100644 --- a/libdd-trace-utils/src/config_utils.rs +++ b/libdd-trace-utils/src/config_utils.rs @@ -93,60 +93,34 @@ fn construct_trace_intake_url(prefix: &str, route: &str) -> String { #[cfg(test)] mod tests { use super::*; - - const ALL_VARS: &[&str] = &[ - "AWS_LAMBDA_INITIALIZATION_TYPE", - "AWS_LAMBDA_FUNCTION_NAME", - "FUNCTIONS_EXTENSION_VERSION", - "FUNCTIONS_WORKER_RUNTIME", - "WEBSITE_SITE_NAME", - "FUNCTION_NAME", - "GCP_PROJECT", - "K_SERVICE", - "FUNCTION_TARGET", - "ASCSVCRT_SPRING__APPLICATION__NAME", - ]; - - /// RAII guard that restores an environment variable to its previous value when dropped. - struct EnvGuard { - key: &'static str, - saved: Option, - } - - impl EnvGuard { - fn set(key: &'static str, value: &str) -> Self { - let saved = env::var(key).ok(); - unsafe { env::set_var(key, value) }; - EnvGuard { key, saved } - } - - fn remove(key: &'static str) -> Self { - let saved = env::var(key).ok(); - unsafe { env::remove_var(key) }; - EnvGuard { key, saved } - } - } - - impl Drop for EnvGuard { - fn drop(&mut self) { - match &self.saved { - Some(s) => unsafe { env::set_var(self.key, s) }, - None => unsafe { env::remove_var(self.key) }, - } + use std::sync::Mutex; + + // Mutex to ensure environment variable tests run sequentially + static ENV_TEST_LOCK: Mutex<()> = Mutex::new(()); + + fn clear_all_env_vars() { + unsafe { + env::remove_var("AWS_LAMBDA_INITIALIZATION_TYPE"); + env::remove_var("AWS_LAMBDA_FUNCTION_NAME"); + env::remove_var("FUNCTIONS_EXTENSION_VERSION"); + env::remove_var("FUNCTIONS_WORKER_RUNTIME"); + env::remove_var("WEBSITE_SITE_NAME"); + env::remove_var("FUNCTION_NAME"); + env::remove_var("GCP_PROJECT"); + env::remove_var("K_SERVICE"); + env::remove_var("FUNCTION_TARGET"); + env::remove_var("ASCSVCRT_SPRING__APPLICATION__NAME"); } } - fn clear_all_env_vars() -> Vec { - ALL_VARS.iter().map(|k| EnvGuard::remove(k)).collect() - } - #[test] - #[cfg_attr(miri, ignore)] // serial_test has intentional leaks that Miri flags - #[serial_test::serial] fn test_aws_lambda_detected() { - let _guards = clear_all_env_vars(); - let _init = EnvGuard::set("AWS_LAMBDA_INITIALIZATION_TYPE", "on-demand"); - let _name = EnvGuard::set("AWS_LAMBDA_FUNCTION_NAME", "my-function"); + let _lock = ENV_TEST_LOCK.lock().unwrap_or_else(|e| e.into_inner()); + clear_all_env_vars(); + unsafe { + env::set_var("AWS_LAMBDA_INITIALIZATION_TYPE", "on-demand"); + env::set_var("AWS_LAMBDA_FUNCTION_NAME", "my-function"); + } let result = read_cloud_env(); assert_eq!( result, @@ -158,33 +132,32 @@ mod tests { } #[test] - #[cfg_attr(miri, ignore)] // serial_test has intentional leaks that Miri flags - #[serial_test::serial] fn test_aws_lambda_missing_function_name() { - let _guards = clear_all_env_vars(); - let _init = EnvGuard::set("AWS_LAMBDA_INITIALIZATION_TYPE", "on-demand"); + let _lock = ENV_TEST_LOCK.lock().unwrap_or_else(|e| e.into_inner()); + clear_all_env_vars(); + unsafe { env::set_var("AWS_LAMBDA_INITIALIZATION_TYPE", "on-demand") }; let result = read_cloud_env(); assert_eq!(result, None); } #[test] - #[cfg_attr(miri, ignore)] // serial_test has intentional leaks that Miri flags - #[serial_test::serial] fn test_aws_lambda_not_detected_without_init_type() { - let _guards = clear_all_env_vars(); - let _name = EnvGuard::set("AWS_LAMBDA_FUNCTION_NAME", "my-function"); + let _lock = ENV_TEST_LOCK.lock().unwrap_or_else(|e| e.into_inner()); + clear_all_env_vars(); + unsafe { env::set_var("AWS_LAMBDA_FUNCTION_NAME", "my-function") }; let result = read_cloud_env(); assert_eq!(result, None); } #[test] - #[cfg_attr(miri, ignore)] // serial_test has intentional leaks that Miri flags - #[serial_test::serial] fn test_azure_function_detected() { - let _guards = clear_all_env_vars(); - let _ext = EnvGuard::set("FUNCTIONS_EXTENSION_VERSION", "~4"); - let _rt = EnvGuard::set("FUNCTIONS_WORKER_RUNTIME", "java"); - let _site = EnvGuard::set("WEBSITE_SITE_NAME", "my-azure-app"); + let _lock = ENV_TEST_LOCK.lock().unwrap_or_else(|e| e.into_inner()); + clear_all_env_vars(); + unsafe { + env::set_var("FUNCTIONS_EXTENSION_VERSION", "~4"); + env::set_var("FUNCTIONS_WORKER_RUNTIME", "java"); + env::set_var("WEBSITE_SITE_NAME", "my-azure-app"); + } let result = read_cloud_env(); assert_eq!( result, @@ -196,33 +169,34 @@ mod tests { } #[test] - #[cfg_attr(miri, ignore)] // serial_test has intentional leaks that Miri flags - #[serial_test::serial] fn test_azure_function_missing_site_name() { - let _guards = clear_all_env_vars(); - let _ext = EnvGuard::set("FUNCTIONS_EXTENSION_VERSION", "~4"); - let _rt = EnvGuard::set("FUNCTIONS_WORKER_RUNTIME", "java"); + let _lock = ENV_TEST_LOCK.lock().unwrap_or_else(|e| e.into_inner()); + clear_all_env_vars(); + unsafe { + env::set_var("FUNCTIONS_EXTENSION_VERSION", "~4"); + env::set_var("FUNCTIONS_WORKER_RUNTIME", "java"); + } let result = read_cloud_env(); assert_eq!(result, None); } #[test] - #[cfg_attr(miri, ignore)] // serial_test has intentional leaks that Miri flags - #[serial_test::serial] fn test_azure_function_not_detected_with_only_one_var() { - let _guards = clear_all_env_vars(); - let _ext = EnvGuard::set("FUNCTIONS_EXTENSION_VERSION", "~4"); + let _lock = ENV_TEST_LOCK.lock().unwrap_or_else(|e| e.into_inner()); + clear_all_env_vars(); + unsafe { env::set_var("FUNCTIONS_EXTENSION_VERSION", "~4") }; let result = read_cloud_env(); assert_eq!(result, None); } #[test] - #[cfg_attr(miri, ignore)] // serial_test has intentional leaks that Miri flags - #[serial_test::serial] fn test_gcp_1st_gen_detected() { - let _guards = clear_all_env_vars(); - let _name = EnvGuard::set("FUNCTION_NAME", "my-gcp-function"); - let _project = EnvGuard::set("GCP_PROJECT", "my-project"); + let _lock = ENV_TEST_LOCK.lock().unwrap_or_else(|e| e.into_inner()); + clear_all_env_vars(); + unsafe { + env::set_var("FUNCTION_NAME", "my-gcp-function"); + env::set_var("GCP_PROJECT", "my-project"); + } let result = read_cloud_env(); assert_eq!( result, @@ -234,22 +208,22 @@ mod tests { } #[test] - #[cfg_attr(miri, ignore)] // serial_test has intentional leaks that Miri flags - #[serial_test::serial] fn test_gcp_1st_gen_not_detected_without_gcp_project() { - let _guards = clear_all_env_vars(); - let _name = EnvGuard::set("FUNCTION_NAME", "my-gcp-function"); + let _lock = ENV_TEST_LOCK.lock().unwrap_or_else(|e| e.into_inner()); + clear_all_env_vars(); + unsafe { env::set_var("FUNCTION_NAME", "my-gcp-function") }; let result = read_cloud_env(); assert_eq!(result, None); } #[test] - #[cfg_attr(miri, ignore)] // serial_test has intentional leaks that Miri flags - #[serial_test::serial] fn test_gcp_2nd_gen_detected() { - let _guards = clear_all_env_vars(); - let _service = EnvGuard::set("K_SERVICE", "my-cloud-run-fn"); - let _target = EnvGuard::set("FUNCTION_TARGET", "myHandler"); + let _lock = ENV_TEST_LOCK.lock().unwrap_or_else(|e| e.into_inner()); + clear_all_env_vars(); + unsafe { + env::set_var("K_SERVICE", "my-cloud-run-fn"); + env::set_var("FUNCTION_TARGET", "myHandler"); + } let result = read_cloud_env(); assert_eq!( result, @@ -261,21 +235,19 @@ mod tests { } #[test] - #[cfg_attr(miri, ignore)] // serial_test has intentional leaks that Miri flags - #[serial_test::serial] fn test_gcp_2nd_gen_not_detected_without_function_target() { - let _guards = clear_all_env_vars(); - let _service = EnvGuard::set("K_SERVICE", "my-cloud-run-fn"); + let _lock = ENV_TEST_LOCK.lock().unwrap_or_else(|e| e.into_inner()); + clear_all_env_vars(); + unsafe { env::set_var("K_SERVICE", "my-cloud-run-fn") }; let result = read_cloud_env(); assert_eq!(result, None); } #[test] - #[cfg_attr(miri, ignore)] // serial_test has intentional leaks that Miri flags - #[serial_test::serial] fn test_azure_spring_app_detected() { - let _guards = clear_all_env_vars(); - let _app = EnvGuard::set("ASCSVCRT_SPRING__APPLICATION__NAME", "my-spring-app"); + let _lock = ENV_TEST_LOCK.lock().unwrap_or_else(|e| e.into_inner()); + clear_all_env_vars(); + unsafe { env::set_var("ASCSVCRT_SPRING__APPLICATION__NAME", "my-spring-app") }; let result = read_cloud_env(); assert_eq!( result, @@ -287,24 +259,24 @@ mod tests { } #[test] - #[cfg_attr(miri, ignore)] // serial_test has intentional leaks that Miri flags - #[serial_test::serial] fn test_no_environment_detected() { - let _guards = clear_all_env_vars(); + let _lock = ENV_TEST_LOCK.lock().unwrap_or_else(|e| e.into_inner()); + clear_all_env_vars(); let result = read_cloud_env(); assert_eq!(result, None); } #[test] - #[cfg_attr(miri, ignore)] // serial_test has intentional leaks that Miri flags - #[serial_test::serial] fn test_multiple_environments_returns_none() { - let _guards = clear_all_env_vars(); - let _init = EnvGuard::set("AWS_LAMBDA_INITIALIZATION_TYPE", "on-demand"); - let _fn_name = EnvGuard::set("AWS_LAMBDA_FUNCTION_NAME", "my-lambda"); - let _ext = EnvGuard::set("FUNCTIONS_EXTENSION_VERSION", "~4"); - let _rt = EnvGuard::set("FUNCTIONS_WORKER_RUNTIME", "java"); - let _site = EnvGuard::set("WEBSITE_SITE_NAME", "my-azure-app"); + let _lock = ENV_TEST_LOCK.lock().unwrap_or_else(|e| e.into_inner()); + clear_all_env_vars(); + unsafe { + env::set_var("AWS_LAMBDA_INITIALIZATION_TYPE", "on-demand"); + env::set_var("AWS_LAMBDA_FUNCTION_NAME", "my-lambda"); + env::set_var("FUNCTIONS_EXTENSION_VERSION", "~4"); + env::set_var("FUNCTIONS_WORKER_RUNTIME", "java"); + env::set_var("WEBSITE_SITE_NAME", "my-azure-app"); + } let result = read_cloud_env(); assert_eq!(result, None); }