Skip to content

Commit

Permalink
Add OpenTracing propagator (#302)
Browse files Browse the repository at this point in the history
  • Loading branch information
ocelotl committed Feb 16, 2021
1 parent 9c1f98d commit 269e0f4
Show file tree
Hide file tree
Showing 32 changed files with 764 additions and 72 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ on:
- 'release/*'
pull_request:
env:
CORE_REPO_SHA: 73601dfc0c8ab622fb8a2bfd4c0b1ea6c3f91fa3
CORE_REPO_SHA: d7acfd8135eba4cfdb88831399089aa1d43d49d1

jobs:
build:
Expand All @@ -23,7 +23,7 @@ jobs:
fail-fast: false # ensures the entire test matrix is run, even if one permutation fails
matrix:
python-version: [ py35, py36, py37, py38, pypy3 ]
package: ["instrumentation", "exporter", "sdkextension"]
package: ["instrumentation", "exporter", "sdkextension", "propagator"]
os: [ ubuntu-latest ]
include:
# py35-instrumentation segfaults on 18.04 so we instead run on 20.04
Expand Down
6 changes: 5 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased](https://github.com/open-telemetry/opentelemetry-python-contrib/compare/v0.17b0...HEAD)

### Changed
### Added
- `opentelemetry-propagator-ot-trace` Add OT Trace Propagator
([#302](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/302))

### Removed
- Remove `component` span attribute in instrumentations.
`opentelemetry-instrumentation-aiopg`, `opentelemetry-instrumentation-dbapi` Remove unused `database_type` parameter from `trace_integration` function.
([#301](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/301))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@
.. code:: python
from opentelemetry import propagators, trace
from opentelemetry.propagate import set_global_textmap
from opentelemetry import trace
from opentelemetry.exporter.datadog import DatadogExportSpanProcessor, DatadogSpanExporter
from opentelemetry.exporter.datadog.propagator import DatadogFormat
from opentelemetry.sdk.trace import TracerProvider
Expand All @@ -50,7 +51,7 @@
trace.get_tracer_provider().add_span_processor(span_processor)
# Optional: use Datadog format for propagation in distributed traces
propagators.set_global_textmap(DatadogFormat())
set_global_textmap(DatadogFormat())
with tracer.start_as_current_span("foo"):
print("Hello world!")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,21 +62,21 @@ def strip_query_params(url: yarl.URL) -> str:
---
"""

import socket
import types
import typing

import aiohttp
import wrapt

from opentelemetry import context as context_api
from opentelemetry import propagators, trace
from opentelemetry import trace
from opentelemetry.instrumentation.aiohttp_client.version import __version__
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
from opentelemetry.instrumentation.utils import (
http_status_to_status_code,
unwrap,
)
from opentelemetry.propagate import inject
from opentelemetry.trace import SpanKind, TracerProvider, get_tracer
from opentelemetry.trace.status import Status, StatusCode

Expand Down Expand Up @@ -181,7 +181,7 @@ async def on_request_start(
trace.set_span_in_context(trace_config_ctx.span)
)

propagators.inject(type(params.headers).__setitem__, params.headers)
inject(type(params.headers).__setitem__, params.headers)

async def on_request_end(
unused_session: aiohttp.ClientSession,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,10 @@

from asgiref.compatibility import guarantee_single_callable

from opentelemetry import context, propagators, trace
from opentelemetry import context, trace
from opentelemetry.instrumentation.asgi.version import __version__ # noqa
from opentelemetry.instrumentation.utils import http_status_to_status_code
from opentelemetry.propagate import extract
from opentelemetry.trace.propagation.textmap import DictGetter
from opentelemetry.trace.status import Status, StatusCode

Expand Down Expand Up @@ -185,7 +186,7 @@ async def __call__(self, scope, receive, send):
if self.excluded_urls and self.excluded_urls.url_disabled(url):
return await self.app(scope, receive, send)

token = context.attach(propagators.extract(carrier_getter, scope))
token = context.attach(extract(carrier_getter, scope))
span_name, additional_attributes = self.span_details_callback(scope)

try:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,15 +49,14 @@
import logging

from botocore.client import BaseClient
from botocore.exceptions import ClientError, ParamValidationError
from wrapt import ObjectProxy, wrap_function_wrapper
from botocore.exceptions import ClientError
from wrapt import wrap_function_wrapper

from opentelemetry import context as context_api
from opentelemetry import propagators
from opentelemetry.instrumentation.botocore.version import __version__
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
from opentelemetry.instrumentation.utils import unwrap
from opentelemetry.sdk.trace import Resource
from opentelemetry.propagate import inject
from opentelemetry.trace import SpanKind, get_tracer

logger = logging.getLogger(__name__)
Expand All @@ -67,7 +66,7 @@
def _patched_endpoint_prepare_request(wrapped, instance, args, kwargs):
request = args[0]
headers = request.headers
propagators.inject(type(headers).__setitem__, headers)
inject(type(headers).__setitem__, headers)
return wrapped(*args, **kwargs)


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@
mock_xray,
)

from opentelemetry import propagators
from opentelemetry import trace as trace_api
from opentelemetry.context import attach, detach, set_value
from opentelemetry.instrumentation.botocore import BotocoreInstrumentor
from opentelemetry.propagate import get_global_textmap, set_global_textmap
from opentelemetry.test.mock_textmap import MockTextMapPropagator
from opentelemetry.test.test_base import TestBase

Expand Down Expand Up @@ -381,14 +381,14 @@ def test_sts_client(self):
@mock_ec2
def test_propagator_injects_into_request(self):
headers = {}
previous_propagator = propagators.get_global_textmap()
previous_propagator = get_global_textmap()

def check_headers(**kwargs):
nonlocal headers
headers = kwargs["request"].headers

try:
propagators.set_global_textmap(MockTextMapPropagator())
set_global_textmap(MockTextMapPropagator())

ec2 = self.session.create_client("ec2", region_name="us-west-2")
ec2.meta.events.register_first(
Expand Down Expand Up @@ -424,7 +424,7 @@ def check_headers(**kwargs):
)

finally:
propagators.set_global_textmap(previous_propagator)
set_global_textmap(previous_propagator)

@mock_xray
def test_suppress_instrumentation_xray_client(self):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,15 +52,15 @@ def add(x, y):
"""

import logging
import signal
from collections.abc import Iterable

from celery import signals # pylint: disable=no-name-in-module

from opentelemetry import propagators, trace
from opentelemetry import trace
from opentelemetry.instrumentation.celery import utils
from opentelemetry.instrumentation.celery.version import __version__
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
from opentelemetry.propagate import extract, inject
from opentelemetry.trace.propagation.textmap import DictGetter
from opentelemetry.trace.status import Status, StatusCode

Expand Down Expand Up @@ -128,7 +128,7 @@ def _trace_prerun(self, *args, **kwargs):
return

request = task.request
tracectx = propagators.extract(carrier_getter, request) or None
tracectx = extract(carrier_getter, request) or None

logger.debug("prerun signal start task_id=%s", task_id)

Expand Down Expand Up @@ -192,7 +192,7 @@ def _trace_before_publish(self, *args, **kwargs):

headers = kwargs.get("headers")
if headers:
propagators.inject(type(headers).__setitem__, headers)
inject(type(headers).__setitem__, headers)

@staticmethod
def _trace_after_publish(*args, **kwargs):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
carrier_getter,
collect_request_attributes,
)
from opentelemetry.propagators import extract
from opentelemetry.propagate import extract
from opentelemetry.trace import SpanKind, get_tracer
from opentelemetry.util.http import get_excluded_urls, get_traced_request_attrs

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,17 +46,13 @@
ElasticsearchInstrumentor("my-custom-prefix").instrument()
"""

import functools
import types
from logging import getLogger
from os import environ

import elasticsearch
import elasticsearch.exceptions
from wrapt import ObjectProxy
from wrapt import wrap_function_wrapper as _wrap

from opentelemetry import context, propagators, trace
from opentelemetry.instrumentation.elasticsearch.version import __version__
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
from opentelemetry.instrumentation.utils import unwrap
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,14 @@ def on_get(self, req, resp):
import falcon

import opentelemetry.instrumentation.wsgi as otel_wsgi
from opentelemetry import context, propagators, trace
from opentelemetry import context, trace
from opentelemetry.instrumentation.falcon.version import __version__
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
from opentelemetry.instrumentation.utils import (
extract_attributes_from_object,
http_status_to_status_code,
)
from opentelemetry.propagate import extract
from opentelemetry.trace.status import Status
from opentelemetry.util.http import get_excluded_urls, get_traced_request_attrs
from opentelemetry.util.providers import time_ns
Expand Down Expand Up @@ -108,9 +109,7 @@ def __call__(self, env, start_response):

start_time = time_ns()

token = context.attach(
propagators.extract(otel_wsgi.carrier_getter, env)
)
token = context.attach(extract(otel_wsgi.carrier_getter, env))
span = self._tracer.start_span(
otel_wsgi.get_default_span_name(env),
kind=trace.SpanKind.SERVER,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,10 @@ def hello():
import flask

import opentelemetry.instrumentation.wsgi as otel_wsgi
from opentelemetry import context, propagators, trace
from opentelemetry import context, trace
from opentelemetry.instrumentation.flask.version import __version__
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
from opentelemetry.propagate import extract
from opentelemetry.util.http import get_excluded_urls
from opentelemetry.util.providers import time_ns

Expand Down Expand Up @@ -116,9 +117,7 @@ def _before_request():
flask_request_environ = flask.request.environ
span_name = name_callback()
token = context.attach(
propagators.extract(
otel_wsgi.carrier_getter, flask_request_environ
)
extract(otel_wsgi.carrier_getter, flask_request_environ)
)

tracer = trace.get_tracer(__name__, __version__)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,10 @@

import grpc

from opentelemetry import propagators, trace
from opentelemetry import trace
from opentelemetry.instrumentation.grpc import grpcext
from opentelemetry.instrumentation.grpc._utilities import RpcInfo
from opentelemetry.propagate import inject
from opentelemetry.trace.status import Status, StatusCode


Expand Down Expand Up @@ -59,7 +60,7 @@ def append_metadata(
metadata[key] = value

# Inject current active span from the context
propagators.inject(append_metadata, metadata)
inject(append_metadata, metadata)


def _make_future_done_callback(span, rpc_info):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,9 @@

import grpc

from opentelemetry import propagators, trace
from opentelemetry import trace
from opentelemetry.context import attach, detach
from opentelemetry.propagate import extract
from opentelemetry.trace.propagation.textmap import DictGetter
from opentelemetry.trace.status import Status, StatusCode

Expand Down Expand Up @@ -181,7 +182,7 @@ def _set_remote_context(self, servicer_context):
metadata = servicer_context.invocation_metadata()
if metadata:
md_dict = {md.key: md.value for md in metadata}
ctx = propagators.extract(self._carrier_getter, md_dict)
ctx = extract(self._carrier_getter, md_dict)
token = attach(ctx)
try:
yield
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@
from pyramid.tweens import EXCVIEW

import opentelemetry.instrumentation.wsgi as otel_wsgi
from opentelemetry import context, propagators, trace
from opentelemetry import context, trace
from opentelemetry.instrumentation.pyramid.version import __version__
from opentelemetry.propagate import extract
from opentelemetry.util.http import get_excluded_urls
from opentelemetry.util.providers import time_ns

Expand Down Expand Up @@ -63,9 +64,7 @@ def _before_traversal(event):

start_time = request_environ.get(_ENVIRON_STARTTIME_KEY)

token = context.attach(
propagators.extract(otel_wsgi.carrier_getter, request_environ)
)
token = context.attach(extract(otel_wsgi.carrier_getter, request_environ))
tracer = trace.get_tracer(__name__, __version__)

if request.matched_route:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,18 +36,17 @@
import functools
import types

from requests import Timeout, URLRequired
from requests.exceptions import InvalidSchema, InvalidURL, MissingSchema
from requests.models import Response
from requests.sessions import Session
from requests.structures import CaseInsensitiveDict

from opentelemetry import context, propagators
from opentelemetry import context
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
from opentelemetry.instrumentation.requests.version import __version__
from opentelemetry.instrumentation.utils import http_status_to_status_code
from opentelemetry.propagate import inject
from opentelemetry.trace import SpanKind, get_tracer
from opentelemetry.trace.status import Status, StatusCode
from opentelemetry.trace.status import Status

# A key to a context variable to avoid creating duplicate spans when instrumenting
# both, Session.request and Session.send, since Session.request calls into Session.send
Expand Down Expand Up @@ -135,7 +134,7 @@ def _instrumented_requests_call(
span.set_attribute("http.url", url)

headers = get_or_create_headers()
propagators.inject(type(headers).__setitem__, headers)
inject(type(headers).__setitem__, headers)

token = context.attach(
context.set_value(_SUPPRESS_REQUESTS_INSTRUMENTATION_KEY, True)
Expand Down
Loading

0 comments on commit 269e0f4

Please sign in to comment.