From f3b96fdd2947b3f9794b469dd4fc5a39b92af047 Mon Sep 17 00:00:00 2001 From: "Tahir H. Butt" Date: Wed, 10 Jun 2020 13:50:45 -0400 Subject: [PATCH 1/3] docs: update datadog docs --- .../datadog_exporter/datadog_exporter.py | 18 ++++++++++++- .../src/opentelemetry/ext/datadog/__init__.py | 27 ++++++++++++++++++- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/docs/examples/datadog_exporter/datadog_exporter.py b/docs/examples/datadog_exporter/datadog_exporter.py index 0b3af99223e..8c2727b1435 100644 --- a/docs/examples/datadog_exporter/datadog_exporter.py +++ b/docs/examples/datadog_exporter/datadog_exporter.py @@ -14,11 +14,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -from opentelemetry import trace +from opentelemetry import propagators, trace from opentelemetry.ext.datadog import ( DatadogExportSpanProcessor, DatadogSpanExporter, ) +from opentelemetry.ext.datadog.propagator import DatadogFormat from opentelemetry.sdk.trace import TracerProvider trace.set_tracer_provider(TracerProvider()) @@ -31,6 +32,21 @@ span_processor = DatadogExportSpanProcessor(exporter) trace.get_tracer_provider().add_span_processor(span_processor) +# add Datadog format alongside the default propagators if already set +global_httptextformat = propagators.get_global_httptextformat() +if isinstance( + global_httptextformat, propagators.composite.CompositeHTTPPropagator +) and not any( + isinstance(p, DatadogFormat) for p in global_httptextformat._propagators +): + propagators.set_global_httptextformat( + propagators.composite.CompositeHTTPPropagator( + global_httptextformat._propagators + [DatadogFormat()] + ) + ) +else: + propagators.set_global_httptextformat(DatadogFormat()) + with tracer.start_as_current_span("foo"): with tracer.start_as_current_span("bar"): with tracer.start_as_current_span("baz"): diff --git a/ext/opentelemetry-ext-datadog/src/opentelemetry/ext/datadog/__init__.py b/ext/opentelemetry-ext-datadog/src/opentelemetry/ext/datadog/__init__.py index 0c01cf7fba4..85bdaea40aa 100644 --- a/ext/opentelemetry-ext-datadog/src/opentelemetry/ext/datadog/__init__.py +++ b/ext/opentelemetry-ext-datadog/src/opentelemetry/ext/datadog/__init__.py @@ -16,13 +16,27 @@ The **OpenTelemetry Datadog Exporter** provides a span exporter from `OpenTelemetry`_ traces to `Datadog`_ by using the Datadog Agent. +Installation +------------ + +:: + + pip install opentelemetry-ext-datadog + + Usage ----- +The Datadog exporter provides a span processor that must be added along with the +exporter. In addition, a formatter is provided to handle propagation of trace +context between OpenTelemetry-instrumented and Datadog-instrumented services in +a distributed trace. + .. code:: python - from opentelemetry import trace + from opentelemetry import propagators, trace from opentelemetry.ext.datadog import DatadogExportSpanProcessor, DatadogSpanExporter + from opentelemetry.ext.datadog.propagator import DatadogFormat from opentelemetry.sdk.trace import TracerProvider trace.set_tracer_provider(TracerProvider()) @@ -35,13 +49,24 @@ span_processor = DatadogExportSpanProcessor(exporter) trace.get_tracer_provider().add_span_processor(span_processor) + # Optional: use Datadog format for propagation in distributed traces + propagators.set_global_httptextformat(DatadogFormat()) + with tracer.start_as_current_span("foo"): print("Hello world!") + +Examples +-------- + +The `docs/examples/datadog_exporter`_ includes examples for using the Datadog +exporter with OpenTelemetry instrumented applications. + API --- .. _Datadog: https://www.datadoghq.com/ .. _OpenTelemetry: https://github.com/open-telemetry/opentelemetry-python/ +.. _docs/examples/datadog_exporter: https://github.com/open-telemetry/opentelemetry-python/tree/master/docs/examples/datadog_exporter """ # pylint: disable=import-error From 3cbea83de61c4c04d0ac808fdc276798a1e43d13 Mon Sep 17 00:00:00 2001 From: "Tahir H. Butt" Date: Sun, 14 Jun 2020 21:39:28 -0400 Subject: [PATCH 2/3] rework distributed tracing example --- docs/examples/datadog_exporter/README.rst | 20 +++++++++++++--- .../{datadog_exporter.py => basic_example.py} | 16 +------------ .../datadog_exporter/datadog_client.py | 23 +++++++++++++++++++ docs/examples/datadog_exporter/server.py | 18 ++++++++++++++- 4 files changed, 58 insertions(+), 19 deletions(-) rename docs/examples/datadog_exporter/{datadog_exporter.py => basic_example.py} (68%) create mode 100644 docs/examples/datadog_exporter/datadog_client.py diff --git a/docs/examples/datadog_exporter/README.rst b/docs/examples/datadog_exporter/README.rst index 40c12aeccf8..d851550b279 100644 --- a/docs/examples/datadog_exporter/README.rst +++ b/docs/examples/datadog_exporter/README.rst @@ -32,10 +32,15 @@ Basic Example .. code-block:: sh - python datadog_exporter.py + python basic_example.py -Auto-Instrumention Example --------------------------- + +.. code-block:: sh + + python basic_example.py + +Distributed Example +------------------- * Installation @@ -79,3 +84,12 @@ Auto-Instrumention Example .. code-block:: sh opentelemetry-instrument python client.py error + +* Run Datadog instrumented client + +The OpenTelemetry instrumented server is set up with propagation of Datadog trace context. + +.. code-block:: sh + + pip install ddtrace + ddtrace-run python datadog_client.py testing diff --git a/docs/examples/datadog_exporter/datadog_exporter.py b/docs/examples/datadog_exporter/basic_example.py similarity index 68% rename from docs/examples/datadog_exporter/datadog_exporter.py rename to docs/examples/datadog_exporter/basic_example.py index 8c2727b1435..ab30c9f8bda 100644 --- a/docs/examples/datadog_exporter/datadog_exporter.py +++ b/docs/examples/datadog_exporter/basic_example.py @@ -14,7 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from opentelemetry import propagators, trace +from opentelemetry import trace from opentelemetry.ext.datadog import ( DatadogExportSpanProcessor, DatadogSpanExporter, @@ -32,20 +32,6 @@ span_processor = DatadogExportSpanProcessor(exporter) trace.get_tracer_provider().add_span_processor(span_processor) -# add Datadog format alongside the default propagators if already set -global_httptextformat = propagators.get_global_httptextformat() -if isinstance( - global_httptextformat, propagators.composite.CompositeHTTPPropagator -) and not any( - isinstance(p, DatadogFormat) for p in global_httptextformat._propagators -): - propagators.set_global_httptextformat( - propagators.composite.CompositeHTTPPropagator( - global_httptextformat._propagators + [DatadogFormat()] - ) - ) -else: - propagators.set_global_httptextformat(DatadogFormat()) with tracer.start_as_current_span("foo"): with tracer.start_as_current_span("bar"): diff --git a/docs/examples/datadog_exporter/datadog_client.py b/docs/examples/datadog_exporter/datadog_client.py new file mode 100644 index 00000000000..26c463c3f54 --- /dev/null +++ b/docs/examples/datadog_exporter/datadog_client.py @@ -0,0 +1,23 @@ +# Copyright The OpenTelemetry Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from sys import argv + +import requests + +requested = requests.get( + "http://localhost:8082/server_request", params={"param": argv[1]} +) +assert requested.status_code == 200 +print(requested.text) diff --git a/docs/examples/datadog_exporter/server.py b/docs/examples/datadog_exporter/server.py index 0d545e2b7b6..e2099fdf25c 100644 --- a/docs/examples/datadog_exporter/server.py +++ b/docs/examples/datadog_exporter/server.py @@ -14,11 +14,12 @@ from flask import Flask, request -from opentelemetry import trace +from opentelemetry import propagators, trace from opentelemetry.ext.datadog import ( DatadogExportSpanProcessor, DatadogSpanExporter, ) +from opentelemetry.ext.datadog.propagator import DatadogFormat from opentelemetry.sdk.trace import TracerProvider app = Flask(__name__) @@ -33,6 +34,21 @@ ) ) +# append Datadog format for propagation to and from Datadog instrumented services +global_httptextformat = propagators.get_global_httptextformat() +if isinstance( + global_httptextformat, propagators.composite.CompositeHTTPPropagator +) and not any( + isinstance(p, DatadogFormat) for p in global_httptextformat._propagators +): + propagators.set_global_httptextformat( + propagators.composite.CompositeHTTPPropagator( + global_httptextformat._propagators + [DatadogFormat()] + ) + ) +else: + propagators.set_global_httptextformat(DatadogFormat()) + tracer = trace.get_tracer(__name__) From 07557ed0c32fa6c834b0254c09868886850593ea Mon Sep 17 00:00:00 2001 From: "Tahir H. Butt" Date: Sun, 14 Jun 2020 21:49:27 -0400 Subject: [PATCH 3/3] remove unused import --- docs/examples/datadog_exporter/basic_example.py | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/examples/datadog_exporter/basic_example.py b/docs/examples/datadog_exporter/basic_example.py index ab30c9f8bda..a41f9e0462c 100644 --- a/docs/examples/datadog_exporter/basic_example.py +++ b/docs/examples/datadog_exporter/basic_example.py @@ -19,7 +19,6 @@ DatadogExportSpanProcessor, DatadogSpanExporter, ) -from opentelemetry.ext.datadog.propagator import DatadogFormat from opentelemetry.sdk.trace import TracerProvider trace.set_tracer_provider(TracerProvider())