@@ -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+ ( "aas.resource.id" , self . get_resource_id ( ) ) ,
271+ (
272+ "aas.environment.extension_version" ,
273+ self . get_extension_version ( ) ,
274+ ) ,
275+ ( "aas.environment.instance_id" , self . get_instance_id ( ) ) ,
276+ ( "aas.environment.instance_name" , self . get_instance_name ( ) ) ,
277+ ( "aas.environment.os" , self . get_operating_system ( ) ) ,
278+ ( "aas.environment.runtime" , self . get_runtime ( ) ) ,
279+ (
280+ "aas.environment.runtime_version" ,
281+ self . get_runtime_version ( ) ,
282+ ) ,
283+ (
284+ "aas.environment.function_runtime" ,
285+ self . get_function_runtime_version ( ) ,
286+ ) ,
287+ ( "aas.resource.group" , self . get_resource_group ( ) ) ,
288+ ( "aas.site.name" , self . get_site_name ( ) ) ,
289+ ( "aas.site.kind" , self . get_site_kind ( ) ) ,
290+ ( "aas.site.type" , self . get_site_type ( ) ) ,
291+ ( "aas.subscription.id" , self . get_subscription_id ( ) ) ,
292+ ]
293+ . into_iter ( )
294+ }
266295}
267296
268297pub 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" ) ;
0 commit comments