From f67b0aad6af96472ce115d35f0a6a5af375421c2 Mon Sep 17 00:00:00 2001 From: "Tahir H. Butt" Date: Wed, 27 May 2020 10:38:06 -0400 Subject: [PATCH 1/2] feat(datadog): set sampling rate --- .../opentelemetry/ext/datadog/constants.py | 2 ++ .../src/opentelemetry/ext/datadog/exporter.py | 16 +++++++++- .../tests/test_datadog_exporter.py | 32 +++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/ext/opentelemetry-ext-datadog/src/opentelemetry/ext/datadog/constants.py b/ext/opentelemetry-ext-datadog/src/opentelemetry/ext/datadog/constants.py index 54d7946ab40..d2864c1076c 100644 --- a/ext/opentelemetry-ext-datadog/src/opentelemetry/ext/datadog/constants.py +++ b/ext/opentelemetry-ext-datadog/src/opentelemetry/ext/datadog/constants.py @@ -2,3 +2,5 @@ AUTO_REJECT = 0 AUTO_KEEP = 1 USER_KEEP = 2 +SAMPLE_RATE_METRIC_KEY = "_sample_rate" +SAMPLING_PRIORITY_KEY = "_sampling_priority_v1" diff --git a/ext/opentelemetry-ext-datadog/src/opentelemetry/ext/datadog/exporter.py b/ext/opentelemetry-ext-datadog/src/opentelemetry/ext/datadog/exporter.py index 01a01919962..2ea3f6db796 100644 --- a/ext/opentelemetry-ext-datadog/src/opentelemetry/ext/datadog/exporter.py +++ b/ext/opentelemetry-ext-datadog/src/opentelemetry/ext/datadog/exporter.py @@ -25,7 +25,7 @@ from opentelemetry.trace.status import StatusCanonicalCode # pylint:disable=relative-beyond-top-level -from .constants import DD_ORIGIN +from .constants import DD_ORIGIN, SAMPLE_RATE_METRIC_KEY logger = logging.getLogger(__name__) @@ -136,6 +136,10 @@ def _translate_to_datadog(self, spans): if origin and parent_id == 0: datadog_span.set_tag(DD_ORIGIN, origin) + sampling_rate = _get_sampling_rate(span) + if sampling_rate: + datadog_span.set_metric(SAMPLE_RATE_METRIC_KEY, sampling_rate) + # span events and span links are not supported datadog_spans.append(datadog_span) @@ -216,3 +220,13 @@ def _get_origin(span): ctx = span.get_context() origin = ctx.trace_state.get(DD_ORIGIN) return origin + + +def _get_sampling_rate(span): + ctx = span.get_context() + return ( + span.sampler.rate + if ctx.trace_flags.sampled + and isinstance(span.sampler, trace_api.sampling.ProbabilitySampler) + else None + ) diff --git a/ext/opentelemetry-ext-datadog/tests/test_datadog_exporter.py b/ext/opentelemetry-ext-datadog/tests/test_datadog_exporter.py index 14fd5507891..378bef4147e 100644 --- a/ext/opentelemetry-ext-datadog/tests/test_datadog_exporter.py +++ b/ext/opentelemetry-ext-datadog/tests/test_datadog_exporter.py @@ -440,3 +440,35 @@ def test_origin(self): ] expected = ["origin-service", None] self.assertListEqual(actual, expected) + + def test_sampling_rate(self): + context = trace_api.SpanContext( + trace_id=0x000000000000000000000000DEADBEEF, + span_id=0x34BF92DEEFC58C92, + is_remote=False, + trace_flags=trace_api.TraceFlags(trace_api.TraceFlags.SAMPLED), + ) + sampler = trace_api.sampling.ProbabilitySampler(0.5) + + span = trace.Span( + name="sampled", context=context, parent=None, sampler=sampler + ) + span.start() + span.end() + + # pylint: disable=protected-access + exporter = datadog.DatadogSpanExporter() + datadog_spans = [ + span.to_dict() for span in exporter._translate_to_datadog([span]) + ] + + self.assertEqual(len(datadog_spans), 1) + + actual = [ + span["metrics"].get(datadog.constants.SAMPLE_RATE_METRIC_KEY) + if "metrics" in span + else None + for span in datadog_spans + ] + expected = [0.5] + self.assertListEqual(actual, expected) From 44cb03c5e2754b15906e174f4662d924cfedccb7 Mon Sep 17 00:00:00 2001 From: "Tahir H. Butt" Date: Thu, 28 May 2020 13:22:46 -0400 Subject: [PATCH 2/2] Apply suggestions from code review Co-authored-by: Diego Hurtado --- .../src/opentelemetry/ext/datadog/exporter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/opentelemetry-ext-datadog/src/opentelemetry/ext/datadog/exporter.py b/ext/opentelemetry-ext-datadog/src/opentelemetry/ext/datadog/exporter.py index 2ea3f6db796..35d0f98203c 100644 --- a/ext/opentelemetry-ext-datadog/src/opentelemetry/ext/datadog/exporter.py +++ b/ext/opentelemetry-ext-datadog/src/opentelemetry/ext/datadog/exporter.py @@ -137,7 +137,7 @@ def _translate_to_datadog(self, spans): datadog_span.set_tag(DD_ORIGIN, origin) sampling_rate = _get_sampling_rate(span) - if sampling_rate: + if sampling_rate is not None: datadog_span.set_metric(SAMPLE_RATE_METRIC_KEY, sampling_rate) # span events and span links are not supported