From bb64700e61f5ad50995d4d88353d1c40d64afd36 Mon Sep 17 00:00:00 2001 From: Kathie Huang Date: Wed, 3 Jun 2026 14:36:40 -0400 Subject: [PATCH 1/8] Make shared consts public and add fallback logic for resolving instance name --- libdd-common/src/azure_app_services.rs | 171 ++++++++++++++++++++++++- 1 file changed, 167 insertions(+), 4 deletions(-) diff --git a/libdd-common/src/azure_app_services.rs b/libdd-common/src/azure_app_services.rs index e2b4d83bad..e0d32a1a14 100644 --- a/libdd-common/src/azure_app_services.rs +++ b/libdd-common/src/azure_app_services.rs @@ -18,9 +18,12 @@ const FUNCTIONS_WORKER_RUNTIME: &str = "FUNCTIONS_WORKER_RUNTIME"; const FUNCTIONS_WORKER_RUNTIME_VERSION: &str = "FUNCTIONS_WORKER_RUNTIME_VERSION"; const FUNCTIONS_EXTENSION_VERSION: &str = "FUNCTIONS_EXTENSION_VERSION"; const DD_AZURE_RESOURCE_GROUP: &str = "DD_AZURE_RESOURCE_GROUP"; -const WEBSITE_SKU: &str = "WEBSITE_SKU"; +pub const WEBSITE_SKU: &str = "WEBSITE_SKU"; +pub const REGION_NAME: &str = "REGION_NAME"; +const CONTAINER_NAME: &str = "CONTAINER_NAME"; +const WEBSITE_POD_NAME: &str = "WEBSITE_POD_NAME"; -const UNKNOWN_VALUE: &str = "unknown"; +pub const UNKNOWN_VALUE: &str = "unknown"; enum AzureContext { AzureFunctions, @@ -71,6 +74,8 @@ const AAS_VAR_NAMES: &[&str] = &[ FUNCTIONS_EXTENSION_VERSION, DD_AZURE_RESOURCE_GROUP, WEBSITE_SKU, + CONTAINER_NAME, + WEBSITE_POD_NAME, ]; #[cfg(target_os = "linux")] @@ -223,12 +228,14 @@ impl AzureMetadata { _ => ("app".to_owned(), "app".to_owned()), }; + let website_sku = query.get_var(WEBSITE_SKU); + let resource_group = query .get_var(DD_AZURE_RESOURCE_GROUP) .or_else(|| query.get_var(WEBSITE_RESOURCE_GROUP)) .or_else(|| { // Check if we're in flex consumption plan first - match query.get_var(WEBSITE_SKU).as_deref() { + match website_sku.as_deref() { Some("FlexConsumption") => None, /* Flex Consumption plans need the `DD_AZURE_RESOURCE_GROUP` env var. If this * logic ever changes, update the logic in @@ -247,7 +254,17 @@ impl AzureMetadata { let operating_system = query .get_var(WEBSITE_OS) .unwrap_or(std::env::consts::OS.to_string()); - let instance_name = query.get_var(INSTANCE_NAME); + + let container_name = query.get_var(CONTAINER_NAME); + let pod_name = query.get_var(WEBSITE_POD_NAME); + let computer_name = query.get_var(INSTANCE_NAME); + let instance_name = resolve_instance_name( + website_sku.as_deref(), + container_name.as_deref(), + pod_name.as_deref(), + computer_name.as_deref(), + ); + let instance_id = query.get_var(INSTANCE_ID); let runtime = query.get_var(FUNCTIONS_WORKER_RUNTIME); @@ -394,6 +411,34 @@ impl AzureMetadata { } } +/// Resolves the instance name using the env var that provides an instance value +/// that matches the Azure integration metric's `instance` tag for the current hosting plan +/// with fallback logic if the preferred source is empty. +fn resolve_instance_name( + website_sku: Option<&str>, + container_name: Option<&str>, + pod_name: Option<&str>, + computer_name: Option<&str>, +) -> Option { + fn non_empty(s: Option<&str>) -> Option<&str> { + s.filter(|v| !v.trim().is_empty()) + } + + let sku_preferred = match website_sku { + Some("FlexConsumption") | Some("Dynamic") => { + non_empty(container_name).or_else(|| non_empty(pod_name)) + } + Some(_) => non_empty(computer_name), + None => None, + }; + + sku_preferred + .or_else(|| non_empty(container_name)) + .or_else(|| non_empty(pod_name)) + .or_else(|| non_empty(computer_name)) + .map(|s| s.to_lowercase()) +} + pub static AAS_METADATA: LazyLock> = LazyLock::new(|| AzureMetadata::new(RealEnv {})); @@ -1002,4 +1047,122 @@ mod tests { None ); } + + #[test] + fn test_public_consts_are_accessible() { + assert_eq!(super::WEBSITE_SKU, "WEBSITE_SKU"); + assert_eq!(super::UNKNOWN_VALUE, "unknown"); + assert_eq!(super::REGION_NAME, "REGION_NAME"); + } + + #[test] + fn test_instance_name_flex_consumption_uses_container_name() { + let mocked_env = MockEnv::new(&[ + (FUNCTIONS_WORKER_RUNTIME, "node"), + (WEBSITE_SKU, "FlexConsumption"), + ("CONTAINER_NAME", "0--abc-DEF"), + ("WEBSITE_POD_NAME", "0--abc-test"), + ]); + let metadata = AzureMetadata::new_function(mocked_env).unwrap(); + assert_eq!(metadata.get_instance_name(), "0--abc-def"); + } + + #[test] + fn test_instance_name_flex_consumption_falls_back_to_pod_name() { + let mocked_env = MockEnv::new(&[ + (FUNCTIONS_WORKER_RUNTIME, "node"), + (WEBSITE_SKU, "FlexConsumption"), + ("WEBSITE_POD_NAME", "0--abc-def"), + ]); + let metadata = AzureMetadata::new_function(mocked_env).unwrap(); + assert_eq!(metadata.get_instance_name(), "0--abc-def"); + } + + #[test] + fn test_instance_name_dynamic_uses_container_name() { + let mocked_env = MockEnv::new(&[ + (FUNCTIONS_WORKER_RUNTIME, "node"), + (WEBSITE_SKU, "Dynamic"), + ("CONTAINER_NAME", "ABCD1234-111122223333444455"), + ]); + let metadata = AzureMetadata::new_function(mocked_env).unwrap(); + assert_eq!(metadata.get_instance_name(), "abcd1234-111122223333444455"); + } + + #[test] + fn test_instance_name_elastic_premium_uses_computer_name() { + let mocked_env = MockEnv::new(&[ + (FUNCTIONS_WORKER_RUNTIME, "node"), + (WEBSITE_SKU, "ElasticPremium"), + (INSTANCE_NAME, "ep0fakewk0000A1"), + ]); + let metadata = AzureMetadata::new_function(mocked_env).unwrap(); + assert_eq!(metadata.get_instance_name(), "ep0fakewk0000a1"); + } + + #[test] + fn test_instance_name_dedicated_uses_computer_name() { + let mocked_env = MockEnv::new(&[ + (FUNCTIONS_WORKER_RUNTIME, "node"), + (WEBSITE_SKU, "PremiumV3"), + (INSTANCE_NAME, "p3fakewk0000B2"), + ]); + let metadata = AzureMetadata::new_function(mocked_env).unwrap(); + assert_eq!(metadata.get_instance_name(), "p3fakewk0000b2"); + } + + #[test] + fn test_instance_name_empty_string_treated_as_missing() { + let mocked_env = MockEnv::new(&[ + (FUNCTIONS_WORKER_RUNTIME, "node"), + (WEBSITE_SKU, "ElasticPremium"), + ("CONTAINER_NAME", ""), + ("WEBSITE_POD_NAME", ""), + (INSTANCE_NAME, "worker-1"), + ]); + let metadata = AzureMetadata::new_function(mocked_env).unwrap(); + assert_eq!(metadata.get_instance_name(), "worker-1"); + } + + #[test] + fn test_instance_name_whitespace_only_treated_as_missing() { + let mocked_env = MockEnv::new(&[ + (FUNCTIONS_WORKER_RUNTIME, "node"), + (WEBSITE_SKU, "ElasticPremium"), + ("CONTAINER_NAME", " "), + ("WEBSITE_POD_NAME", " "), + (INSTANCE_NAME, "worker-2"), + ]); + let metadata = AzureMetadata::new_function(mocked_env).unwrap(); + assert_eq!(metadata.get_instance_name(), "worker-2"); + } + + #[test] + fn test_instance_name_unknown_sku_falls_back_to_container_name() { + let mocked_env = MockEnv::new(&[ + (FUNCTIONS_WORKER_RUNTIME, "node"), + (WEBSITE_SKU, "PremiumV4"), + ("CONTAINER_NAME", "container-1"), + ]); + let metadata = AzureMetadata::new_function(mocked_env).unwrap(); + assert_eq!(metadata.get_instance_name(), "container-1"); + } + + #[test] + fn test_instance_name_windows_consumption_falls_through_to_computer_name() { + let mocked_env = MockEnv::new(&[ + (FUNCTIONS_WORKER_RUNTIME, "node"), + (WEBSITE_SKU, "Dynamic"), + (INSTANCE_NAME, "10-20-30-40"), + ]); + let metadata = AzureMetadata::new_function(mocked_env).unwrap(); + assert_eq!(metadata.get_instance_name(), "10-20-30-40"); + } + + #[test] + fn test_instance_name_no_instance_vars_is_unknown() { + let mocked_env = MockEnv::new(&[(FUNCTIONS_WORKER_RUNTIME, "node")]); + let metadata = AzureMetadata::new_function(mocked_env).unwrap(); + assert_eq!(metadata.get_instance_name(), UNKNOWN_VALUE); + } } From 2af348bab6bf94e4b038fcf9066daa71c3be4510 Mon Sep 17 00:00:00 2001 From: Kathie Huang Date: Thu, 4 Jun 2026 10:27:07 -0400 Subject: [PATCH 2/8] Remove SERVICE_CONTEXT env var from tests --- libdd-common/src/azure_app_services.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libdd-common/src/azure_app_services.rs b/libdd-common/src/azure_app_services.rs index e0d32a1a14..f5a124e179 100644 --- a/libdd-common/src/azure_app_services.rs +++ b/libdd-common/src/azure_app_services.rs @@ -681,10 +681,10 @@ mod tests { "00000000-0000-0000-0000-000000000000+flex-EastUSwebspace-Linux", ), (WEBSITE_SKU, "FlexConsumption"), - (SERVICE_CONTEXT, "1"), + (FUNCTIONS_WORKER_RUNTIME, "node"), ]); - let metadata = AzureMetadata::new(mocked_env).unwrap(); + let metadata = AzureMetadata::new_function(mocked_env).unwrap(); assert_eq!(metadata.get_resource_group(), UNKNOWN_VALUE); } @@ -698,10 +698,10 @@ mod tests { ), (DD_AZURE_RESOURCE_GROUP, "test-flex-rg"), (WEBSITE_SKU, "FlexConsumption"), - (SERVICE_CONTEXT, "1"), + (FUNCTIONS_WORKER_RUNTIME, "node"), ]); - let metadata = AzureMetadata::new(mocked_env).unwrap(); + let metadata = AzureMetadata::new_function(mocked_env).unwrap(); // Should use the DD_AZURE_RESOURCE_GROUP value instead of extracting from // WEBSITE_OWNER_NAME From 8d0b58e21d6cba6991d0e7b5e5323f5b6ab5a131 Mon Sep 17 00:00:00 2001 From: Kathie Huang Date: Thu, 4 Jun 2026 17:02:33 -0400 Subject: [PATCH 3/8] Prioritize COMPUTERNAME if WEBSITE_SKU is empty and do not lowercase the instance name --- libdd-common/src/azure_app_services.rs | 33 +++++++++++++++++++++----- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/libdd-common/src/azure_app_services.rs b/libdd-common/src/azure_app_services.rs index f5a124e179..f229654270 100644 --- a/libdd-common/src/azure_app_services.rs +++ b/libdd-common/src/azure_app_services.rs @@ -433,10 +433,10 @@ fn resolve_instance_name( }; sku_preferred + .or_else(|| non_empty(computer_name)) .or_else(|| non_empty(container_name)) .or_else(|| non_empty(pod_name)) - .or_else(|| non_empty(computer_name)) - .map(|s| s.to_lowercase()) + .map(|s| s.to_string()) } pub static AAS_METADATA: LazyLock> = @@ -1064,7 +1064,7 @@ mod tests { ("WEBSITE_POD_NAME", "0--abc-test"), ]); let metadata = AzureMetadata::new_function(mocked_env).unwrap(); - assert_eq!(metadata.get_instance_name(), "0--abc-def"); + assert_eq!(metadata.get_instance_name(), "0--abc-DEF"); } #[test] @@ -1086,7 +1086,7 @@ mod tests { ("CONTAINER_NAME", "ABCD1234-111122223333444455"), ]); let metadata = AzureMetadata::new_function(mocked_env).unwrap(); - assert_eq!(metadata.get_instance_name(), "abcd1234-111122223333444455"); + assert_eq!(metadata.get_instance_name(), "ABCD1234-111122223333444455"); } #[test] @@ -1097,7 +1097,7 @@ mod tests { (INSTANCE_NAME, "ep0fakewk0000A1"), ]); let metadata = AzureMetadata::new_function(mocked_env).unwrap(); - assert_eq!(metadata.get_instance_name(), "ep0fakewk0000a1"); + assert_eq!(metadata.get_instance_name(), "ep0fakewk0000A1"); } #[test] @@ -1108,7 +1108,7 @@ mod tests { (INSTANCE_NAME, "p3fakewk0000B2"), ]); let metadata = AzureMetadata::new_function(mocked_env).unwrap(); - assert_eq!(metadata.get_instance_name(), "p3fakewk0000b2"); + assert_eq!(metadata.get_instance_name(), "p3fakewk0000B2"); } #[test] @@ -1159,6 +1159,27 @@ mod tests { assert_eq!(metadata.get_instance_name(), "10-20-30-40"); } + #[test] + fn test_instance_name_no_sku_prefers_computer_name() { + let mocked_env = MockEnv::new(&[ + (FUNCTIONS_WORKER_RUNTIME, "node"), + ("CONTAINER_NAME", "container-1"), + (INSTANCE_NAME, "worker-1"), + ]); + let metadata = AzureMetadata::new_function(mocked_env).unwrap(); + assert_eq!(metadata.get_instance_name(), "worker-1"); + } + + #[test] + fn test_instance_name_no_sku_falls_back_to_container_name() { + let mocked_env = MockEnv::new(&[ + (FUNCTIONS_WORKER_RUNTIME, "node"), + ("CONTAINER_NAME", "container-1"), + ]); + let metadata = AzureMetadata::new_function(mocked_env).unwrap(); + assert_eq!(metadata.get_instance_name(), "container-1"); + } + #[test] fn test_instance_name_no_instance_vars_is_unknown() { let mocked_env = MockEnv::new(&[(FUNCTIONS_WORKER_RUNTIME, "node")]); From 3f3fb3e6cd57086b24007c91e0f5f3c2bfdde636 Mon Sep 17 00:00:00 2001 From: Kathie Huang Date: Thu, 4 Jun 2026 17:36:16 -0400 Subject: [PATCH 4/8] Prevent whitespace from leaking into the instance name before using it --- libdd-common/src/azure_app_services.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libdd-common/src/azure_app_services.rs b/libdd-common/src/azure_app_services.rs index f229654270..99ed2faa07 100644 --- a/libdd-common/src/azure_app_services.rs +++ b/libdd-common/src/azure_app_services.rs @@ -421,7 +421,7 @@ fn resolve_instance_name( computer_name: Option<&str>, ) -> Option { fn non_empty(s: Option<&str>) -> Option<&str> { - s.filter(|v| !v.trim().is_empty()) + s.map(|v| v.trim()).filter(|v| !v.is_empty()) } let sku_preferred = match website_sku { From ff8ee413f2caf11ab7b98e9adcdb0f19657c6c8b Mon Sep 17 00:00:00 2001 From: Kathie Huang Date: Fri, 5 Jun 2026 11:04:27 -0400 Subject: [PATCH 5/8] remove test --- libdd-common/src/azure_app_services.rs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/libdd-common/src/azure_app_services.rs b/libdd-common/src/azure_app_services.rs index 99ed2faa07..89385b9023 100644 --- a/libdd-common/src/azure_app_services.rs +++ b/libdd-common/src/azure_app_services.rs @@ -1048,13 +1048,6 @@ mod tests { ); } - #[test] - fn test_public_consts_are_accessible() { - assert_eq!(super::WEBSITE_SKU, "WEBSITE_SKU"); - assert_eq!(super::UNKNOWN_VALUE, "unknown"); - assert_eq!(super::REGION_NAME, "REGION_NAME"); - } - #[test] fn test_instance_name_flex_consumption_uses_container_name() { let mocked_env = MockEnv::new(&[ From 869d5709ec35410ab42c94a5904cdc8deec93bdf Mon Sep 17 00:00:00 2001 From: Kathie Huang Date: Mon, 8 Jun 2026 14:55:51 -0400 Subject: [PATCH 6/8] Keep fallback logic consistent regardless of hosting plan --- libdd-common/src/azure_app_services.rs | 122 ++++--------------------- 1 file changed, 20 insertions(+), 102 deletions(-) diff --git a/libdd-common/src/azure_app_services.rs b/libdd-common/src/azure_app_services.rs index 89385b9023..e8372ab424 100644 --- a/libdd-common/src/azure_app_services.rs +++ b/libdd-common/src/azure_app_services.rs @@ -259,9 +259,8 @@ impl AzureMetadata { let pod_name = query.get_var(WEBSITE_POD_NAME); let computer_name = query.get_var(INSTANCE_NAME); let instance_name = resolve_instance_name( - website_sku.as_deref(), - container_name.as_deref(), pod_name.as_deref(), + container_name.as_deref(), computer_name.as_deref(), ); @@ -411,31 +410,19 @@ impl AzureMetadata { } } -/// Resolves the instance name using the env var that provides an instance value -/// that matches the Azure integration metric's `instance` tag for the current hosting plan -/// with fallback logic if the preferred source is empty. +/// Resolves the instance name to match the Azure integration metric's `instance` tag. fn resolve_instance_name( - website_sku: Option<&str>, - container_name: Option<&str>, pod_name: Option<&str>, + container_name: Option<&str>, computer_name: Option<&str>, ) -> Option { fn non_empty(s: Option<&str>) -> Option<&str> { s.map(|v| v.trim()).filter(|v| !v.is_empty()) } - let sku_preferred = match website_sku { - Some("FlexConsumption") | Some("Dynamic") => { - non_empty(container_name).or_else(|| non_empty(pod_name)) - } - Some(_) => non_empty(computer_name), - None => None, - }; - - sku_preferred - .or_else(|| non_empty(computer_name)) - .or_else(|| non_empty(container_name)) + non_empty(computer_name) .or_else(|| non_empty(pod_name)) + .or_else(|| non_empty(container_name)) .map(|s| s.to_string()) } @@ -1049,68 +1036,43 @@ mod tests { } #[test] - fn test_instance_name_flex_consumption_uses_container_name() { + fn test_instance_name_computer_name_wins_over_pod_and_container() { let mocked_env = MockEnv::new(&[ (FUNCTIONS_WORKER_RUNTIME, "node"), - (WEBSITE_SKU, "FlexConsumption"), - ("CONTAINER_NAME", "0--abc-DEF"), - ("WEBSITE_POD_NAME", "0--abc-test"), - ]); - let metadata = AzureMetadata::new_function(mocked_env).unwrap(); - assert_eq!(metadata.get_instance_name(), "0--abc-DEF"); - } - - #[test] - fn test_instance_name_flex_consumption_falls_back_to_pod_name() { - let mocked_env = MockEnv::new(&[ - (FUNCTIONS_WORKER_RUNTIME, "node"), - (WEBSITE_SKU, "FlexConsumption"), - ("WEBSITE_POD_NAME", "0--abc-def"), - ]); - let metadata = AzureMetadata::new_function(mocked_env).unwrap(); - assert_eq!(metadata.get_instance_name(), "0--abc-def"); - } - - #[test] - fn test_instance_name_dynamic_uses_container_name() { - let mocked_env = MockEnv::new(&[ - (FUNCTIONS_WORKER_RUNTIME, "node"), - (WEBSITE_SKU, "Dynamic"), - ("CONTAINER_NAME", "ABCD1234-111122223333444455"), + (INSTANCE_NAME, "10-20-30-40"), + (CONTAINER_NAME, "container-1"), ]); let metadata = AzureMetadata::new_function(mocked_env).unwrap(); - assert_eq!(metadata.get_instance_name(), "ABCD1234-111122223333444455"); + assert_eq!(metadata.get_instance_name(), "10-20-30-40"); } #[test] - fn test_instance_name_elastic_premium_uses_computer_name() { + fn test_instance_name_pod_name_preferred_over_container_name() { let mocked_env = MockEnv::new(&[ (FUNCTIONS_WORKER_RUNTIME, "node"), - (WEBSITE_SKU, "ElasticPremium"), - (INSTANCE_NAME, "ep0fakewk0000A1"), + (WEBSITE_POD_NAME, "0--abc-test"), + (CONTAINER_NAME, "container-1"), ]); let metadata = AzureMetadata::new_function(mocked_env).unwrap(); - assert_eq!(metadata.get_instance_name(), "ep0fakewk0000A1"); + assert_eq!(metadata.get_instance_name(), "0--abc-test"); } #[test] - fn test_instance_name_dedicated_uses_computer_name() { + fn test_instance_name_falls_back_to_container_name() { let mocked_env = MockEnv::new(&[ (FUNCTIONS_WORKER_RUNTIME, "node"), - (WEBSITE_SKU, "PremiumV3"), - (INSTANCE_NAME, "p3fakewk0000B2"), + (CONTAINER_NAME, "0--abc-test"), ]); let metadata = AzureMetadata::new_function(mocked_env).unwrap(); - assert_eq!(metadata.get_instance_name(), "p3fakewk0000B2"); + assert_eq!(metadata.get_instance_name(), "0--abc-test"); } #[test] fn test_instance_name_empty_string_treated_as_missing() { let mocked_env = MockEnv::new(&[ (FUNCTIONS_WORKER_RUNTIME, "node"), - (WEBSITE_SKU, "ElasticPremium"), - ("CONTAINER_NAME", ""), - ("WEBSITE_POD_NAME", ""), + (CONTAINER_NAME, ""), + (WEBSITE_POD_NAME, ""), (INSTANCE_NAME, "worker-1"), ]); let metadata = AzureMetadata::new_function(mocked_env).unwrap(); @@ -1121,58 +1083,14 @@ mod tests { fn test_instance_name_whitespace_only_treated_as_missing() { let mocked_env = MockEnv::new(&[ (FUNCTIONS_WORKER_RUNTIME, "node"), - (WEBSITE_SKU, "ElasticPremium"), - ("CONTAINER_NAME", " "), - ("WEBSITE_POD_NAME", " "), + (CONTAINER_NAME, " "), + (WEBSITE_POD_NAME, " "), (INSTANCE_NAME, "worker-2"), ]); let metadata = AzureMetadata::new_function(mocked_env).unwrap(); assert_eq!(metadata.get_instance_name(), "worker-2"); } - #[test] - fn test_instance_name_unknown_sku_falls_back_to_container_name() { - let mocked_env = MockEnv::new(&[ - (FUNCTIONS_WORKER_RUNTIME, "node"), - (WEBSITE_SKU, "PremiumV4"), - ("CONTAINER_NAME", "container-1"), - ]); - let metadata = AzureMetadata::new_function(mocked_env).unwrap(); - assert_eq!(metadata.get_instance_name(), "container-1"); - } - - #[test] - fn test_instance_name_windows_consumption_falls_through_to_computer_name() { - let mocked_env = MockEnv::new(&[ - (FUNCTIONS_WORKER_RUNTIME, "node"), - (WEBSITE_SKU, "Dynamic"), - (INSTANCE_NAME, "10-20-30-40"), - ]); - let metadata = AzureMetadata::new_function(mocked_env).unwrap(); - assert_eq!(metadata.get_instance_name(), "10-20-30-40"); - } - - #[test] - fn test_instance_name_no_sku_prefers_computer_name() { - let mocked_env = MockEnv::new(&[ - (FUNCTIONS_WORKER_RUNTIME, "node"), - ("CONTAINER_NAME", "container-1"), - (INSTANCE_NAME, "worker-1"), - ]); - let metadata = AzureMetadata::new_function(mocked_env).unwrap(); - assert_eq!(metadata.get_instance_name(), "worker-1"); - } - - #[test] - fn test_instance_name_no_sku_falls_back_to_container_name() { - let mocked_env = MockEnv::new(&[ - (FUNCTIONS_WORKER_RUNTIME, "node"), - ("CONTAINER_NAME", "container-1"), - ]); - let metadata = AzureMetadata::new_function(mocked_env).unwrap(); - assert_eq!(metadata.get_instance_name(), "container-1"); - } - #[test] fn test_instance_name_no_instance_vars_is_unknown() { let mocked_env = MockEnv::new(&[(FUNCTIONS_WORKER_RUNTIME, "node")]); From 9e5bad5c12704ad29d510bee8399a1f79563856a Mon Sep 17 00:00:00 2001 From: Kathie Huang Date: Mon, 8 Jun 2026 15:31:08 -0400 Subject: [PATCH 7/8] Update resolve_instance_name function parameters to match priority order --- libdd-common/src/azure_app_services.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libdd-common/src/azure_app_services.rs b/libdd-common/src/azure_app_services.rs index e8372ab424..875ca34ee5 100644 --- a/libdd-common/src/azure_app_services.rs +++ b/libdd-common/src/azure_app_services.rs @@ -259,9 +259,9 @@ impl AzureMetadata { let pod_name = query.get_var(WEBSITE_POD_NAME); let computer_name = query.get_var(INSTANCE_NAME); let instance_name = resolve_instance_name( + computer_name.as_deref(), pod_name.as_deref(), container_name.as_deref(), - computer_name.as_deref(), ); let instance_id = query.get_var(INSTANCE_ID); @@ -412,9 +412,9 @@ impl AzureMetadata { /// Resolves the instance name to match the Azure integration metric's `instance` tag. fn resolve_instance_name( + computer_name: Option<&str>, pod_name: Option<&str>, container_name: Option<&str>, - computer_name: Option<&str>, ) -> Option { fn non_empty(s: Option<&str>) -> Option<&str> { s.map(|v| v.trim()).filter(|v| !v.is_empty()) @@ -1040,6 +1040,7 @@ mod tests { let mocked_env = MockEnv::new(&[ (FUNCTIONS_WORKER_RUNTIME, "node"), (INSTANCE_NAME, "10-20-30-40"), + (WEBSITE_POD_NAME, "pod-1"), (CONTAINER_NAME, "container-1"), ]); let metadata = AzureMetadata::new_function(mocked_env).unwrap(); From aeffe22811c3809f8c3de944faba9fda9e4f777b Mon Sep 17 00:00:00 2001 From: Kathie Huang Date: Thu, 11 Jun 2026 16:27:11 -0400 Subject: [PATCH 8/8] Rename INSTANCE_NAME to COMPUTERNAME --- libdd-common/src/azure_app_services.rs | 28 +++++++++++++------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/libdd-common/src/azure_app_services.rs b/libdd-common/src/azure_app_services.rs index 875ca34ee5..456e6ea6b0 100644 --- a/libdd-common/src/azure_app_services.rs +++ b/libdd-common/src/azure_app_services.rs @@ -11,7 +11,9 @@ const WEBSITE_SITE_NAME: &str = "WEBSITE_SITE_NAME"; const WEBSITE_RESOURCE_GROUP: &str = "WEBSITE_RESOURCE_GROUP"; const SITE_EXTENSION_VERSION: &str = "DD_AAS_DOTNET_EXTENSION_VERSION"; const WEBSITE_OS: &str = "WEBSITE_OS"; -const INSTANCE_NAME: &str = "COMPUTERNAME"; +const COMPUTERNAME: &str = "COMPUTERNAME"; +const CONTAINER_NAME: &str = "CONTAINER_NAME"; +const WEBSITE_POD_NAME: &str = "WEBSITE_POD_NAME"; const INSTANCE_ID: &str = "WEBSITE_INSTANCE_ID"; const SERVICE_CONTEXT: &str = "DD_AZURE_APP_SERVICES"; const FUNCTIONS_WORKER_RUNTIME: &str = "FUNCTIONS_WORKER_RUNTIME"; @@ -20,8 +22,6 @@ const FUNCTIONS_EXTENSION_VERSION: &str = "FUNCTIONS_EXTENSION_VERSION"; const DD_AZURE_RESOURCE_GROUP: &str = "DD_AZURE_RESOURCE_GROUP"; pub const WEBSITE_SKU: &str = "WEBSITE_SKU"; pub const REGION_NAME: &str = "REGION_NAME"; -const CONTAINER_NAME: &str = "CONTAINER_NAME"; -const WEBSITE_POD_NAME: &str = "WEBSITE_POD_NAME"; pub const UNKNOWN_VALUE: &str = "unknown"; @@ -66,7 +66,9 @@ const AAS_VAR_NAMES: &[&str] = &[ WEBSITE_RESOURCE_GROUP, SITE_EXTENSION_VERSION, WEBSITE_OS, - INSTANCE_NAME, + COMPUTERNAME, + CONTAINER_NAME, + WEBSITE_POD_NAME, INSTANCE_ID, SERVICE_CONTEXT, FUNCTIONS_WORKER_RUNTIME, @@ -74,8 +76,6 @@ const AAS_VAR_NAMES: &[&str] = &[ FUNCTIONS_EXTENSION_VERSION, DD_AZURE_RESOURCE_GROUP, WEBSITE_SKU, - CONTAINER_NAME, - WEBSITE_POD_NAME, ]; #[cfg(target_os = "linux")] @@ -255,9 +255,9 @@ impl AzureMetadata { .get_var(WEBSITE_OS) .unwrap_or(std::env::consts::OS.to_string()); - let container_name = query.get_var(CONTAINER_NAME); + let computer_name = query.get_var(COMPUTERNAME); let pod_name = query.get_var(WEBSITE_POD_NAME); - let computer_name = query.get_var(INSTANCE_NAME); + let container_name = query.get_var(CONTAINER_NAME); let instance_name = resolve_instance_name( computer_name.as_deref(), pod_name.as_deref(), @@ -843,7 +843,7 @@ mod tests { (WEBSITE_RESOURCE_GROUP, expected_resource_group.as_str()), (SITE_EXTENSION_VERSION, expected_site_version.as_str()), (WEBSITE_OS, expected_operating_system.as_str()), - (INSTANCE_NAME, expected_instance_name.as_str()), + (COMPUTERNAME, expected_instance_name.as_str()), (INSTANCE_ID, expected_instance_id.as_str()), (SERVICE_CONTEXT, "1"), ( @@ -889,7 +889,7 @@ mod tests { (WEBSITE_RESOURCE_GROUP, expected_resource_group), (SITE_EXTENSION_VERSION, expected_site_version), (WEBSITE_OS, expected_operating_system), - (INSTANCE_NAME, expected_instance_name), + (COMPUTERNAME, expected_instance_name), (INSTANCE_ID, expected_instance_id), (SERVICE_CONTEXT, "1"), ( @@ -961,7 +961,7 @@ mod tests { (WEBSITE_SITE_NAME, expected_site_name), (WEBSITE_RESOURCE_GROUP, expected_resource_group), (WEBSITE_OS, expected_operating_system), - (INSTANCE_NAME, expected_instance_name), + (COMPUTERNAME, expected_instance_name), (INSTANCE_ID, expected_instance_id), (SERVICE_CONTEXT, "1"), ( @@ -1039,7 +1039,7 @@ mod tests { fn test_instance_name_computer_name_wins_over_pod_and_container() { let mocked_env = MockEnv::new(&[ (FUNCTIONS_WORKER_RUNTIME, "node"), - (INSTANCE_NAME, "10-20-30-40"), + (COMPUTERNAME, "10-20-30-40"), (WEBSITE_POD_NAME, "pod-1"), (CONTAINER_NAME, "container-1"), ]); @@ -1074,7 +1074,7 @@ mod tests { (FUNCTIONS_WORKER_RUNTIME, "node"), (CONTAINER_NAME, ""), (WEBSITE_POD_NAME, ""), - (INSTANCE_NAME, "worker-1"), + (COMPUTERNAME, "worker-1"), ]); let metadata = AzureMetadata::new_function(mocked_env).unwrap(); assert_eq!(metadata.get_instance_name(), "worker-1"); @@ -1086,7 +1086,7 @@ mod tests { (FUNCTIONS_WORKER_RUNTIME, "node"), (CONTAINER_NAME, " "), (WEBSITE_POD_NAME, " "), - (INSTANCE_NAME, "worker-2"), + (COMPUTERNAME, "worker-2"), ]); let metadata = AzureMetadata::new_function(mocked_env).unwrap(); assert_eq!(metadata.get_instance_name(), "worker-2");