11# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22# SPDX-License-Identifier: Apache-2.0
33
4+ import os
45import unittest
5- from unittest .mock import Mock
6+ from unittest .mock import Mock , patch
67
78from amazon .opentelemetry .distro .exporter .aws .metrics .base_emf_exporter import BaseEmfExporter , MetricRecord
89from opentelemetry .sdk .metrics .export import MetricExportResult
@@ -300,25 +301,25 @@ def test_is_lambda_initialization(self):
300301 exporter = ConcreteEmfExporter (is_lambda = True )
301302 self .assertTrue (exporter ._is_lambda )
302303
303- def test_create_emf_log_with_lambda_dimensions ( self ):
304- """Test EMF log creation includes Service and Environment dimensions in Lambda mode."""
305- # Create Lambda exporter
306- lambda_exporter = ConcreteEmfExporter (namespace = "TestNamespace" , is_lambda = True )
304+ @ patch . dict ( os . environ , { "OTEL_AWS_APPLICATION_SIGNALS_ENABLED" : "true" })
305+ def test_create_emf_log_with_app_signals_dimensions ( self ):
306+ """Test EMF log creation includes Service and Environment dimensions when app signals enabled."""
307+ exporter = ConcreteEmfExporter (namespace = "TestNamespace" )
307308
308309 # Create a simple metric record
309- record = lambda_exporter ._create_metric_record ("test_metric" , "Count" , "Test" )
310+ record = exporter ._create_metric_record ("test_metric" , "Count" , "Test" )
310311 record .value = 50.0
311312 record .timestamp = 1234567890
312313 record .attributes = {"env" : "test" }
313314
314315 records = [record ]
315- resource = Resource .create ({"service.name" : "my-lambda- service" })
316+ resource = Resource .create ({"service.name" : "my-service" })
316317
317- result = lambda_exporter ._create_emf_log (records , resource , 1234567890 )
318+ result = exporter ._create_emf_log (records , resource , 1234567890 )
318319
319320 # Check that Service and Environment dimensions are added
320321 self .assertIn ("Service" , result )
321- self .assertEqual (result ["Service" ], "my-lambda- service" )
322+ self .assertEqual (result ["Service" ], "my-service" )
322323 self .assertIn ("Environment" , result )
323324 self .assertEqual (result ["Environment" ], "lambda:default" )
324325
@@ -331,21 +332,21 @@ def test_create_emf_log_with_lambda_dimensions(self):
331332 self .assertEqual (dimensions [0 ], "Service" )
332333 self .assertEqual (dimensions [1 ], "Environment" )
333334
334- def test_create_emf_log_without_lambda_dimensions (self ):
335- """Test EMF log creation does NOT include Service and Environment dimensions when not Lambda ."""
336- # Create non-Lambda exporter (default)
337- non_lambda_exporter = ConcreteEmfExporter (namespace = "TestNamespace" , is_lambda = False )
335+ def test_create_emf_log_without_app_signals_dimensions (self ):
336+ """Test EMF log creation does NOT include Service and Environment dimensions when app signals disabled ."""
337+ # App signals not enabled (default)
338+ exporter = ConcreteEmfExporter (namespace = "TestNamespace" )
338339
339340 # Create a simple metric record
340- record = non_lambda_exporter ._create_metric_record ("test_metric" , "Count" , "Test" )
341+ record = exporter ._create_metric_record ("test_metric" , "Count" , "Test" )
341342 record .value = 50.0
342343 record .timestamp = 1234567890
343344 record .attributes = {"env" : "test" }
344345
345346 records = [record ]
346347 resource = Resource .create ({"service.name" : "my-service" })
347348
348- result = non_lambda_exporter ._create_emf_log (records , resource , 1234567890 )
349+ result = exporter ._create_emf_log (records , resource , 1234567890 )
349350
350351 # Check that Service and Environment dimensions are NOT added
351352 self .assertNotIn ("Service" , result )
@@ -357,11 +358,12 @@ def test_create_emf_log_without_lambda_dimensions(self):
357358 self .assertNotIn ("Service" , dimensions )
358359 self .assertNotIn ("Environment" , dimensions )
359360
360- def test_create_emf_log_lambda_with_unknown_service (self ):
361- """Test EMF log creation uses UnknownService when service.name is not set in Lambda mode."""
362- lambda_exporter = ConcreteEmfExporter (namespace = "TestNamespace" , is_lambda = True )
361+ @patch .dict (os .environ , {"OTEL_AWS_APPLICATION_SIGNALS_ENABLED" : "true" })
362+ def test_create_emf_log_with_unknown_service (self ):
363+ """Test EMF log creation uses UnknownService when service.name is not set."""
364+ exporter = ConcreteEmfExporter (namespace = "TestNamespace" )
363365
364- record = lambda_exporter ._create_metric_record ("test_metric" , "Count" , "Test" )
366+ record = exporter ._create_metric_record ("test_metric" , "Count" , "Test" )
365367 record .value = 50.0
366368 record .timestamp = 1234567890
367369 record .attributes = {}
@@ -370,29 +372,72 @@ def test_create_emf_log_lambda_with_unknown_service(self):
370372 # Resource with unknown_service prefix
371373 resource = Resource .create ({"service.name" : "unknown_service:python" })
372374
373- result = lambda_exporter ._create_emf_log (records , resource , 1234567890 )
375+ result = exporter ._create_emf_log (records , resource , 1234567890 )
374376
375377 # Should fall back to UnknownService
376378 self .assertEqual (result ["Service" ], "UnknownService" )
377379 self .assertEqual (result ["Environment" ], "lambda:default" )
378380
379- def test_create_emf_log_lambda_with_none_resource (self ):
380- """Test EMF log creation handles None resource in Lambda mode."""
381- lambda_exporter = ConcreteEmfExporter (namespace = "TestNamespace" , is_lambda = True )
381+ @patch .dict (os .environ , {"OTEL_AWS_APPLICATION_SIGNALS_ENABLED" : "true" })
382+ def test_create_emf_log_with_none_resource (self ):
383+ """Test EMF log creation handles None resource gracefully."""
384+ exporter = ConcreteEmfExporter (namespace = "TestNamespace" )
382385
383- record = lambda_exporter ._create_metric_record ("test_metric" , "Count" , "Test" )
386+ record = exporter ._create_metric_record ("test_metric" , "Count" , "Test" )
384387 record .value = 50.0
385388 record .timestamp = 1234567890
386389 record .attributes = {}
387390
388391 records = [record ]
389392
390- result = lambda_exporter ._create_emf_log (records , None , 1234567890 )
393+ result = exporter ._create_emf_log (records , None , 1234567890 )
391394
392395 # Should handle None resource gracefully
393396 self .assertEqual (result ["Service" ], "UnknownService" )
394397 self .assertEqual (result ["Environment" ], "lambda:default" )
395398
399+ @patch .dict (os .environ , {"OTEL_AWS_APP_SIGNALS_ENABLED" : "true" })
400+ def test_create_emf_log_with_deprecated_app_signals_env_var (self ):
401+ """Test EMF log includes dimensions when using deprecated OTEL_AWS_APP_SIGNALS_ENABLED."""
402+ exporter = ConcreteEmfExporter (namespace = "TestNamespace" )
403+
404+ record = exporter ._create_metric_record ("test_metric" , "Count" , "Test" )
405+ record .value = 50.0
406+ record .timestamp = 1234567890
407+ record .attributes = {}
408+
409+ records = [record ]
410+ resource = Resource .create ({"service.name" : "my-service" })
411+
412+ result = exporter ._create_emf_log (records , resource , 1234567890 )
413+
414+ # Should add dimensions with deprecated env var
415+ self .assertIn ("Service" , result )
416+ self .assertEqual (result ["Service" ], "my-service" )
417+ self .assertIn ("Environment" , result )
418+ self .assertEqual (result ["Environment" ], "lambda:default" )
419+
420+ @patch .dict (os .environ , {"OTEL_AWS_APPLICATION_SIGNALS_ENABLED" : "true" })
421+ def test_create_emf_log_with_custom_deployment_environment (self ):
422+ """Test EMF log uses deployment.environment from resource when set."""
423+ exporter = ConcreteEmfExporter (namespace = "TestNamespace" )
424+
425+ record = exporter ._create_metric_record ("test_metric" , "Count" , "Test" )
426+ record .value = 50.0
427+ record .timestamp = 1234567890
428+ record .attributes = {}
429+
430+ records = [record ]
431+ resource = Resource .create ({"service.name" : "my-service" , "deployment.environment" : "production" })
432+
433+ result = exporter ._create_emf_log (records , resource , 1234567890 )
434+
435+ # Should use custom deployment.environment
436+ self .assertIn ("Service" , result )
437+ self .assertEqual (result ["Service" ], "my-service" )
438+ self .assertIn ("Environment" , result )
439+ self .assertEqual (result ["Environment" ], "production" )
440+
396441
397442if __name__ == "__main__" :
398443 unittest .main ()
0 commit comments