mirror of
https://github.com/open-telemetry/opentelemetry-python-contrib.git
synced 2025-07-28 20:52:57 +08:00
Update datadog exporter error tagging (#459)
This commit is contained in:
@ -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.
|
||||||
|
@ -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"
|
||||||
|
@ -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)
|
||||||
|
@ -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"]
|
||||||
|
Reference in New Issue
Block a user