From df79be6ea935073ba94c80f19ecd4360565ef36b Mon Sep 17 00:00:00 2001 From: Shovnik Bhattacharya Date: Thu, 31 Dec 2020 15:52:03 -0500 Subject: [PATCH 1/9] Add CodeQL analysis (#277) --- .github/workflows/codeql-analysis.yml | 35 +++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .github/workflows/codeql-analysis.yml diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 0000000000..b979a3121b --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,35 @@ +name: CodeQL Analysis + +on: + workflow_dispatch: + schedule: + # ┌───────────── minute (0 - 59) + # │ ┌───────────── hour (0 - 23) + # │ │ ┌───────────── day of the month (1 - 31) + # │ │ │ ┌───────────── month (1 - 12 or JAN-DEC) + # │ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT) + # │ │ │ │ │ + # │ │ │ │ │ + # │ │ │ │ │ + # * * * * * + - cron: '30 1 * * *' + +jobs: + CodeQL-Build: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: python + + - name: Autobuild + uses: github/codeql-action/autobuild@v1 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 \ No newline at end of file From 472f84538144c1a8cc7260ae67c5dad17abb32bb Mon Sep 17 00:00:00 2001 From: Owais Lone Date: Tue, 5 Jan 2021 20:53:53 +0530 Subject: [PATCH 2/9] Upgrade isort and enable black compat mode (#248) --- .gitignore | 1 + .isort.cfg | 3 ++- .pylintrc | 12 ++++++++++-- dev-requirements.txt | 7 ++++--- .../src/opentelemetry/exporter/datadog/exporter.py | 8 +++----- .../opentelemetry/exporter/datadog/propagator.py | 4 +--- .../setup.cfg | 7 +++---- .../exporter/prometheus_remote_write/__init__.py | 7 ++++--- .../tests/test_prometheus_remote_write_exporter.py | 14 +++++++------- .../instrumentation/django/middleware.py | 4 ++-- .../tests/test_fastapi_instrumentation.py | 2 +- .../opentelemetry/instrumentation/grpc/__init__.py | 5 ++--- .../opentelemetry/instrumentation/grpc/_client.py | 8 +++++--- .../instrumentation/grpc/_utilities.py | 7 +++++-- .../instrumentation/grpc/grpcext/_interceptor.py | 2 +- .../tests/protobuf/test_server_pb2_grpc.py | 1 - .../tests/test_client_interceptor.py | 2 +- .../instrumentation/urllib/__init__.py | 7 +++++-- .../tests/test_urllib_integration.py | 6 ++++-- .../tests/test_getter.py | 2 +- scripts/eachdist.py | 2 +- tox.ini | 2 +- 22 files changed, 64 insertions(+), 49 deletions(-) diff --git a/.gitignore b/.gitignore index 92e9ccd051..cc3fb4d5e7 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ __pycache__ venv*/ .venv*/ opentelemetry-python-core*/ +/opentelemetry-python-core # Installer logs pip-log.txt diff --git a/.isort.cfg b/.isort.cfg index 47fc6468cb..6c25a22275 100644 --- a/.isort.cfg +++ b/.isort.cfg @@ -3,6 +3,7 @@ include_trailing_comma=True force_grid_wrap=0 use_parentheses=True line_length=79 +profile=black ; 3 stands for Vertical Hanging Indent, e.g. ; from third_party import ( @@ -13,6 +14,6 @@ line_length=79 ; docs: https://github.com/timothycrosley/isort#multi-line-output-modes multi_line_output=3 skip=target -skip_glob=**/gen/*,.venv*/*,venv*/*,reference*/*,opentelemetry-python-core/* +skip_glob=**/gen/*,.venv*/*,venv*/*,reference*/*,opentelemetry-python-core/*,.tox/* known_first_party=opentelemetry known_third_party=psutil,pytest,redis,redis_opentracing diff --git a/.pylintrc b/.pylintrc index be29414dc3..9f767af293 100644 --- a/.pylintrc +++ b/.pylintrc @@ -70,7 +70,15 @@ disable=missing-docstring, wrong-import-order, # Leave this up to isort bad-continuation, # Leave this up to black line-too-long, # Leave this up to black - exec-used + exec-used, + super-with-arguments, # temp-pylint-upgrade + isinstance-second-argument-not-valid-type, # temp-pylint-upgrade + raise-missing-from, # temp-pylint-upgrade + unused-argument, # temp-pylint-upgrade + protected-access, # temp-pylint-upgrade + super-init-not-called, # temp-pylint-upgrade + invalid-overridden-method, # temp-pylint-upgrade + missing-module-docstring, # temp-pylint-upgrad, # temp-pylint-upgradee # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option @@ -165,7 +173,7 @@ contextmanager-decorators=contextlib.contextmanager # List of members which are set dynamically and missed by pylint inference # system, and so shouldn't trigger E1101 when accessed. Python regular # expressions are accepted. -generated-members=*_pb2.py +generated-members=types_pb2.* # Tells whether missing members accessed in mixin class should be ignored. A # mixin class is detected if its name ends with "mixin" (case insensitive). diff --git a/dev-requirements.txt b/dev-requirements.txt index 4ef8070934..103b74a334 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -1,8 +1,9 @@ -pylint==2.4.4 +pylint~=2.6 flake8~=3.7 -isort~=4.3 +isort~=5.6 black>=19.3b0,==19.* -mypy==0.740 +httpretty~=1.0 +mypy==0.790 sphinx~=2.1 sphinx-rtd-theme~=0.4 sphinx-autodoc-typehints~=1.10.2 diff --git a/exporter/opentelemetry-exporter-datadog/src/opentelemetry/exporter/datadog/exporter.py b/exporter/opentelemetry-exporter-datadog/src/opentelemetry/exporter/datadog/exporter.py index 2b1bd90041..129e0d0c48 100644 --- a/exporter/opentelemetry-exporter-datadog/src/opentelemetry/exporter/datadog/exporter.py +++ b/exporter/opentelemetry-exporter-datadog/src/opentelemetry/exporter/datadog/exporter.py @@ -21,17 +21,15 @@ from ddtrace.span import Span as DatadogSpan import opentelemetry.trace as trace_api -from opentelemetry.sdk.trace import sampling -from opentelemetry.sdk.trace.export import SpanExporter, SpanExportResult - -# pylint:disable=relative-beyond-top-level -from .constants import ( +from opentelemetry.exporter.datadog.constants import ( DD_ORIGIN, ENV_KEY, SAMPLE_RATE_METRIC_KEY, SERVICE_NAME_TAG, VERSION_KEY, ) +from opentelemetry.sdk.trace import sampling +from opentelemetry.sdk.trace.export import SpanExporter, SpanExportResult logger = logging.getLogger(__name__) diff --git a/exporter/opentelemetry-exporter-datadog/src/opentelemetry/exporter/datadog/propagator.py b/exporter/opentelemetry-exporter-datadog/src/opentelemetry/exporter/datadog/propagator.py index 09a46a140c..27fa15b7b2 100644 --- a/exporter/opentelemetry-exporter-datadog/src/opentelemetry/exporter/datadog/propagator.py +++ b/exporter/opentelemetry-exporter-datadog/src/opentelemetry/exporter/datadog/propagator.py @@ -16,6 +16,7 @@ from opentelemetry import trace from opentelemetry.context import Context +from opentelemetry.exporter.datadog import constants from opentelemetry.trace import get_current_span, set_span_in_context from opentelemetry.trace.propagation.textmap import ( Getter, @@ -24,9 +25,6 @@ TextMapPropagatorT, ) -# pylint:disable=relative-beyond-top-level -from . import constants - class DatadogFormat(TextMapPropagator): """Propagator for the Datadog HTTP header format. diff --git a/exporter/opentelemetry-exporter-prometheus-remote-write/setup.cfg b/exporter/opentelemetry-exporter-prometheus-remote-write/setup.cfg index ab54a42afe..9bec805791 100644 --- a/exporter/opentelemetry-exporter-prometheus-remote-write/setup.cfg +++ b/exporter/opentelemetry-exporter-prometheus-remote-write/setup.cfg @@ -39,13 +39,12 @@ package_dir= =src packages=find_namespace: install_requires = + snappy >= 2.8 protobuf >= 3.13.0 requests == 2.25.0 opentelemetry-api == 0.17.dev0 opentelemetry-sdk == 0.17.dev0 python-snappy >= 0.5.4 -[options.packages.find] -where = src -[options.extras_require] -test = +[options.packages.find] +where = src \ No newline at end of file diff --git a/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/__init__.py b/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/__init__.py index 4a09bf3e9f..1a75ea80c3 100644 --- a/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/__init__.py +++ b/exporter/opentelemetry-exporter-prometheus-remote-write/src/opentelemetry/exporter/prometheus_remote_write/__init__.py @@ -268,7 +268,7 @@ def _convert_from_quantile( ) -> Sequence[TimeSeries]: raise NotImplementedError() - # pylint: disable=no-member + # pylint: disable=no-member,no-self-use def _create_timeseries( self, export_record: ExportRecord, @@ -317,6 +317,7 @@ def add_label(label_name: str, label_value: str): timeseries.samples.append(sample) return timeseries + # pylint: disable=no-member,no-self-use def _build_message(self, timeseries: Sequence[TimeSeries]) -> bytes: write_request = WriteRequest() write_request.timeseries.extend(timeseries) @@ -370,7 +371,7 @@ def _send_message( ) if not response.ok: response.raise_for_status() - except requests.exceptions.RequestException as e: - logger.error("Export POST request failed with reason: %s", e) + except requests.exceptions.RequestException as err: + logger.error("Export POST request failed with reason: %s", err) return MetricsExportResult.FAILURE return MetricsExportResult.SUCCESS diff --git a/exporter/opentelemetry-exporter-prometheus-remote-write/tests/test_prometheus_remote_write_exporter.py b/exporter/opentelemetry-exporter-prometheus-remote-write/tests/test_prometheus_remote_write_exporter.py index 4b4bb95820..f76596d807 100644 --- a/exporter/opentelemetry-exporter-prometheus-remote-write/tests/test_prometheus_remote_write_exporter.py +++ b/exporter/opentelemetry-exporter-prometheus-remote-write/tests/test_prometheus_remote_write_exporter.py @@ -13,15 +13,13 @@ # limitations under the License. import unittest -from logging import Logger -from unittest.mock import MagicMock, Mock, patch +from unittest.mock import patch from opentelemetry.exporter.prometheus_remote_write import ( PrometheusRemoteWriteMetricsExporter, ) from opentelemetry.exporter.prometheus_remote_write.gen.types_pb2 import ( Label, - Sample, TimeSeries, ) from opentelemetry.sdk.metrics import Counter @@ -339,15 +337,17 @@ def create_label(name, value): ) expected_timeseries = TimeSeries() - expected_timeseries.labels.append(create_label("__name__", "testname")) - expected_timeseries.labels.append( + expected_timeseries.labels.append( # pylint:disable=E1101 + create_label("__name__", "testname") + ) + expected_timeseries.labels.append( # pylint:disable=E1101 create_label("resource_name", "resource_value") ) - expected_timeseries.labels.append( + expected_timeseries.labels.append( # pylint:disable=E1101 create_label("record_name", "record_value") ) - sample = expected_timeseries.samples.add() + sample = expected_timeseries.samples.add() # pylint:disable=E1101 sample.timestamp = int(sum_aggregator.last_update_timestamp / 1000000) sample.value = 5.0 diff --git a/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/middleware.py b/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/middleware.py index e4277323e7..edb585cdb4 100644 --- a/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/middleware.py +++ b/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/middleware.py @@ -31,11 +31,11 @@ try: from django.core.urlresolvers import ( # pylint: disable=no-name-in-module - resolve, Resolver404, + resolve, ) except ImportError: - from django.urls import resolve, Resolver404 + from django.urls import Resolver404, resolve try: from django.utils.deprecation import MiddlewareMixin diff --git a/instrumentation/opentelemetry-instrumentation-fastapi/tests/test_fastapi_instrumentation.py b/instrumentation/opentelemetry-instrumentation-fastapi/tests/test_fastapi_instrumentation.py index 2cabb0f0c1..6d5a1b1808 100644 --- a/instrumentation/opentelemetry-instrumentation-fastapi/tests/test_fastapi_instrumentation.py +++ b/instrumentation/opentelemetry-instrumentation-fastapi/tests/test_fastapi_instrumentation.py @@ -98,7 +98,7 @@ async def _(param: str): return {"message": param} @app.get("/healthzz") - async def health(): + async def _(): return {"message": "ok"} return app diff --git a/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/__init__.py b/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/__init__.py index 955ef22ac9..f963a2102f 100644 --- a/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/__init__.py @@ -130,7 +130,7 @@ def serve(): """ from functools import partial -import grpc +import grpc # pylint:disable=import-self from wrapt import wrap_function_wrapper as _wrap from opentelemetry import trace @@ -142,7 +142,6 @@ def serve(): # pylint:disable=import-outside-toplevel # pylint:disable=import-self # pylint:disable=unused-argument -# isort:skip class GrpcInstrumentorServer(BaseInstrumentor): @@ -156,7 +155,7 @@ class GrpcInstrumentorServer(BaseInstrumentor): """ - # pylint:disable=attribute-defined-outside-init + # pylint:disable=attribute-defined-outside-init, redefined-outer-name def _instrument(self, **kwargs): self._original_func = grpc.server diff --git a/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/_client.py b/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/_client.py index 55317fa2d8..b38fd4d511 100644 --- a/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/_client.py +++ b/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/_client.py @@ -25,12 +25,14 @@ import grpc from opentelemetry import metrics, propagators, trace +from opentelemetry.instrumentation.grpc import grpcext +from opentelemetry.instrumentation.grpc._utilities import ( + RpcInfo, + TimedMetricRecorder, +) from opentelemetry.sdk.metrics.export.controller import PushController from opentelemetry.trace.status import Status, StatusCode -from . import grpcext -from ._utilities import RpcInfo, TimedMetricRecorder - class _GuardedSpan: def __init__(self, span): diff --git a/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/_utilities.py b/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/_utilities.py index 8cf1f957c3..9de95c9724 100644 --- a/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/_utilities.py +++ b/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/_utilities.py @@ -83,10 +83,13 @@ def record_bytes_out(self, bytes_out, method): @contextmanager def record_latency(self, method): start_time = time() - labels = {"method": method, "status_code": grpc.StatusCode.OK} + labels = { + "method": method, + "status_code": grpc.StatusCode.OK, # pylint:disable=no-member + } try: yield labels - except grpc.RpcError as exc: + except grpc.RpcError as exc: # pylint:disable=no-member if self._meter: # pylint: disable=no-member labels["status_code"] = exc.code() diff --git a/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/grpcext/_interceptor.py b/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/grpcext/_interceptor.py index b9f74fff80..b8a17c6d03 100644 --- a/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/grpcext/_interceptor.py +++ b/instrumentation/opentelemetry-instrumentation-grpc/src/opentelemetry/instrumentation/grpc/grpcext/_interceptor.py @@ -24,7 +24,7 @@ import grpc -from .. import grpcext +from opentelemetry.instrumentation.grpc import grpcext class _UnaryClientInfo( diff --git a/instrumentation/opentelemetry-instrumentation-grpc/tests/protobuf/test_server_pb2_grpc.py b/instrumentation/opentelemetry-instrumentation-grpc/tests/protobuf/test_server_pb2_grpc.py index d0a6fd5184..9ff1ea27b5 100644 --- a/instrumentation/opentelemetry-instrumentation-grpc/tests/protobuf/test_server_pb2_grpc.py +++ b/instrumentation/opentelemetry-instrumentation-grpc/tests/protobuf/test_server_pb2_grpc.py @@ -1,6 +1,5 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! import grpc - from tests.protobuf import test_server_pb2 as test__server__pb2 diff --git a/instrumentation/opentelemetry-instrumentation-grpc/tests/test_client_interceptor.py b/instrumentation/opentelemetry-instrumentation-grpc/tests/test_client_interceptor.py index f351c6fdd4..0eaeebbc23 100644 --- a/instrumentation/opentelemetry-instrumentation-grpc/tests/test_client_interceptor.py +++ b/instrumentation/opentelemetry-instrumentation-grpc/tests/test_client_interceptor.py @@ -13,6 +13,7 @@ # limitations under the License. import grpc +from tests.protobuf import test_server_pb2_grpc import opentelemetry.instrumentation.grpc from opentelemetry import trace @@ -22,7 +23,6 @@ SumAggregator, ) from opentelemetry.test.test_base import TestBase -from tests.protobuf import test_server_pb2_grpc from ._client import ( bidirectional_streaming_method, diff --git a/instrumentation/opentelemetry-instrumentation-urllib/src/opentelemetry/instrumentation/urllib/__init__.py b/instrumentation/opentelemetry-instrumentation-urllib/src/opentelemetry/instrumentation/urllib/__init__.py index 3436e37888..3958a666ba 100644 --- a/instrumentation/opentelemetry-instrumentation-urllib/src/opentelemetry/instrumentation/urllib/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-urllib/src/opentelemetry/instrumentation/urllib/__init__.py @@ -50,7 +50,9 @@ HTTPMetricType, MetricMixin, ) -from opentelemetry.instrumentation.urllib.version import __version__ +from opentelemetry.instrumentation.urllib.version import ( # pylint: disable=no-name-in-module,import-error + __version__, +) from opentelemetry.instrumentation.utils import http_status_to_status_code from opentelemetry.trace import SpanKind, get_tracer from opentelemetry.trace.status import Status, StatusCode @@ -98,6 +100,7 @@ def _uninstrument(self, **kwargs): def uninstrument_opener( self, opener: OpenerDirector ): # pylint: disable=no-self-use + """uninstrument_opener a specific instance of urllib.request.OpenerDirector""" _uninstrument_from(opener, restore_as_bound_func=True) @@ -131,7 +134,7 @@ def call_wrapped(): ) def _instrumented_open_call( - opener, request, call_wrapped, get_or_create_headers + _, request, call_wrapped, get_or_create_headers ): # pylint: disable=too-many-locals if context.get_value("suppress_instrumentation") or context.get_value( _SUPPRESS_URLLIB_INSTRUMENTATION_KEY diff --git a/instrumentation/opentelemetry-instrumentation-urllib/tests/test_urllib_integration.py b/instrumentation/opentelemetry-instrumentation-urllib/tests/test_urllib_integration.py index f39fe26a35..28f84a62e1 100644 --- a/instrumentation/opentelemetry-instrumentation-urllib/tests/test_urllib_integration.py +++ b/instrumentation/opentelemetry-instrumentation-urllib/tests/test_urllib_integration.py @@ -23,9 +23,11 @@ import httpretty -import opentelemetry.instrumentation.urllib +import opentelemetry.instrumentation.urllib # pylint: disable=no-name-in-module,import-error from opentelemetry import context, propagators, trace -from opentelemetry.instrumentation.urllib import URLLibInstrumentor +from opentelemetry.instrumentation.urllib import ( # pylint: disable=no-name-in-module,import-error + URLLibInstrumentor, +) from opentelemetry.sdk import resources from opentelemetry.sdk.util import get_dict_as_key from opentelemetry.test.mock_textmap import MockTextMapPropagator diff --git a/instrumentation/opentelemetry-instrumentation-wsgi/tests/test_getter.py b/instrumentation/opentelemetry-instrumentation-wsgi/tests/test_getter.py index 630e5fc579..80cf6b1ecd 100644 --- a/instrumentation/opentelemetry-instrumentation-wsgi/tests/test_getter.py +++ b/instrumentation/opentelemetry-instrumentation-wsgi/tests/test_getter.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from unittest import TestCase, mock +from unittest import TestCase from opentelemetry.instrumentation.wsgi import CarrierGetter diff --git a/scripts/eachdist.py b/scripts/eachdist.py index cfa1764ab3..4bf1f33370 100755 --- a/scripts/eachdist.py +++ b/scripts/eachdist.py @@ -509,7 +509,7 @@ def lint_args(args): ) runsubprocess( args.dry_run, - ("isort", "--recursive", ".") + ("isort", ".") + (("--diff", "--check-only") if args.check_only else ()), cwd=rootdir, check=True, diff --git a/tox.ini b/tox.ini index a2d6801513..967136e2df 100644 --- a/tox.ini +++ b/tox.ini @@ -283,7 +283,7 @@ commands = [testenv:lint] basepython: python3.8 -recreate = True +recreate = False deps = -c dev-requirements.txt flaky From 9fea7f7a2709b0c846934bafb27f3c1c1e415eea Mon Sep 17 00:00:00 2001 From: Owais Lone Date: Tue, 5 Jan 2021 22:35:58 +0530 Subject: [PATCH 3/9] Ensure SQLAlchemy spans have kind set to CLIENT (#278) SQLAlchemy spans were missing kind field and it was being set to internal instead of client. This commit changes sqlalchemy spans to have kind set to "client" instead. --- CHANGELOG.md | 2 ++ .../src/opentelemetry/instrumentation/sqlalchemy/engine.py | 4 +++- .../tests/test_sqlalchemy.py | 3 +++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13c76278bc..8ee9f66b6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ 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.16b1...HEAD) ### Added +- `opentelemetry-instrumentation-sqlalchemy` Ensure spans have kind set to "CLIENT" + ([#278](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/278)) - `opentelemetry-instrumentation-celery` Add support for Celery version 5.x ([#266](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/266)) - `opentelemetry-instrumentation-urllib` Add urllib instrumentation diff --git a/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/engine.py b/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/engine.py index 07e86d5856..86f52ad724 100644 --- a/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/engine.py +++ b/instrumentation/opentelemetry-instrumentation-sqlalchemy/src/opentelemetry/instrumentation/sqlalchemy/engine.py @@ -74,7 +74,9 @@ def __init__(self, tracer, engine): # pylint: disable=unused-argument def _before_cur_exec(self, conn, cursor, statement, *args): - self.current_span = self.tracer.start_span(statement) + self.current_span = self.tracer.start_span( + statement, kind=trace.SpanKind.CLIENT + ) with self.tracer.use_span(self.current_span, end_on_exit=False): if self.current_span.is_recording(): self.current_span.set_attribute(_STMT, statement) diff --git a/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py b/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py index a0187454ba..dfc6e429a7 100644 --- a/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py +++ b/instrumentation/opentelemetry-instrumentation-sqlalchemy/tests/test_sqlalchemy.py @@ -15,6 +15,7 @@ from sqlalchemy import create_engine +from opentelemetry import trace from opentelemetry.instrumentation.sqlalchemy import SQLAlchemyInstrumentor from opentelemetry.test.test_base import TestBase @@ -35,6 +36,7 @@ def test_trace_integration(self): self.assertEqual(len(spans), 1) self.assertEqual(spans[0].name, "SELECT 1 + 1;") + self.assertEqual(spans[0].kind, trace.SpanKind.CLIENT) def test_not_recording(self): mock_tracer = mock.Mock() @@ -67,3 +69,4 @@ def test_create_engine_wrapper(self): self.assertEqual(len(spans), 1) self.assertEqual(spans[0].name, "SELECT 1 + 1;") + self.assertEqual(spans[0].kind, trace.SpanKind.CLIENT) From 5a6c4f6fd2f059b115d3ad0bbabd7c239612efa7 Mon Sep 17 00:00:00 2001 From: Michael Stella Date: Tue, 5 Jan 2021 12:58:47 -0500 Subject: [PATCH 4/9] datadog-exporter: bugfix for unintentional type change (#261) --- CHANGELOG.md | 4 +++- .../src/opentelemetry/exporter/datadog/propagator.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ee9f66b6a..22eaa4a017 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,7 +46,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `opentelemetry-instrumentation-flask` Do not emit a warning message for request contexts created with `app.test_request_context` ([#253](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/253)) - `opentelemetry-instrumentation-requests`, `opentelemetry-instrumentation-urllib` Fix span name callback parameters -- ([#259](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/259)) + ([#259](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/259)) +- `opentelemetry-exporter-datadog` Fix unintentional type change of span trace flags + ([#261](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/261)) ## [0.16b1](https://github.com/open-telemetry/opentelemetry-python-contrib/releases/tag/v0.16b1) - 2020-11-26 diff --git a/exporter/opentelemetry-exporter-datadog/src/opentelemetry/exporter/datadog/propagator.py b/exporter/opentelemetry-exporter-datadog/src/opentelemetry/exporter/datadog/propagator.py index 27fa15b7b2..66c833174e 100644 --- a/exporter/opentelemetry-exporter-datadog/src/opentelemetry/exporter/datadog/propagator.py +++ b/exporter/opentelemetry-exporter-datadog/src/opentelemetry/exporter/datadog/propagator.py @@ -60,7 +60,7 @@ def extract( constants.AUTO_KEEP, constants.USER_KEEP, ): - trace_flags |= trace.TraceFlags.SAMPLED + trace_flags = trace.TraceFlags(trace.TraceFlags.SAMPLED) if trace_id is None or span_id is None: return set_span_in_context(trace.INVALID_SPAN, context) From 21a5c164fa9539d7c39e21ffa47d9b13f8971a3b Mon Sep 17 00:00:00 2001 From: Thomas Desrosiers <681004+thomasdesr@users.noreply.github.com> Date: Tue, 5 Jan 2021 20:27:18 -0500 Subject: [PATCH 5/9] Adds back retry_attempts to botocore (#275) --- CHANGELOG.md | 2 ++ .../instrumentation/botocore/__init__.py | 5 +++++ .../tests/test_botocore_instrumentation.py | 16 ++++++++++++++++ 3 files changed, 23 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22eaa4a017..52b8b0e331 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#236](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/236)) - Add README and example app for Prometheus Remote Write Exporter ([#227](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/227])) +- `opentelemetry-instrumentation-botocore` Adds a field to report the number of retries it take to complete an API call + ([#275](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/275)) ### Changed - `opentelemetry-instrumentation-asgi`, `opentelemetry-instrumentation-wsgi` Return `None` for `CarrierGetter` if key not found diff --git a/instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/__init__.py b/instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/__init__.py index 713a1e6a61..3ba8af1c02 100644 --- a/instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/__init__.py @@ -153,6 +153,11 @@ def _patched_api_call(self, original_func, instance, args, kwargs): "aws.request_id", req_id, ) + if "RetryAttempts" in metadata: + span.set_attribute( + "retry_attempts", metadata["RetryAttempts"], + ) + if "HTTPStatusCode" in metadata: span.set_attribute( "http.status_code", metadata["HTTPStatusCode"], diff --git a/instrumentation/opentelemetry-instrumentation-botocore/tests/test_botocore_instrumentation.py b/instrumentation/opentelemetry-instrumentation-botocore/tests/test_botocore_instrumentation.py index 23dc32d2dc..72f5f5fea9 100644 --- a/instrumentation/opentelemetry-instrumentation-botocore/tests/test_botocore_instrumentation.py +++ b/instrumentation/opentelemetry-instrumentation-botocore/tests/test_botocore_instrumentation.py @@ -69,6 +69,7 @@ def test_traced_client(self): "aws.region": "us-west-2", "aws.request_id": "fdcdcab1-ae5c-489e-9c33-4637c5dda355", "aws.service": "ec2", + "retry_attempts": 0, "http.status_code": 200, }, ) @@ -116,6 +117,7 @@ def test_s3_client(self): "aws.operation": "ListBuckets", "aws.region": "us-west-2", "aws.service": "s3", + "retry_attempts": 0, "http.status_code": 200, }, ) @@ -159,6 +161,7 @@ def test_s3_put(self): "aws.operation": "CreateBucket", "aws.region": "us-west-2", "aws.service": "s3", + "retry_attempts": 0, "http.status_code": 200, }, ) @@ -169,6 +172,7 @@ def test_s3_put(self): "aws.operation": "PutObject", "aws.region": "us-west-2", "aws.service": "s3", + "retry_attempts": 0, "http.status_code": 200, }, ) @@ -180,6 +184,7 @@ def test_s3_put(self): "aws.operation": "GetObject", "aws.region": "us-west-2", "aws.service": "s3", + "retry_attempts": 0, "http.status_code": 200, }, ) @@ -203,6 +208,7 @@ def test_sqs_client(self): "aws.operation": "ListQueues", "aws.region": "us-east-1", "aws.service": "sqs", + "retry_attempts": 0, "http.status_code": 200, }, ) @@ -233,6 +239,7 @@ def test_sqs_send_message(self): "aws.operation": "CreateQueue", "aws.region": "us-east-1", "aws.service": "sqs", + "retry_attempts": 0, "http.status_code": 200, }, ) @@ -248,6 +255,7 @@ def test_sqs_send_message(self): "aws.queue_url": response["QueueUrl"], "aws.region": "us-east-1", "aws.service": "sqs", + "retry_attempts": 0, "http.status_code": 200, }, ) @@ -270,6 +278,7 @@ def test_kinesis_client(self): "aws.operation": "ListStreams", "aws.region": "us-east-1", "aws.service": "kinesis", + "retry_attempts": 0, "http.status_code": 200, }, ) @@ -315,6 +324,7 @@ def test_lambda_client(self): "aws.operation": "ListFunctions", "aws.region": "us-east-1", "aws.service": "lambda", + "retry_attempts": 0, "http.status_code": 200, }, ) @@ -335,6 +345,7 @@ def test_kms_client(self): "aws.operation": "ListKeys", "aws.region": "us-east-1", "aws.service": "kms", + "retry_attempts": 0, "http.status_code": 200, }, ) @@ -359,6 +370,7 @@ def test_sts_client(self): "aws.region": "us-east-1", "aws.request_id": "c6104cbe-af31-11e0-8154-cbc7ccf896c7", "aws.service": "sts", + "retry_attempts": 0, "http.status_code": 200, }, ) @@ -395,6 +407,7 @@ def check_headers(**kwargs): "aws.region": "us-west-2", "aws.request_id": "fdcdcab1-ae5c-489e-9c33-4637c5dda355", "aws.service": "ec2", + "retry_attempts": 0, "http.status_code": 200, }, ) @@ -463,6 +476,7 @@ def test_dynamodb_client(self): "aws.region": "us-west-2", "aws.service": "dynamodb", "aws.table_name": "test_table_name", + "retry_attempts": 0, "http.status_code": 200, }, ) @@ -478,6 +492,7 @@ def test_dynamodb_client(self): "aws.region": "us-west-2", "aws.service": "dynamodb", "aws.table_name": "test_table_name", + "retry_attempts": 0, "http.status_code": 200, }, ) @@ -493,6 +508,7 @@ def test_dynamodb_client(self): "aws.region": "us-west-2", "aws.service": "dynamodb", "aws.table_name": "test_table_name", + "retry_attempts": 0, "http.status_code": 200, }, ) From 8abed0718471cb21462c5699a983be31d6c24c00 Mon Sep 17 00:00:00 2001 From: alrex Date: Wed, 6 Jan 2021 20:39:12 -0800 Subject: [PATCH 6/9] fix docker-tests build (#282) --- tox.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/tox.ini b/tox.ini index 967136e2df..e4958aa7f9 100644 --- a/tox.ini +++ b/tox.ini @@ -341,6 +341,7 @@ commands = [testenv:docker-tests] deps = + pip >= 20.3.3 pytest asyncpg==0.20.1 docker-compose >= 1.25.2 From cb01a6bcb796fc2f9173775496d0eff3a820e08d Mon Sep 17 00:00:00 2001 From: Dave Grochowski Date: Thu, 7 Jan 2021 21:24:19 -0500 Subject: [PATCH 7/9] Use instanceof to check if responses are valid Response objects (#273) --- CHANGELOG.md | 2 + .../instrumentation/requests/__init__.py | 3 +- .../tests/test_requests_integration.py | 42 +++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52b8b0e331..dbff5818b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#227](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/227])) - `opentelemetry-instrumentation-botocore` Adds a field to report the number of retries it take to complete an API call ([#275](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/275)) +- `opentelemetry-instrumentation-requests` Use instanceof to check if responses are valid Response objects + ([#273](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/273)) ### Changed - `opentelemetry-instrumentation-asgi`, `opentelemetry-instrumentation-wsgi` Return `None` for `CarrierGetter` if key not found diff --git a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py index 993309c7ed..13f6d8448a 100644 --- a/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py @@ -38,6 +38,7 @@ 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 @@ -158,7 +159,7 @@ def _instrumented_requests_call( finally: context.detach(token) - if result is not None: + if isinstance(result, Response): if span.is_recording(): span.set_attribute( "http.status_code", result.status_code diff --git a/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py b/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py index e871ecfbae..7749c1f8ab 100644 --- a/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py +++ b/instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py @@ -28,6 +28,12 @@ from opentelemetry.trace.status import StatusCode +class InvalidResponseObjectException(Exception): + def __init__(self): + super().__init__() + self.response = {} + + class RequestsIntegrationTestBase(abc.ABC): # pylint: disable=no-member @@ -307,6 +313,42 @@ def test_requests_exception_without_response(self, *_, **__): mocked_response.status_code = 500 mocked_response.reason = "Internal Server Error" + @mock.patch( + "requests.adapters.HTTPAdapter.send", + side_effect=InvalidResponseObjectException, + ) + def test_requests_exception_without_proper_response_type(self, *_, **__): + with self.assertRaises(InvalidResponseObjectException): + self.perform_request(self.URL) + + span = self.assert_span() + self.assertEqual( + span.attributes, + {"component": "http", "http.method": "GET", "http.url": self.URL}, + ) + self.assertEqual(span.status.status_code, StatusCode.ERROR) + + self.assertIsNotNone(RequestsInstrumentor().meter) + self.assertEqual(len(RequestsInstrumentor().meter.instruments), 1) + recorder = list(RequestsInstrumentor().meter.instruments.values())[0] + match_key = get_dict_as_key( + { + "http.method": "GET", + "http.url": "http://httpbin.org/status/200", + } + ) + for key in recorder.bound_instruments.keys(): + self.assertEqual(key, match_key) + # pylint: disable=protected-access + bound = recorder.bound_instruments.get(key) + for view_data in bound.view_datas: + self.assertEqual(view_data.labels, key) + self.assertEqual(view_data.aggregator.current.count, 1) + + mocked_response = requests.Response() + mocked_response.status_code = 500 + mocked_response.reason = "Internal Server Error" + @mock.patch( "requests.adapters.HTTPAdapter.send", side_effect=requests.RequestException(response=mocked_response), From 57b8106edc58e16aa52eced9289418b7c0850704 Mon Sep 17 00:00:00 2001 From: Srikanth Chekuri Date: Fri, 8 Jan 2021 22:26:38 +0530 Subject: [PATCH 8/9] Fix AttributeError: __aexit__ for aiopg.connect and aiopg.create_pool (#235) --- CHANGELOG.md | 2 + .../instrumentation/aiopg/wrappers.py | 13 +++-- .../tests/test_aiopg_integration.py | 50 +++++++++++++++++++ 3 files changed, 61 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dbff5818b0..418490c84a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,6 +53,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#259](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/259)) - `opentelemetry-exporter-datadog` Fix unintentional type change of span trace flags ([#261](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/261)) +- `opentelemetry-instrumentation-aiopg` Fix AttributeError `__aexit__` when `aiopg.connect` and `aio[g].create_pool` used with async context manager + ([#235](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/235)) ## [0.16b1](https://github.com/open-telemetry/opentelemetry-python-contrib/releases/tag/v0.16b1) - 2020-11-26 diff --git a/instrumentation/opentelemetry-instrumentation-aiopg/src/opentelemetry/instrumentation/aiopg/wrappers.py b/instrumentation/opentelemetry-instrumentation-aiopg/src/opentelemetry/instrumentation/aiopg/wrappers.py index cb976e85c7..63a5d17514 100644 --- a/instrumentation/opentelemetry-instrumentation-aiopg/src/opentelemetry/instrumentation/aiopg/wrappers.py +++ b/instrumentation/opentelemetry-instrumentation-aiopg/src/opentelemetry/instrumentation/aiopg/wrappers.py @@ -34,6 +34,7 @@ import aiopg import wrapt +from aiopg.utils import _ContextManager, _PoolContextManager from opentelemetry.instrumentation.aiopg.aiopg_integration import ( AiopgIntegration, @@ -99,7 +100,7 @@ def wrap_connect( """ # pylint: disable=unused-argument - async def wrap_connect_( + def wrap_connect_( wrapped: typing.Callable[..., typing.Any], instance: typing.Any, args: typing.Tuple[typing.Any, typing.Any], @@ -113,7 +114,9 @@ async def wrap_connect_( version=version, tracer_provider=tracer_provider, ) - return await db_integration.wrapped_connection(wrapped, args, kwargs) + return _ContextManager( + db_integration.wrapped_connection(wrapped, args, kwargs) + ) try: wrapt.wrap_function_wrapper(aiopg, "connect", wrap_connect_) @@ -191,7 +194,7 @@ def wrap_create_pool( tracer_provider: typing.Optional[TracerProvider] = None, ): # pylint: disable=unused-argument - async def wrap_create_pool_( + def wrap_create_pool_( wrapped: typing.Callable[..., typing.Any], instance: typing.Any, args: typing.Tuple[typing.Any, typing.Any], @@ -205,7 +208,9 @@ async def wrap_create_pool_( version=version, tracer_provider=tracer_provider, ) - return await db_integration.wrapped_pool(wrapped, args, kwargs) + return _PoolContextManager( + db_integration.wrapped_pool(wrapped, args, kwargs) + ) try: wrapt.wrap_function_wrapper(aiopg, "create_pool", wrap_create_pool_) diff --git a/instrumentation/opentelemetry-instrumentation-aiopg/tests/test_aiopg_integration.py b/instrumentation/opentelemetry-instrumentation-aiopg/tests/test_aiopg_integration.py index c6f771e1b2..ad935cfdfd 100644 --- a/instrumentation/opentelemetry-instrumentation-aiopg/tests/test_aiopg_integration.py +++ b/instrumentation/opentelemetry-instrumentation-aiopg/tests/test_aiopg_integration.py @@ -79,6 +79,26 @@ def test_instrumentor_connect(self): spans_list = self.memory_exporter.get_finished_spans() self.assertEqual(len(spans_list), 1) + def test_instrumentor_connect_ctx_manager(self): + async def _ctx_manager_connect(): + AiopgInstrumentor().instrument() + + async with aiopg.connect(database="test") as cnx: + async with cnx.cursor() as cursor: + query = "SELECT * FROM test" + await cursor.execute(query) + + spans_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans_list), 1) + span = spans_list[0] + + # Check version and name in span's instrumentation info + self.check_span_instrumentation_info( + span, opentelemetry.instrumentation.aiopg + ) + + async_call(_ctx_manager_connect()) + def test_instrumentor_create_pool(self): AiopgInstrumentor().instrument() @@ -110,6 +130,27 @@ def test_instrumentor_create_pool(self): spans_list = self.memory_exporter.get_finished_spans() self.assertEqual(len(spans_list), 1) + def test_instrumentor_create_pool_ctx_manager(self): + async def _ctx_manager_pool(): + AiopgInstrumentor().instrument() + + async with aiopg.create_pool(database="test") as pool: + async with pool.acquire() as cnx: + async with cnx.cursor() as cursor: + query = "SELECT * FROM test" + await cursor.execute(query) + + spans_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans_list), 1) + span = spans_list[0] + + # Check version and name in span's instrumentation info + self.check_span_instrumentation_info( + span, opentelemetry.instrumentation.aiopg + ) + + async_call(_ctx_manager_pool()) + def test_custom_tracer_provider_connect(self): resource = resources.Resource.create({}) result = self.create_tracer_provider(resource=resource) @@ -428,6 +469,12 @@ async def _acquire(self): ) return connect + def close(self): + pass + + async def wait_closed(self): + pass + class MockPsycopg2Connection: def __init__(self, database, server_port, server_host, user): @@ -471,6 +518,9 @@ async def callproc(self, query, params=None, throw_exception=False): if throw_exception: raise Exception("Test Exception") + def close(self): + pass + class AiopgConnectionMock: _conn = MagicMock() From d12f67fc31f0376440b21083f328834693ac7ee2 Mon Sep 17 00:00:00 2001 From: Leighton Chen Date: Mon, 11 Jan 2021 12:40:38 -0800 Subject: [PATCH 9/9] Fix ids_generator references from moving from api to sdk (#283) --- .github/workflows/test.yml | 2 +- CHANGELOG.md | 2 ++ .../tests/test_datadog_format.py | 7 ++++--- .../sdk/extension/aws/trace/aws_xray_ids_generator.py | 9 ++++++--- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c4dd9b5af4..02406343a7 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -6,7 +6,7 @@ on: - 'release/*' pull_request: env: - CORE_REPO_SHA: master + CORE_REPO_SHA: 2b188b9a43dfaa74c1a0a4514b91d1cb07d3075d jobs: build: diff --git a/CHANGELOG.md b/CHANGELOG.md index 418490c84a..0312ed9764 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,6 +55,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#261](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/261)) - `opentelemetry-instrumentation-aiopg` Fix AttributeError `__aexit__` when `aiopg.connect` and `aio[g].create_pool` used with async context manager ([#235](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/235)) +- `opentelemetry-exporter-datadog` `opentelemetry-sdk-extension-aws` Fix reference to ids_generator in sdk + ([#235](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/235)) ## [0.16b1](https://github.com/open-telemetry/opentelemetry-python-contrib/releases/tag/v0.16b1) - 2020-11-26 diff --git a/exporter/opentelemetry-exporter-datadog/tests/test_datadog_format.py b/exporter/opentelemetry-exporter-datadog/tests/test_datadog_format.py index 7f1491744f..4f5b4c07e2 100644 --- a/exporter/opentelemetry-exporter-datadog/tests/test_datadog_format.py +++ b/exporter/opentelemetry-exporter-datadog/tests/test_datadog_format.py @@ -18,6 +18,7 @@ from opentelemetry import trace as trace_api from opentelemetry.exporter.datadog import constants, propagator from opentelemetry.sdk import trace +from opentelemetry.sdk.trace.ids_generator import RandomIdsGenerator from opentelemetry.trace import get_current_span, set_span_in_context from opentelemetry.trace.propagation.textmap import DictGetter @@ -29,7 +30,7 @@ class TestDatadogFormat(unittest.TestCase): @classmethod def setUpClass(cls): - ids_generator = trace_api.RandomIdsGenerator() + ids_generator = RandomIdsGenerator() cls.serialized_trace_id = propagator.format_trace_id( ids_generator.generate_trace_id() ) @@ -107,7 +108,7 @@ def test_context_propagation(self): "child", trace_api.SpanContext( parent_span_context.trace_id, - trace_api.RandomIdsGenerator().generate_span_id(), + RandomIdsGenerator().generate_span_id(), is_remote=False, trace_flags=parent_span_context.trace_flags, trace_state=parent_span_context.trace_state, @@ -154,7 +155,7 @@ def test_sampling_priority_auto_reject(self): "child", trace_api.SpanContext( parent_span_context.trace_id, - trace_api.RandomIdsGenerator().generate_span_id(), + RandomIdsGenerator().generate_span_id(), is_remote=False, trace_flags=parent_span_context.trace_flags, trace_state=parent_span_context.trace_state, diff --git a/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/trace/aws_xray_ids_generator.py b/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/trace/aws_xray_ids_generator.py index aa7d51bc7d..6928e0b18d 100644 --- a/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/trace/aws_xray_ids_generator.py +++ b/sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/trace/aws_xray_ids_generator.py @@ -15,10 +15,13 @@ import random import time -from opentelemetry import trace +from opentelemetry.sdk.trace.ids_generator import ( + IdsGenerator, + RandomIdsGenerator, +) -class AwsXRayIdsGenerator(trace.IdsGenerator): +class AwsXRayIdsGenerator(IdsGenerator): """Generates tracing IDs compatible with the AWS X-Ray tracing service. In the X-Ray system, the first 32 bits of the `TraceId` are the Unix epoch time in seconds. Since spans (AWS calls them segments) with an embedded timestamp @@ -28,7 +31,7 @@ class AwsXRayIdsGenerator(trace.IdsGenerator): See: https://docs.aws.amazon.com/xray/latest/devguide/xray-api-sendingdata.html#xray-api-traceids """ - random_ids_generator = trace.RandomIdsGenerator() + random_ids_generator = RandomIdsGenerator() def generate_span_id(self) -> int: return self.random_ids_generator.generate_span_id()