Skip to content

Commit 607d03e

Browse files
Add OTEL_AWS_APPLICATION_SIGNALS_ENABLED check for Lambda EMF dimensions
Only add Service and Environment dimensions when both: - Running in Lambda environment (is_lambda=True) - Application Signals is enabled (OTEL_AWS_APPLICATION_SIGNALS_ENABLED=true) This aligns the EMF dimension behavior with the Application Signals feature flag. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
1 parent fabb1da commit 607d03e

File tree

2 files changed

+63
-1
lines changed

2 files changed

+63
-1
lines changed

aws-opentelemetry-distro/src/amazon/opentelemetry/distro/exporter/aws/metrics/base_emf_exporter.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import json
77
import logging
88
import math
9+
import os
910
import time
1011
from abc import ABC, abstractmethod
1112
from collections import defaultdict
@@ -206,6 +207,17 @@ def _add_lambda_dimensions(self, emf_log: Dict, dimension_names: List[str], reso
206207
if not self._is_lambda:
207208
return dimension_names
208209

210+
# Only add dimensions when Application Signals is enabled
211+
app_signals_enabled = (
212+
os.environ.get(
213+
"OTEL_AWS_APPLICATION_SIGNALS_ENABLED",
214+
os.environ.get("OTEL_AWS_APP_SIGNALS_ENABLED", "false"),
215+
).lower()
216+
== "true"
217+
)
218+
if not app_signals_enabled:
219+
return dimension_names
220+
209221
service_name, _ = get_service_attribute(resource) if resource else ("UnknownService", True)
210222
# Add dimension values to the EMF log root
211223
emf_log["Service"] = service_name

aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/exporter/aws/metrics/test_base_emf_exporter.py

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
# SPDX-License-Identifier: Apache-2.0
33

4+
import os
45
import unittest
5-
from unittest.mock import Mock
6+
from unittest.mock import Mock, patch
67

78
from amazon.opentelemetry.distro.exporter.aws.metrics.base_emf_exporter import BaseEmfExporter, MetricRecord
89
from opentelemetry.sdk.metrics.export import MetricExportResult
@@ -300,6 +301,7 @@ def test_is_lambda_initialization(self):
300301
exporter = ConcreteEmfExporter(is_lambda=True)
301302
self.assertTrue(exporter._is_lambda)
302303

304+
@patch.dict(os.environ, {"OTEL_AWS_APPLICATION_SIGNALS_ENABLED": "true"})
303305
def test_create_emf_log_with_lambda_dimensions(self):
304306
"""Test EMF log creation includes Service and Environment dimensions in Lambda mode."""
305307
# Create Lambda exporter
@@ -357,6 +359,7 @@ def test_create_emf_log_without_lambda_dimensions(self):
357359
self.assertNotIn("Service", dimensions)
358360
self.assertNotIn("Environment", dimensions)
359361

362+
@patch.dict(os.environ, {"OTEL_AWS_APPLICATION_SIGNALS_ENABLED": "true"})
360363
def test_create_emf_log_lambda_with_unknown_service(self):
361364
"""Test EMF log creation uses UnknownService when service.name is not set in Lambda mode."""
362365
lambda_exporter = ConcreteEmfExporter(namespace="TestNamespace", is_lambda=True)
@@ -376,6 +379,7 @@ def test_create_emf_log_lambda_with_unknown_service(self):
376379
self.assertEqual(result["Service"], "UnknownService")
377380
self.assertEqual(result["Environment"], "lambda:default")
378381

382+
@patch.dict(os.environ, {"OTEL_AWS_APPLICATION_SIGNALS_ENABLED": "true"})
379383
def test_create_emf_log_lambda_with_none_resource(self):
380384
"""Test EMF log creation handles None resource in Lambda mode."""
381385
lambda_exporter = ConcreteEmfExporter(namespace="TestNamespace", is_lambda=True)
@@ -393,6 +397,52 @@ def test_create_emf_log_lambda_with_none_resource(self):
393397
self.assertEqual(result["Service"], "UnknownService")
394398
self.assertEqual(result["Environment"], "lambda:default")
395399

400+
def test_create_emf_log_lambda_without_application_signals_enabled(self):
401+
"""Test EMF log does NOT include Service/Environment when is_lambda=True but app signals disabled."""
402+
# Create Lambda exporter but without OTEL_AWS_APPLICATION_SIGNALS_ENABLED
403+
lambda_exporter = ConcreteEmfExporter(namespace="TestNamespace", is_lambda=True)
404+
405+
record = lambda_exporter._create_metric_record("test_metric", "Count", "Test")
406+
record.value = 50.0
407+
record.timestamp = 1234567890
408+
record.attributes = {"env": "test"}
409+
410+
records = [record]
411+
resource = Resource.create({"service.name": "my-lambda-service"})
412+
413+
result = lambda_exporter._create_emf_log(records, resource, 1234567890)
414+
415+
# Service and Environment should NOT be added when app signals is disabled
416+
self.assertNotIn("Service", result)
417+
self.assertNotIn("Environment", result)
418+
419+
# Check that dimensions do NOT include Service and Environment
420+
cw_metrics = result["_aws"]["CloudWatchMetrics"][0]
421+
dimensions = cw_metrics["Dimensions"][0]
422+
self.assertNotIn("Service", dimensions)
423+
self.assertNotIn("Environment", dimensions)
424+
425+
@patch.dict(os.environ, {"OTEL_AWS_APP_SIGNALS_ENABLED": "true"})
426+
def test_create_emf_log_lambda_with_deprecated_app_signals_env_var(self):
427+
"""Test EMF log includes dimensions when using deprecated OTEL_AWS_APP_SIGNALS_ENABLED."""
428+
lambda_exporter = ConcreteEmfExporter(namespace="TestNamespace", is_lambda=True)
429+
430+
record = lambda_exporter._create_metric_record("test_metric", "Count", "Test")
431+
record.value = 50.0
432+
record.timestamp = 1234567890
433+
record.attributes = {}
434+
435+
records = [record]
436+
resource = Resource.create({"service.name": "my-service"})
437+
438+
result = lambda_exporter._create_emf_log(records, resource, 1234567890)
439+
440+
# Should add dimensions with deprecated env var
441+
self.assertIn("Service", result)
442+
self.assertEqual(result["Service"], "my-service")
443+
self.assertIn("Environment", result)
444+
self.assertEqual(result["Environment"], "lambda:default")
445+
396446

397447
if __name__ == "__main__":
398448
unittest.main()

0 commit comments

Comments
 (0)