[exporter/datadog]: fix service name resolution (#570)

This commit is contained in:
Eric Mustin
2021-07-20 11:57:11 -04:00
committed by GitHub
parent 4d0f57bbc5
commit f6ffa76206
3 changed files with 49 additions and 5 deletions

View File

@ -55,6 +55,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
([#581](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/581)) ([#581](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/581))
- `opentelemetry-instrumentation-botocore` Suppress botocore downstream instrumentation like urllib3 - `opentelemetry-instrumentation-botocore` Suppress botocore downstream instrumentation like urllib3
([#563](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/563)) ([#563](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/563))
- `opentelemetry-exporter-datadog` Datadog exporter should not use `unknown_service` as fallback resource service name.
([#570](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/570))
### Added ### Added
- `opentelemetry-instrumentation-httpx` Add `httpx` instrumentation - `opentelemetry-instrumentation-httpx` Add `httpx` instrumentation

View File

@ -135,12 +135,12 @@ class DatadogSpanExporter(SpanExporter):
[ [
resource_tags, resource_tags,
resource_service_name, resource_service_name,
] = _extract_tags_from_resource(span.resource) ] = _extract_tags_from_resource(span.resource, self.service)
datadog_span = DatadogSpan( datadog_span = DatadogSpan(
tracer, tracer,
_get_span_name(span), _get_span_name(span),
service=resource_service_name or self.service, service=resource_service_name,
resource=_get_resource(span), resource=_get_resource(span),
span_type=_get_span_type(span), span_type=_get_span_type(span),
trace_id=trace_id, trace_id=trace_id,
@ -312,19 +312,23 @@ def _parse_tags_str(tags_str):
return parsed_tags return parsed_tags
def _extract_tags_from_resource(resource): def _extract_tags_from_resource(resource, fallback_service_name):
"""Parse tags from resource.attributes, except service.name which """Parse tags from resource.attributes, except service.name which
has special significance within datadog""" has special significance within datadog"""
tags = {} tags = {}
service_name = None
if not (resource and getattr(resource, "attributes", None)): if not (resource and getattr(resource, "attributes", None)):
return [tags, service_name] return [tags, fallback_service_name]
service_name = None
for attribute_key, attribute_value in resource.attributes.items(): for attribute_key, attribute_value in resource.attributes.items():
if attribute_key == SERVICE_NAME_TAG: if attribute_key == SERVICE_NAME_TAG:
service_name = attribute_value service_name = attribute_value
else: else:
tags[attribute_key] = attribute_value tags[attribute_key] = attribute_value
if service_name is None or service_name == "unknown_service":
service_name = fallback_service_name
return [tags, service_name] return [tags, service_name]

View File

@ -612,3 +612,41 @@ class TestDatadogSpanExporter(unittest.TestCase):
] ]
expected = [0.5] expected = [0.5]
self.assertListEqual(actual, expected) self.assertListEqual(actual, expected)
def test_service_name_fallback(self):
context = trace_api.SpanContext(
trace_id=0x000000000000000000000000DEADBEEF,
span_id=0x34BF92DEEFC58C92,
is_remote=False,
trace_flags=trace_api.TraceFlags(trace_api.TraceFlags.SAMPLED),
)
trace_api.get_tracer_provider().sampler = sampling.TraceIdRatioBased(
0.5
)
resource_with_default_name = Resource(
attributes={
"key_resource": "some_resource",
"service.name": "unknown_service",
}
)
span = trace._Span(
name="sampled",
context=context,
parent=None,
resource=resource_with_default_name,
)
span.start()
span.end()
# pylint: disable=protected-access
exporter = datadog.DatadogSpanExporter(service="fallback_service_name")
datadog_spans = [
span.to_dict() for span in exporter._translate_to_datadog([span])
]
self.assertEqual(len(datadog_spans), 1)
span = datadog_spans[0]
self.assertEqual(span["service"], "fallback_service_name")