@@ -5,7 +5,7 @@ use regex::Regex;
5
5
use std:: env;
6
6
use std:: sync:: LazyLock ;
7
7
8
- const WEBSITE_ONWER_NAME : & str = "WEBSITE_OWNER_NAME" ;
8
+ const WEBSITE_OWNER_NAME : & str = "WEBSITE_OWNER_NAME" ;
9
9
const WEBSITE_SITE_NAME : & str = "WEBSITE_SITE_NAME" ;
10
10
const WEBSITE_RESOURCE_GROUP : & str = "WEBSITE_RESOURCE_GROUP" ;
11
11
const SITE_EXTENSION_VERSION : & str = "DD_AAS_DOTNET_EXTENSION_VERSION" ;
@@ -16,6 +16,8 @@ const SERVICE_CONTEXT: &str = "DD_AZURE_APP_SERVICES";
16
16
const FUNCTIONS_WORKER_RUNTIME : & str = "FUNCTIONS_WORKER_RUNTIME" ;
17
17
const FUNCTIONS_WORKER_RUNTIME_VERSION : & str = "FUNCTIONS_WORKER_RUNTIME_VERSION" ;
18
18
const FUNCTIONS_EXTENSION_VERSION : & str = "FUNCTIONS_EXTENSION_VERSION" ;
19
+ const DD_AZURE_RESOURCE_GROUP : & str = "DD_AZURE_RESOURCE_GROUP" ;
20
+ const WEBSITE_SKU : & str = "WEBSITE_SKU" ;
19
21
20
22
const UNKNOWN_VALUE : & str = "unknown" ;
21
23
@@ -131,7 +133,7 @@ impl AzureMetadata {
131
133
132
134
fn build_metadata < T : QueryEnv > ( query : T ) -> Option < Self > {
133
135
let subscription_id =
134
- AzureMetadata :: extract_subscription_id ( query. get_var ( WEBSITE_ONWER_NAME ) ) ;
136
+ AzureMetadata :: extract_subscription_id ( query. get_var ( WEBSITE_OWNER_NAME ) ) ;
135
137
let site_name = query. get_var ( WEBSITE_SITE_NAME ) ;
136
138
137
139
let ( site_kind, site_type) = match AzureMetadata :: get_azure_context ( & query) {
@@ -140,8 +142,20 @@ impl AzureMetadata {
140
142
} ;
141
143
142
144
let resource_group = query
143
- . get_var ( WEBSITE_RESOURCE_GROUP )
144
- . or_else ( || AzureMetadata :: extract_resource_group ( query. get_var ( WEBSITE_ONWER_NAME ) ) ) ;
145
+ . get_var ( DD_AZURE_RESOURCE_GROUP )
146
+ . or_else ( || query. get_var ( WEBSITE_RESOURCE_GROUP ) )
147
+ . or_else ( || {
148
+ // Check if we're in flex consumption plan first
149
+ match query. get_var ( WEBSITE_SKU ) . as_deref ( ) {
150
+ Some ( "FlexConsumption" ) => None ,
151
+ /* Flex Consumption plans need the `DD_AZURE_RESOURCE_GROUP` env var. If this
152
+ * logic ever changes, update the logic in
153
+ * `serverless-components/src/datadog-trace-agent` and the serverless compat
154
+ * layers accordingly. */
155
+ _ => AzureMetadata :: extract_resource_group ( query. get_var ( WEBSITE_OWNER_NAME ) ) ,
156
+ }
157
+ } ) ;
158
+
145
159
let resource_id = AzureMetadata :: build_resource_id (
146
160
subscription_id. as_ref ( ) ,
147
161
site_name. as_ref ( ) ,
@@ -262,7 +276,7 @@ mod tests {
262
276
263
277
use indexmap:: IndexMap ;
264
278
265
- use crate :: azure_app_services:: { QueryEnv , WEBSITE_ONWER_NAME } ;
279
+ use crate :: azure_app_services:: { QueryEnv , WEBSITE_OWNER_NAME } ;
266
280
267
281
use super :: * ;
268
282
@@ -353,7 +367,7 @@ mod tests {
353
367
354
368
#[ test]
355
369
fn test_extract_subscription_without_plus_sign ( ) {
356
- let mocked_env = MockEnv :: new ( & [ ( WEBSITE_ONWER_NAME , "foo" ) , ( SERVICE_CONTEXT , "1" ) ] ) ;
370
+ let mocked_env = MockEnv :: new ( & [ ( WEBSITE_OWNER_NAME , "foo" ) , ( SERVICE_CONTEXT , "1" ) ] ) ;
357
371
358
372
let metadata = AzureMetadata :: new ( mocked_env) . unwrap ( ) ;
359
373
@@ -364,7 +378,7 @@ mod tests {
364
378
365
379
#[ test]
366
380
fn test_extract_subscription_with_plus_sign ( ) {
367
- let mocked_env = MockEnv :: new ( & [ ( WEBSITE_ONWER_NAME , "foo+bar" ) , ( SERVICE_CONTEXT , "1" ) ] ) ;
381
+ let mocked_env = MockEnv :: new ( & [ ( WEBSITE_OWNER_NAME , "foo+bar" ) , ( SERVICE_CONTEXT , "1" ) ] ) ;
368
382
369
383
let metadata = AzureMetadata :: new ( mocked_env) . unwrap ( ) ;
370
384
@@ -374,7 +388,7 @@ mod tests {
374
388
375
389
#[ test]
376
390
fn test_extract_subscription_with_empty_string ( ) {
377
- let mocked_env = MockEnv :: new ( & [ ( WEBSITE_ONWER_NAME , "" ) , ( SERVICE_CONTEXT , "1" ) ] ) ;
391
+ let mocked_env = MockEnv :: new ( & [ ( WEBSITE_OWNER_NAME , "" ) , ( SERVICE_CONTEXT , "1" ) ] ) ;
378
392
379
393
let metadata = AzureMetadata :: new ( mocked_env) . unwrap ( ) ;
380
394
@@ -383,7 +397,7 @@ mod tests {
383
397
384
398
#[ test]
385
399
fn test_extract_subscription_with_only_whitespaces ( ) {
386
- let mocked_env = MockEnv :: new ( & [ ( WEBSITE_ONWER_NAME , " " ) , ( SERVICE_CONTEXT , "1" ) ] ) ;
400
+ let mocked_env = MockEnv :: new ( & [ ( WEBSITE_OWNER_NAME , " " ) , ( SERVICE_CONTEXT , "1" ) ] ) ;
387
401
388
402
let metadata = AzureMetadata :: new ( mocked_env) . unwrap ( ) ;
389
403
@@ -392,7 +406,7 @@ mod tests {
392
406
393
407
#[ test]
394
408
fn test_extract_subscription_with_only_plus_sign ( ) {
395
- let mocked_env = MockEnv :: new ( & [ ( WEBSITE_ONWER_NAME , "+" ) , ( SERVICE_CONTEXT , "1" ) ] ) ;
409
+ let mocked_env = MockEnv :: new ( & [ ( WEBSITE_OWNER_NAME , "+" ) , ( SERVICE_CONTEXT , "1" ) ] ) ;
396
410
397
411
let metadata = AzureMetadata :: new ( mocked_env) . unwrap ( ) ;
398
412
@@ -401,7 +415,7 @@ mod tests {
401
415
402
416
#[ test]
403
417
fn test_extract_subscription_with_whitespaces_separated_by_plus ( ) {
404
- let mocked_env = MockEnv :: new ( & [ ( WEBSITE_ONWER_NAME , " + " ) , ( SERVICE_CONTEXT , "1" ) ] ) ;
418
+ let mocked_env = MockEnv :: new ( & [ ( WEBSITE_OWNER_NAME , " + " ) , ( SERVICE_CONTEXT , "1" ) ] ) ;
405
419
406
420
let metadata = AzureMetadata :: new ( mocked_env) . unwrap ( ) ;
407
421
@@ -410,7 +424,7 @@ mod tests {
410
424
411
425
#[ test]
412
426
fn test_extract_subscription_plus_sign_and_other_string ( ) {
413
- let mocked_env = MockEnv :: new ( & [ ( WEBSITE_ONWER_NAME , "+other" ) , ( SERVICE_CONTEXT , "1" ) ] ) ;
427
+ let mocked_env = MockEnv :: new ( & [ ( WEBSITE_OWNER_NAME , "+other" ) , ( SERVICE_CONTEXT , "1" ) ] ) ;
414
428
415
429
let metadata = AzureMetadata :: new ( mocked_env) . unwrap ( ) ;
416
430
@@ -421,7 +435,7 @@ mod tests {
421
435
fn test_extract_resource_group_pattern_match_linux ( ) {
422
436
let mocked_env = MockEnv :: new ( & [
423
437
(
424
- WEBSITE_ONWER_NAME ,
438
+ WEBSITE_OWNER_NAME ,
425
439
"00000000-0000-0000-0000-000000000000+test-rg-EastUSwebspace-Linux" ,
426
440
) ,
427
441
( "FUNCTIONS_WORKER_RUNTIME" , "node" ) ,
@@ -439,7 +453,7 @@ mod tests {
439
453
fn test_extract_resource_group_pattern_match_windows ( ) {
440
454
let mocked_env = MockEnv :: new ( & [
441
455
(
442
- WEBSITE_ONWER_NAME ,
456
+ WEBSITE_OWNER_NAME ,
443
457
"00000000-0000-0000-0000-000000000000+test-rg-EastUSwebspace" ,
444
458
) ,
445
459
( "FUNCTIONS_WORKER_RUNTIME" , "node" ) ,
@@ -456,7 +470,7 @@ mod tests {
456
470
#[ test]
457
471
fn test_extract_resource_group_no_pattern_match ( ) {
458
472
let mocked_env = MockEnv :: new ( & [
459
- ( WEBSITE_ONWER_NAME , "foo" ) ,
473
+ ( WEBSITE_OWNER_NAME , "foo" ) ,
460
474
( FUNCTIONS_WORKER_RUNTIME , "node" ) ,
461
475
( FUNCTIONS_EXTENSION_VERSION , "~4" ) ,
462
476
] ) ;
@@ -471,10 +485,11 @@ mod tests {
471
485
let mocked_env = MockEnv :: new ( & [
472
486
( WEBSITE_RESOURCE_GROUP , "test-rg-env-var" ) ,
473
487
(
474
- WEBSITE_ONWER_NAME ,
488
+ WEBSITE_OWNER_NAME ,
475
489
"00000000-0000-0000-0000-000000000000+test-rg-EastUSwebspace-Linux" ,
476
490
) ,
477
491
( SERVICE_CONTEXT , "1" ) ,
492
+ ( WEBSITE_SKU , "ElasticPremium" ) ,
478
493
] ) ;
479
494
480
495
let metadata = AzureMetadata :: new ( mocked_env) . unwrap ( ) ;
@@ -484,10 +499,66 @@ mod tests {
484
499
assert_eq ! ( metadata. get_resource_group( ) , expected_resource_group) ;
485
500
}
486
501
502
+ #[ test]
503
+ fn test_flex_consumption_resource_group_is_none_without_dd_azure_resource_group ( ) {
504
+ let mocked_env = MockEnv :: new ( & [
505
+ (
506
+ WEBSITE_OWNER_NAME ,
507
+ "00000000-0000-0000-0000-000000000000+flex-EastUSwebspace-Linux" ,
508
+ ) ,
509
+ ( WEBSITE_SKU , "FlexConsumption" ) ,
510
+ ( SERVICE_CONTEXT , "1" ) ,
511
+ ] ) ;
512
+
513
+ let metadata = AzureMetadata :: new ( mocked_env) . unwrap ( ) ;
514
+
515
+ assert_eq ! ( metadata. get_resource_group( ) , UNKNOWN_VALUE ) ;
516
+ }
517
+
518
+ #[ test]
519
+ fn test_flex_consumption_uses_dd_azure_resource_group ( ) {
520
+ let mocked_env = MockEnv :: new ( & [
521
+ (
522
+ WEBSITE_OWNER_NAME ,
523
+ "00000000-0000-0000-0000-000000000000+flex-EastUSwebspace-Linux" ,
524
+ ) ,
525
+ ( DD_AZURE_RESOURCE_GROUP , "test-flex-rg" ) ,
526
+ ( WEBSITE_SKU , "FlexConsumption" ) ,
527
+ ( SERVICE_CONTEXT , "1" ) ,
528
+ ] ) ;
529
+
530
+ let metadata = AzureMetadata :: new ( mocked_env) . unwrap ( ) ;
531
+
532
+ // Should use the DD_AZURE_RESOURCE_GROUP value instead of extracting from
533
+ // WEBSITE_OWNER_NAME
534
+ assert_eq ! ( metadata. get_resource_group( ) , "test-flex-rg" ) ;
535
+ }
536
+
537
+ #[ test]
538
+ fn test_dd_azure_resource_group_has_highest_priority ( ) {
539
+ let mocked_env = MockEnv :: new ( & [
540
+ ( WEBSITE_RESOURCE_GROUP , "test-rg-env-var" ) ,
541
+ (
542
+ WEBSITE_OWNER_NAME ,
543
+ "00000000-0000-0000-0000-000000000000+test-rg-EastUSwebspace-Linux" ,
544
+ ) ,
545
+ ( DD_AZURE_RESOURCE_GROUP , "dd-azure-rg-override" ) ,
546
+ ( SERVICE_CONTEXT , "1" ) ,
547
+ ] ) ;
548
+
549
+ let metadata = AzureMetadata :: new ( mocked_env) . unwrap ( ) ;
550
+
551
+ // DD_AZURE_RESOURCE_GROUP should have highest priority over WEBSITE_RESOURCE_GROUP and
552
+ // WEBSITE_OWNER_NAME
553
+ let expected_resource_group = "dd-azure-rg-override" ;
554
+
555
+ assert_eq ! ( metadata. get_resource_group( ) , expected_resource_group) ;
556
+ }
557
+
487
558
#[ test]
488
559
fn test_build_resource_id ( ) {
489
560
let mocked_env = MockEnv :: new ( & [
490
- ( WEBSITE_ONWER_NAME , "foo" ) ,
561
+ ( WEBSITE_OWNER_NAME , "foo" ) ,
491
562
( WEBSITE_SITE_NAME , "my_website" ) ,
492
563
( WEBSITE_RESOURCE_GROUP , "resource_group" ) ,
493
564
( SERVICE_CONTEXT , "1" ) ,
@@ -517,7 +588,7 @@ mod tests {
517
588
#[ test]
518
589
fn test_build_resource_id_with_missing_site_name ( ) {
519
590
let mocked_env = MockEnv :: new ( & [
520
- ( WEBSITE_ONWER_NAME , "foo" ) ,
591
+ ( WEBSITE_OWNER_NAME , "foo" ) ,
521
592
( WEBSITE_RESOURCE_GROUP , "resource_group" ) ,
522
593
( SERVICE_CONTEXT , "1" ) ,
523
594
] ) ;
@@ -530,7 +601,7 @@ mod tests {
530
601
#[ test]
531
602
fn test_build_resource_id_with_missing_resource_group ( ) {
532
603
let mocked_env = MockEnv :: new ( & [
533
- ( WEBSITE_ONWER_NAME , "foo" ) ,
604
+ ( WEBSITE_OWNER_NAME , "foo" ) ,
534
605
( WEBSITE_SITE_NAME , "my_website" ) ,
535
606
( SERVICE_CONTEXT , "1" ) ,
536
607
] ) ;
0 commit comments