Skip to content

Commit f6ffa76

Browse files
authored
[exporter/datadog]: fix service name resolution (#570)
1 parent 4d0f57b commit f6ffa76

File tree

3 files changed

+49
-5
lines changed

3 files changed

+49
-5
lines changed

Diff for: CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
5555
([#581](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/581))
5656
- `opentelemetry-instrumentation-botocore` Suppress botocore downstream instrumentation like urllib3
5757
([#563](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/563))
58+
- `opentelemetry-exporter-datadog` Datadog exporter should not use `unknown_service` as fallback resource service name.
59+
([#570](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/570))
5860

5961
### Added
6062
- `opentelemetry-instrumentation-httpx` Add `httpx` instrumentation

Diff for: exporter/opentelemetry-exporter-datadog/src/opentelemetry/exporter/datadog/exporter.py

+9-5
Original file line numberDiff line numberDiff line change
@@ -135,12 +135,12 @@ def _translate_to_datadog(self, spans):
135135
[
136136
resource_tags,
137137
resource_service_name,
138-
] = _extract_tags_from_resource(span.resource)
138+
] = _extract_tags_from_resource(span.resource, self.service)
139139

140140
datadog_span = DatadogSpan(
141141
tracer,
142142
_get_span_name(span),
143-
service=resource_service_name or self.service,
143+
service=resource_service_name,
144144
resource=_get_resource(span),
145145
span_type=_get_span_type(span),
146146
trace_id=trace_id,
@@ -312,19 +312,23 @@ def _parse_tags_str(tags_str):
312312
return parsed_tags
313313

314314

315-
def _extract_tags_from_resource(resource):
315+
def _extract_tags_from_resource(resource, fallback_service_name):
316316
"""Parse tags from resource.attributes, except service.name which
317317
has special significance within datadog"""
318318
tags = {}
319-
service_name = None
320319
if not (resource and getattr(resource, "attributes", None)):
321-
return [tags, service_name]
320+
return [tags, fallback_service_name]
322321

322+
service_name = None
323323
for attribute_key, attribute_value in resource.attributes.items():
324324
if attribute_key == SERVICE_NAME_TAG:
325325
service_name = attribute_value
326326
else:
327327
tags[attribute_key] = attribute_value
328+
329+
if service_name is None or service_name == "unknown_service":
330+
service_name = fallback_service_name
331+
328332
return [tags, service_name]
329333

330334

Diff for: exporter/opentelemetry-exporter-datadog/tests/test_datadog_exporter.py

+38
Original file line numberDiff line numberDiff line change
@@ -612,3 +612,41 @@ def test_sampling_rate(self):
612612
]
613613
expected = [0.5]
614614
self.assertListEqual(actual, expected)
615+
616+
def test_service_name_fallback(self):
617+
context = trace_api.SpanContext(
618+
trace_id=0x000000000000000000000000DEADBEEF,
619+
span_id=0x34BF92DEEFC58C92,
620+
is_remote=False,
621+
trace_flags=trace_api.TraceFlags(trace_api.TraceFlags.SAMPLED),
622+
)
623+
trace_api.get_tracer_provider().sampler = sampling.TraceIdRatioBased(
624+
0.5
625+
)
626+
627+
resource_with_default_name = Resource(
628+
attributes={
629+
"key_resource": "some_resource",
630+
"service.name": "unknown_service",
631+
}
632+
)
633+
634+
span = trace._Span(
635+
name="sampled",
636+
context=context,
637+
parent=None,
638+
resource=resource_with_default_name,
639+
)
640+
span.start()
641+
span.end()
642+
643+
# pylint: disable=protected-access
644+
exporter = datadog.DatadogSpanExporter(service="fallback_service_name")
645+
datadog_spans = [
646+
span.to_dict() for span in exporter._translate_to_datadog([span])
647+
]
648+
649+
self.assertEqual(len(datadog_spans), 1)
650+
651+
span = datadog_spans[0]
652+
self.assertEqual(span["service"], "fallback_service_name")

0 commit comments

Comments
 (0)