Update datadog exporter error tagging (#459)

This commit is contained in:
Eric Mustin
2021-04-27 12:42:28 -04:00
committed by GitHub
parent b1d6c90d70
commit 45c94e765d
4 changed files with 38 additions and 6 deletions

View File

@ -40,6 +40,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
([#415](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/415)) ([#415](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/415))
- `opentelemetry-instrumentation-tornado` Add request/response hooks. - `opentelemetry-instrumentation-tornado` Add request/response hooks.
([#426](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/426)) ([#426](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/426))
- `opentelemetry-exporter-datadog` Add parsing exception events for error tags.
([#459](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/459))
- `opentelemetry-instrumenation-django` now supports trace response headers. - `opentelemetry-instrumenation-django` now supports trace response headers.
([#436](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/436)) ([#436](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/436))
- `opentelemetry-instrumenation-tornado` now supports trace response headers. - `opentelemetry-instrumenation-tornado` now supports trace response headers.

View File

@ -7,3 +7,10 @@ SAMPLING_PRIORITY_KEY = "_sampling_priority_v1"
ENV_KEY = "env" ENV_KEY = "env"
VERSION_KEY = "version" VERSION_KEY = "version"
SERVICE_NAME_TAG = "service.name" SERVICE_NAME_TAG = "service.name"
EVENT_NAME_EXCEPTION = "exception"
EXCEPTION_TYPE_ATTR_KEY = "exception.type"
EXCEPTION_MSG_ATTR_KEY = "exception.message"
EXCEPTION_STACK_ATTR_KEY = "exception.stacktrace"
DD_ERROR_TYPE_TAG_KEY = "error.type"
DD_ERROR_MSG_TAG_KEY = "error.msg"
DD_ERROR_STACK_TAG_KEY = "error.stack"

View File

@ -22,8 +22,15 @@ from ddtrace.span import Span as DatadogSpan
import opentelemetry.trace as trace_api import opentelemetry.trace as trace_api
from opentelemetry.exporter.datadog.constants import ( from opentelemetry.exporter.datadog.constants import (
DD_ERROR_MSG_TAG_KEY,
DD_ERROR_STACK_TAG_KEY,
DD_ERROR_TYPE_TAG_KEY,
DD_ORIGIN, DD_ORIGIN,
ENV_KEY, ENV_KEY,
EVENT_NAME_EXCEPTION,
EXCEPTION_MSG_ATTR_KEY,
EXCEPTION_STACK_ATTR_KEY,
EXCEPTION_TYPE_ATTR_KEY,
SAMPLE_RATE_METRIC_KEY, SAMPLE_RATE_METRIC_KEY,
SERVICE_NAME_TAG, SERVICE_NAME_TAG,
VERSION_KEY, VERSION_KEY,
@ -145,11 +152,12 @@ class DatadogSpanExporter(SpanExporter):
if not span.status.is_ok: if not span.status.is_ok:
datadog_span.error = 1 datadog_span.error = 1
if span.status.description: # loop over events and look for exception events, extract info.
exc_type, exc_val = _get_exc_info(span) # https://github.com/open-telemetry/opentelemetry-python/blob/71e3a7a192c0fc8a7503fac967ada36a74b79e58/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py#L810-L819
# no mapping for error.stack since traceback not recorded if span.events:
datadog_span.set_tag("error.msg", exc_val) _extract_tags_from_exception_events(
datadog_span.set_tag("error.type", exc_type) span.events, datadog_span
)
# combine resource attributes and span attributes, don't modify existing span attributes # combine resource attributes and span attributes, don't modify existing span attributes
combined_span_tags = {} combined_span_tags = {}
@ -178,7 +186,7 @@ class DatadogSpanExporter(SpanExporter):
if sampling_rate is not None: if sampling_rate is not None:
datadog_span.set_metric(SAMPLE_RATE_METRIC_KEY, sampling_rate) datadog_span.set_metric(SAMPLE_RATE_METRIC_KEY, sampling_rate)
# span events and span links are not supported # span events and span links are not supported except for extracting exception event context
datadog_spans.append(datadog_span) datadog_spans.append(datadog_span)
@ -318,3 +326,17 @@ def _extract_tags_from_resource(resource):
else: else:
tags[attribute_key] = attribute_value tags[attribute_key] = attribute_value
return [tags, service_name] return [tags, service_name]
def _extract_tags_from_exception_events(events, datadog_span):
"""Parse error tags from exception events, error.msg error.type
and error.stack have special significance within datadog"""
for event in events:
if event.name is not None and event.name == EVENT_NAME_EXCEPTION:
for key, value in event.attributes.items():
if key == EXCEPTION_TYPE_ATTR_KEY:
datadog_span.set_tag(DD_ERROR_TYPE_TAG_KEY, value)
elif key == EXCEPTION_MSG_ATTR_KEY:
datadog_span.set_tag(DD_ERROR_MSG_TAG_KEY, value)
elif key == EXCEPTION_STACK_ATTR_KEY:
datadog_span.set_tag(DD_ERROR_STACK_TAG_KEY, value)

View File

@ -388,6 +388,7 @@ class TestDatadogSpanExporter(unittest.TestCase):
self.assertEqual(span["error"], 1) self.assertEqual(span["error"], 1)
self.assertEqual(span["meta"]["error.msg"], "bar") self.assertEqual(span["meta"]["error.msg"], "bar")
self.assertEqual(span["meta"]["error.type"], "ValueError") self.assertEqual(span["meta"]["error.type"], "ValueError")
self.assertTrue(span["meta"]["error.stack"] is not None)
def test_shutdown(self): def test_shutdown(self):
span_names = ["xxx", "bar", "foo"] span_names = ["xxx", "bar", "foo"]