Skip to content

Commit 33681af

Browse files
committed
feat: unify Azure tags
1 parent 72e56a3 commit 33681af

File tree

3 files changed

+123
-54
lines changed

3 files changed

+123
-54
lines changed

libdd-common/src/azure_app_services.rs

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,35 @@ impl AzureMetadata {
263263
pub fn get_function_runtime_version(&self) -> &str {
264264
get_value_or_unknown!(self.function_runtime_version)
265265
}
266+
267+
/// Returns all Azure App Services tags as an iterator of (tag_name, tag_value) tuples.
268+
pub fn get_all_tags(&self) -> impl ExactSizeIterator<Item = (&'static str, &str)> {
269+
[
270+
(
271+
"aas.environment.extension_version",
272+
self.get_extension_version(),
273+
),
274+
(
275+
"aas.environment.function_runtime",
276+
self.get_function_runtime_version(),
277+
),
278+
("aas.environment.instance_id", self.get_instance_id()),
279+
("aas.environment.instance_name", self.get_instance_name()),
280+
("aas.environment.os", self.get_operating_system()),
281+
("aas.environment.runtime", self.get_runtime()),
282+
(
283+
"aas.environment.runtime_version",
284+
self.get_runtime_version(),
285+
),
286+
("aas.resource.group", self.get_resource_group()),
287+
("aas.resource.id", self.get_resource_id()),
288+
("aas.site.kind", self.get_site_kind()),
289+
("aas.site.name", self.get_site_name()),
290+
("aas.site.type", self.get_site_type()),
291+
("aas.subscription.id", self.get_subscription_id()),
292+
]
293+
.into_iter()
294+
}
266295
}
267296

268297
pub static AAS_METADATA: LazyLock<Option<AzureMetadata>> =
@@ -712,6 +741,90 @@ mod tests {
712741
assert_eq!(expected_runtime_version, metadata.get_runtime_version());
713742
}
714743

744+
#[test]
745+
fn test_get_all_tags() {
746+
let expected_site_name = "my_site_name";
747+
let expected_resource_group = "my_resource_group";
748+
let expected_site_version = "v42";
749+
let expected_operating_system = "FreeBSD";
750+
let expected_instance_name = "my_instance_name";
751+
let expected_instance_id = "my_instance_id";
752+
let expected_function_extension_version = "~4";
753+
let expected_runtime = "node";
754+
let expected_runtime_version = "18";
755+
let expected_subscription_id = "sub-123";
756+
let expected_resource_id = "/subscriptions/sub-123/resourcegroups/my_resource_group/providers/microsoft.web/sites/my_site_name";
757+
758+
let mocked_env = MockEnv::new(&[
759+
(WEBSITE_SITE_NAME, expected_site_name),
760+
(WEBSITE_RESOURCE_GROUP, expected_resource_group),
761+
(SITE_EXTENSION_VERSION, expected_site_version),
762+
(WEBSITE_OS, expected_operating_system),
763+
(INSTANCE_NAME, expected_instance_name),
764+
(INSTANCE_ID, expected_instance_id),
765+
(SERVICE_CONTEXT, "1"),
766+
(
767+
FUNCTIONS_EXTENSION_VERSION,
768+
expected_function_extension_version,
769+
),
770+
(FUNCTIONS_WORKER_RUNTIME, expected_runtime),
771+
(FUNCTIONS_WORKER_RUNTIME_VERSION, expected_runtime_version),
772+
(
773+
WEBSITE_OWNER_NAME,
774+
&format!("{}+rg-webspace", expected_subscription_id),
775+
),
776+
]);
777+
778+
let metadata = AzureMetadata::new(mocked_env).unwrap();
779+
780+
// Collect tags into a HashMap for easy lookup
781+
let tags: std::collections::HashMap<&str, &str> = metadata.get_all_tags().collect();
782+
783+
// Verify all 13 tags are present
784+
assert_eq!(tags.len(), 13);
785+
assert_eq!(tags.get("aas.resource.id"), Some(&expected_resource_id));
786+
assert_eq!(
787+
tags.get("aas.environment.extension_version"),
788+
Some(&expected_site_version)
789+
);
790+
assert_eq!(
791+
tags.get("aas.environment.instance_id"),
792+
Some(&expected_instance_id)
793+
);
794+
assert_eq!(
795+
tags.get("aas.environment.instance_name"),
796+
Some(&expected_instance_name)
797+
);
798+
assert_eq!(
799+
tags.get("aas.environment.os"),
800+
Some(&expected_operating_system)
801+
);
802+
assert_eq!(tags.get("aas.environment.runtime"), Some(&expected_runtime));
803+
assert_eq!(
804+
tags.get("aas.environment.runtime_version"),
805+
Some(&expected_runtime_version)
806+
);
807+
assert_eq!(
808+
tags.get("aas.environment.function_runtime"),
809+
Some(&expected_function_extension_version)
810+
);
811+
assert_eq!(
812+
tags.get("aas.resource.group"),
813+
Some(&expected_resource_group)
814+
);
815+
assert_eq!(tags.get("aas.site.name"), Some(&expected_site_name));
816+
assert_eq!(tags.get("aas.site.kind"), Some(&"functionapp"));
817+
assert_eq!(tags.get("aas.site.type"), Some(&"function"));
818+
assert_eq!(
819+
tags.get("aas.subscription.id"),
820+
Some(&expected_subscription_id)
821+
);
822+
823+
// Verify it's an ExactSizeIterator
824+
let iter = metadata.get_all_tags();
825+
assert_eq!(iter.len(), 13);
826+
}
827+
715828
#[test]
716829
fn test_get_trimmed_env_var_empty_string() {
717830
env::remove_var("TEST_VAR_NONE");

libdd-profiling/src/exporter/profile_exporter.rs

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -110,31 +110,9 @@ impl ProfileExporter {
110110

111111
// Add Azure App Services tags if available
112112
if let Some(aas) = &*azure_app_services::AAS_METADATA {
113-
let aas_tags = [
114-
("aas.resource.id", aas.get_resource_id()),
115-
(
116-
"aas.environment.extension_version",
117-
aas.get_extension_version(),
118-
),
119-
("aas.environment.instance_id", aas.get_instance_id()),
120-
("aas.environment.instance_name", aas.get_instance_name()),
121-
("aas.environment.os", aas.get_operating_system()),
122-
("aas.resource.group", aas.get_resource_group()),
123-
("aas.site.name", aas.get_site_name()),
124-
("aas.site.kind", aas.get_site_kind()),
125-
("aas.site.type", aas.get_site_type()),
126-
("aas.subscription.id", aas.get_subscription_id()),
127-
];
128-
129-
// Avoid infallible allocation paths when adding the Azure tags.
130-
// This is an upper bound since Tag::new can fail and we'll skip invalid tags.
131-
tags.try_reserve(aas_tags.len())?;
132-
133-
tags.extend(
134-
aas_tags
135-
.into_iter()
136-
.filter_map(|(name, value)| Tag::new(name, value).ok()),
137-
);
113+
let aas_tags_iter = aas.get_all_tags();
114+
tags.try_reserve(aas_tags_iter.len())?;
115+
tags.extend(aas_tags_iter.filter_map(|(name, value)| Tag::new(name, value).ok()));
138116
}
139117

140118
// Precompute the base tags string (includes configured tags + Azure App Services tags)

libdd-trace-utils/src/trace_utils.rs

Lines changed: 7 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -555,35 +555,11 @@ pub fn enrich_span_with_azure_function_metadata(span: &mut pb::Span) {
555555
}
556556

557557
if let Some(aas_metadata) = &*azure_app_services::AAS_METADATA_FUNCTION {
558-
let aas_tags = [
559-
("aas.resource.id", aas_metadata.get_resource_id()),
560-
(
561-
"aas.environment.instance_id",
562-
aas_metadata.get_instance_id(),
563-
),
564-
(
565-
"aas.environment.instance_name",
566-
aas_metadata.get_instance_name(),
567-
),
568-
("aas.subscription.id", aas_metadata.get_subscription_id()),
569-
("aas.environment.os", aas_metadata.get_operating_system()),
570-
("aas.environment.runtime", aas_metadata.get_runtime()),
571-
(
572-
"aas.environment.runtime_version",
573-
aas_metadata.get_runtime_version(),
574-
),
575-
(
576-
"aas.environment.function_runtime",
577-
aas_metadata.get_function_runtime_version(),
578-
),
579-
("aas.resource.group", aas_metadata.get_resource_group()),
580-
("aas.site.name", aas_metadata.get_site_name()),
581-
("aas.site.kind", aas_metadata.get_site_kind()),
582-
("aas.site.type", aas_metadata.get_site_type()),
583-
];
584-
aas_tags.into_iter().for_each(|(name, value)| {
585-
span.meta.insert(name.to_string(), value.to_string());
586-
});
558+
span.meta.extend(
559+
aas_metadata
560+
.get_all_tags()
561+
.map(|(name, value)| (name.to_string(), value.to_string())),
562+
);
587563
}
588564
}
589565

@@ -1261,6 +1237,7 @@ mod tests {
12611237
// This test primarily ensures the function doesn't skip non-apim spans
12621238
if azure_app_services::AAS_METADATA_FUNCTION.is_some() {
12631239
assert!(span.meta.contains_key("aas.resource.id"));
1240+
assert!(span.meta.contains_key("aas.environment.extension_version"));
12641241
assert!(span.meta.contains_key("aas.environment.instance_id"));
12651242
assert!(span.meta.contains_key("aas.environment.instance_name"));
12661243
assert!(span.meta.contains_key("aas.subscription.id"));
@@ -1284,6 +1261,7 @@ mod tests {
12841261

12851262
// Verify no aas.* tags were added
12861263
assert!(!span.meta.contains_key("aas.resource.id"));
1264+
assert!(!span.meta.contains_key("aas.environment.extension_version"));
12871265
assert!(!span.meta.contains_key("aas.environment.instance_id"));
12881266
assert!(!span.meta.contains_key("aas.environment.instance_name"));
12891267
assert!(!span.meta.contains_key("aas.subscription.id"));

0 commit comments

Comments
 (0)