Skip to content

Commit 2e803bf

Browse files
committed
fix: prefer DD_SERVICE as the inferred span service name
When DD_SERVICE (config.service) is set, use it as the service for inferred (synthetic) spans, taking precedence over DD_SERVICE_MAPPING and the AWS service representation. When DD_SERVICE is unset, the existing resolution logic is preserved.
1 parent 3bf5778 commit 2e803bf

3 files changed

Lines changed: 103 additions & 37 deletions

File tree

datadog_lambda/config.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ def _resolve_env(self, key, default=None, cast=None, depends_on_tracing=False):
7575
add_span_pointers = _get_env("DD_BOTOCORE_ADD_SPAN_POINTERS", "true", as_bool)
7676
trace_extractor = _get_env("DD_TRACE_EXTRACTOR")
7777

78+
aws_service_representation_enabled = _get_env(
79+
"DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED", "true", as_bool
80+
)
81+
7882
enhanced_metrics_enabled = _get_env("DD_ENHANCED_METRICS", "true", as_bool)
7983

8084
flush_in_thread = _get_env("DD_FLUSH_IN_THREAD", "false", as_bool)

datadog_lambda/tracing.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -893,6 +893,12 @@ def create_service_mapping(val):
893893
def determine_service_name(
894894
service_mapping, specific_key, generic_key, extracted_key, fallback=None
895895
):
896+
# DD_SERVICE (the base service name) takes top priority for inferred
897+
# (synthetic) spans. When it is set, use it as the service regardless of
898+
# any AWS service representation or service mapping.
899+
if config.service:
900+
return config.service
901+
896902
# Check for mapped service (specific key first, then generic key)
897903
mapped_service = service_mapping.get(specific_key) or service_mapping.get(
898904
generic_key
@@ -901,10 +907,7 @@ def determine_service_name(
901907
return mapped_service
902908

903909
# Check if AWS service representation is disabled
904-
aws_service_representation = os.environ.get(
905-
"DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED", ""
906-
).lower()
907-
if aws_service_representation in ("false", "0"):
910+
if not config.aws_service_representation_enabled:
908911
return fallback
909912

910913
# Use extracted_key if it exists and is not empty, otherwise use fallback

tests/test_tracing.py

Lines changed: 92 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1467,6 +1467,7 @@ def test_set_service_mapping(self):
14671467
self.set_service_mapping(new_service_mapping)
14681468
self.assertEqual(self.get_service_mapping(), new_service_mapping)
14691469

1470+
@patch("datadog_lambda.config.Config.service", None)
14701471
def test_determine_service_name(self):
14711472
# Prepare the environment
14721473
os.environ["DD_SERVICE_MAPPING"] = "api1:service1,api2:service2"
@@ -1501,44 +1502,102 @@ def test_determine_service_name(self):
15011502
"default",
15021503
)
15031504

1504-
# Test with DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED set to false
1505-
os.environ["DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED"] = "false"
1506-
self.assertEqual(
1507-
determine_service_name(
1508-
self.get_service_mapping(), "api4", "api4", "extracted", "fallback"
1509-
),
1510-
"fallback",
1511-
)
1512-
1513-
# Test with DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED set to 0
1514-
os.environ["DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED"] = "0"
1515-
self.assertEqual(
1516-
determine_service_name(
1517-
self.get_service_mapping(), "api4", "api4", "extracted", "fallback"
1518-
),
1519-
"fallback",
1520-
)
1505+
# Test with DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED disabled
1506+
with patch(
1507+
"datadog_lambda.config.Config.aws_service_representation_enabled", False
1508+
):
1509+
self.assertEqual(
1510+
determine_service_name(
1511+
self.get_service_mapping(),
1512+
"api4",
1513+
"api4",
1514+
"extracted",
1515+
"fallback",
1516+
),
1517+
"fallback",
1518+
)
15211519

1522-
# Test with DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED not set (default behavior)
1523-
if "DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED" in os.environ:
1524-
del os.environ["DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED"]
1525-
self.assertEqual(
1526-
determine_service_name(
1527-
self.get_service_mapping(), "api4", "api4", "extracted", "fallback"
1528-
),
1529-
"extracted",
1530-
)
1520+
# Test with DD_TRACE_AWS_SERVICE_REPRESENTATION_ENABLED enabled (default)
1521+
with patch(
1522+
"datadog_lambda.config.Config.aws_service_representation_enabled", True
1523+
):
1524+
self.assertEqual(
1525+
determine_service_name(
1526+
self.get_service_mapping(),
1527+
"api4",
1528+
"api4",
1529+
"extracted",
1530+
"fallback",
1531+
),
1532+
"extracted",
1533+
)
15311534

1532-
# Test with empty extracted key
1533-
self.assertEqual(
1534-
determine_service_name(
1535-
self.get_service_mapping(), "api4", "api4", " ", "fallback"
1536-
),
1537-
"fallback",
1538-
)
1535+
# Test with empty extracted key
1536+
self.assertEqual(
1537+
determine_service_name(
1538+
self.get_service_mapping(), "api4", "api4", " ", "fallback"
1539+
),
1540+
"fallback",
1541+
)
15391542

15401543
del os.environ["DD_SERVICE_MAPPING"]
15411544

1545+
def test_determine_service_name_prefers_dd_service(self):
1546+
# When DD_SERVICE is set, inferred spans always use the base service
1547+
# name (DD_SERVICE), regardless of any other configuration.
1548+
with patch("datadog_lambda.config.Config.service", "my-service"):
1549+
self.assertEqual(
1550+
determine_service_name(
1551+
{}, "queue-name", "lambda_sqs", "queue-name", "sqs"
1552+
),
1553+
"my-service",
1554+
)
1555+
1556+
# DD_SERVICE takes precedence over an explicit service mapping.
1557+
self.assertEqual(
1558+
determine_service_name(
1559+
{"lambda_sqs": "mapped-service"},
1560+
"queue-name",
1561+
"lambda_sqs",
1562+
"queue-name",
1563+
"sqs",
1564+
),
1565+
"my-service",
1566+
)
1567+
1568+
# DD_SERVICE takes precedence over a disabled AWS service
1569+
# representation.
1570+
with patch(
1571+
"datadog_lambda.config.Config.aws_service_representation_enabled",
1572+
False,
1573+
):
1574+
self.assertEqual(
1575+
determine_service_name(
1576+
{}, "queue-name", "lambda_sqs", "queue-name", "sqs"
1577+
),
1578+
"my-service",
1579+
)
1580+
1581+
# When DD_SERVICE is not set, fall back to the existing behavior
1582+
# (service mapping, then AWS service representation / extracted key).
1583+
with patch("datadog_lambda.config.Config.service", None):
1584+
self.assertEqual(
1585+
determine_service_name(
1586+
{"lambda_sqs": "mapped-service"},
1587+
"queue-name",
1588+
"lambda_sqs",
1589+
"queue-name",
1590+
"sqs",
1591+
),
1592+
"mapped-service",
1593+
)
1594+
self.assertEqual(
1595+
determine_service_name(
1596+
{}, "queue-name", "lambda_sqs", "queue-name", "sqs"
1597+
),
1598+
"queue-name",
1599+
)
1600+
15421601
def test_remaps_all_inferred_span_service_names_from_api_gateway_event(self):
15431602
new_service_mapping = {"lambda_api_gateway": "new-name"}
15441603
self.set_service_mapping(new_service_mapping)

0 commit comments

Comments
 (0)