From 094e377e99bac5cc02d3478c310f9df0d36fbfc1 Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Wed, 25 Nov 2020 14:13:04 -0800 Subject: [PATCH 01/11] move initialize_components into the SDK --- .../auto_instrumentation/sitecustomize.py | 12 +++++++++--- opentelemetry-sdk/setup.cfg | 5 +++++ .../opentelemetry/sdk/configuration/__init__.py | 15 ++++++++++----- 3 files changed, 24 insertions(+), 8 deletions(-) rename opentelemetry-instrumentation/src/opentelemetry/instrumentation/auto_instrumentation/components.py => opentelemetry-sdk/src/opentelemetry/sdk/configuration/__init__.py (95%) diff --git a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/auto_instrumentation/sitecustomize.py b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/auto_instrumentation/sitecustomize.py index c56d86c7f1..ac6b52eeba 100644 --- a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/auto_instrumentation/sitecustomize.py +++ b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/auto_instrumentation/sitecustomize.py @@ -18,9 +18,6 @@ from pkg_resources import iter_entry_points -from opentelemetry.instrumentation.auto_instrumentation.components import ( - initialize_components, -) logger = getLogger(__file__) @@ -35,6 +32,15 @@ def auto_instrument(): raise exc +def initialize_components(): + for entry_point in iter_entry_points("opentelemetry_configure"): + try: + entry_point.load()().configure() # type: ignore + except Exception as exc: # pylint: disable=broad-except + logger.exception("Configuration of %s failed", entry_point.name) + raise exc + + def initialize(): try: initialize_components() diff --git a/opentelemetry-sdk/setup.cfg b/opentelemetry-sdk/setup.cfg index d27a24cf49..72321eaa47 100644 --- a/opentelemetry-sdk/setup.cfg +++ b/opentelemetry-sdk/setup.cfg @@ -53,6 +53,11 @@ opentelemetry_tracer_provider = sdk_tracer_provider = opentelemetry.sdk.trace:TracerProvider opentelemetry_propagator = b3 = opentelemetry.sdk.trace.propagation.b3_format:B3Format +opentelemetry_exporter = + console_span = opentelemetry.sdk.trace.export:ConsoleSpanExporter + console_metric = opentelemetry.sdk.metrics.export:ConsoleSpanExporter +opentelemetry_configure = + sdk_configurator = opentelemetry.sdk.configuration:Configurator [options.extras_require] test = diff --git a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/auto_instrumentation/components.py b/opentelemetry-sdk/src/opentelemetry/sdk/configuration/__init__.py similarity index 95% rename from opentelemetry-instrumentation/src/opentelemetry/instrumentation/auto_instrumentation/components.py rename to opentelemetry-sdk/src/opentelemetry/sdk/configuration/__init__.py index 8b4ef4f3e8..2a0f957a33 100644 --- a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/auto_instrumentation/components.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/configuration/__init__.py @@ -74,11 +74,11 @@ def init_tracing( for exporter_name, exporter_class in exporters.items(): exporter_args = {} - if exporter_name not in [ - EXPORTER_OTLP, - EXPORTER_OTLP_SPAN, - ]: - exporter_args["service_name"] = service_name + # if exporter_name not in [ + # EXPORTER_OTLP, + # EXPORTER_OTLP_SPAN, + # ]: + # exporter_args["service_name"] = service_name provider.add_span_processor( BatchExportSpanProcessor(exporter_class(**exporter_args)) @@ -161,3 +161,8 @@ def initialize_components(): # some boilerplate in order to make sure current implementation does not # lock us out of supporting metrics later without major surgery. init_metrics(metric_exporters) + + +class Configurator: + def configure(self): + initialize_components() From 07a51eecad1d54cf39ed36a068e787d8af7d054f Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Wed, 25 Nov 2020 14:17:36 -0800 Subject: [PATCH 02/11] uncomment code --- .../src/opentelemetry/sdk/configuration/__init__.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/configuration/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/configuration/__init__.py index 2a0f957a33..35b09e1605 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/configuration/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/configuration/__init__.py @@ -74,11 +74,11 @@ def init_tracing( for exporter_name, exporter_class in exporters.items(): exporter_args = {} - # if exporter_name not in [ - # EXPORTER_OTLP, - # EXPORTER_OTLP_SPAN, - # ]: - # exporter_args["service_name"] = service_name + if exporter_name not in [ + EXPORTER_OTLP, + EXPORTER_OTLP_SPAN, + ]: + exporter_args["service_name"] = service_name provider.add_span_processor( BatchExportSpanProcessor(exporter_class(**exporter_args)) From c65b4a00addadc7967b961c63effec3aad052298 Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Wed, 25 Nov 2020 15:30:10 -0800 Subject: [PATCH 03/11] warn if configuration has already been loaded --- .../auto_instrumentation/sitecustomize.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/auto_instrumentation/sitecustomize.py b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/auto_instrumentation/sitecustomize.py index ac6b52eeba..bd765e1684 100644 --- a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/auto_instrumentation/sitecustomize.py +++ b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/auto_instrumentation/sitecustomize.py @@ -33,9 +33,18 @@ def auto_instrument(): def initialize_components(): + configured = None for entry_point in iter_entry_points("opentelemetry_configure"): + if configured is not None: + logger.warning( + "Configuration of %s not loaded, %s already loaded", + entry_point.name, + configured, + ) + continue try: entry_point.load()().configure() # type: ignore + configured = entry_point.name except Exception as exc: # pylint: disable=broad-except logger.exception("Configuration of %s failed", entry_point.name) raise exc From 053cae3d68c2d6321f0fc2970c0517af6927458a Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Tue, 8 Dec 2020 16:14:49 -0800 Subject: [PATCH 04/11] fix tests --- .../tests/configuration/test_configurator.py | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) rename opentelemetry-instrumentation/tests/test_auto_tracing.py => opentelemetry-sdk/tests/configuration/test_configurator.py (83%) diff --git a/opentelemetry-instrumentation/tests/test_auto_tracing.py b/opentelemetry-sdk/tests/configuration/test_configurator.py similarity index 83% rename from opentelemetry-instrumentation/tests/test_auto_tracing.py rename to opentelemetry-sdk/tests/configuration/test_configurator.py index 9ffe421a25..2f7dcc9a10 100644 --- a/opentelemetry-instrumentation/tests/test_auto_tracing.py +++ b/opentelemetry-sdk/tests/configuration/test_configurator.py @@ -18,7 +18,11 @@ from unittest.mock import patch from opentelemetry.configuration import Configuration -from opentelemetry.instrumentation.auto_instrumentation import components +from opentelemetry.sdk.configuration import ( + get_ids_generator, + import_ids_generator, + init_tracing, +) from opentelemetry.sdk.resources import Resource from opentelemetry.trace.ids_generator import RandomIdsGenerator @@ -71,11 +75,10 @@ class TestTraceInit(TestCase): def setUp(self): super() self.get_provider_patcher = patch( - "opentelemetry.instrumentation.auto_instrumentation.components.TracerProvider", - Provider, + "opentelemetry.sdk.configuration.TracerProvider", Provider, ) self.get_processor_patcher = patch( - "opentelemetry.instrumentation.auto_instrumentation.components.BatchExportSpanProcessor", + "opentelemetry.sdk.configuration.BatchExportSpanProcessor", Processor, ) self.set_provider_patcher = patch( @@ -96,7 +99,7 @@ def tearDown(self): def test_trace_init_default(self): environ["OTEL_SERVICE_NAME"] = "my-test-service" Configuration._reset() - components.init_tracing({"zipkin": Exporter}, RandomIdsGenerator) + init_tracing({"zipkin": Exporter}, RandomIdsGenerator) self.assertEqual(self.set_provider_mock.call_count, 1) provider = self.set_provider_mock.call_args[0][0] @@ -111,7 +114,7 @@ def test_trace_init_default(self): def test_trace_init_otlp(self): environ["OTEL_SERVICE_NAME"] = "my-otlp-test-service" Configuration._reset() - components.init_tracing({"otlp": OTLPExporter}, RandomIdsGenerator) + init_tracing({"otlp": OTLPExporter}, RandomIdsGenerator) self.assertEqual(self.set_provider_mock.call_count, 1) provider = self.set_provider_mock.call_args[0][0] @@ -128,12 +131,9 @@ def test_trace_init_otlp(self): @patch.dict(environ, {"OTEL_IDS_GENERATOR": "custom_ids_generator"}) @patch( - "opentelemetry.instrumentation.auto_instrumentation.components.trace.IdsGenerator", - new=IdsGenerator, - ) - @patch( - "opentelemetry.instrumentation.auto_instrumentation.components.iter_entry_points" + "opentelemetry.sdk.configuration.trace.IdsGenerator", new=IdsGenerator, ) + @patch("opentelemetry.sdk.configuration.iter_entry_points") def test_trace_init_custom_ids_generator(self, mock_iter_entry_points): mock_iter_entry_points.configure_mock( return_value=[ @@ -141,8 +141,8 @@ def test_trace_init_custom_ids_generator(self, mock_iter_entry_points): ] ) Configuration._reset() - ids_generator_name = components.get_ids_generator() - ids_generator = components.import_ids_generator(ids_generator_name) - components.init_tracing({}, ids_generator) + ids_generator_name = get_ids_generator() + ids_generator = import_ids_generator(ids_generator_name) + init_tracing({}, ids_generator) provider = self.set_provider_mock.call_args[0][0] self.assertIsInstance(provider.ids_generator, CustomIdsGenerator) From d8542504fd700958145bd29fa9151d352afcb935 Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Thu, 10 Dec 2020 12:17:03 -0800 Subject: [PATCH 05/11] adding ABC for Configurator --- .../auto_instrumentation/sitecustomize.py | 16 ++++-- .../instrumentation/configurator.py | 53 +++++++++++++++++++ .../sdk/configuration/__init__.py | 44 +++++++-------- 3 files changed, 87 insertions(+), 26 deletions(-) create mode 100644 opentelemetry-instrumentation/src/opentelemetry/instrumentation/configurator.py diff --git a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/auto_instrumentation/sitecustomize.py b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/auto_instrumentation/sitecustomize.py index bd765e1684..ce375ba5cd 100644 --- a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/auto_instrumentation/sitecustomize.py +++ b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/auto_instrumentation/sitecustomize.py @@ -22,7 +22,12 @@ logger = getLogger(__file__) -def auto_instrument(): +def _load_distros(): + # will be implemented in a subsequent PR + pass + + +def _load_instrumentors(): for entry_point in iter_entry_points("opentelemetry_instrumentor"): try: entry_point.load()().instrument() # type: ignore @@ -32,9 +37,9 @@ def auto_instrument(): raise exc -def initialize_components(): +def _load_configurators(): configured = None - for entry_point in iter_entry_points("opentelemetry_configure"): + for entry_point in iter_entry_points("opentelemetry_configurator"): if configured is not None: logger.warning( "Configuration of %s not loaded, %s already loaded", @@ -52,8 +57,9 @@ def initialize_components(): def initialize(): try: - initialize_components() - auto_instrument() + _load_distros() + _load_configurators() + _load_instrumentors() except Exception: # pylint: disable=broad-except logger.exception("Failed to auto initialize opentelemetry") diff --git a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/configurator.py b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/configurator.py new file mode 100644 index 0000000000..dd0cd0b939 --- /dev/null +++ b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/configurator.py @@ -0,0 +1,53 @@ +# 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. +# type: ignore + +""" +OpenTelemetry Base Configurator +""" + +from abc import ABC, abstractmethod +from logging import getLogger + +_LOG = getLogger(__name__) + + +class BaseConfigurator(ABC): + """An ABC for configurators + + Configurators are used to configure + SDKs (i.e. TracerProvider, MeterProvider, Processors...) + to reduce the amount of manual configuration required. + """ + + _instance = None + _is_instrumented = False + + def __new__(cls, *args, **kwargs): + + if cls._instance is None: + cls._instance = object.__new__(cls, *args, **kwargs) + + return cls._instance + + @abstractmethod + def _configure(self, **kwargs): + """Configure the SDK""" + + def configure(self, **kwargs): + """Configure the SDK""" + pass + + +__all__ = ["BaseConfigurator"] diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/configuration/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/configuration/__init__.py index 35b09e1605..210a4f9842 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/configuration/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/configuration/__init__.py @@ -14,11 +14,13 @@ from logging import getLogger from typing import Sequence, Tuple +from opentelemetry.instrumentation.configurator import BaseConfigurator from pkg_resources import iter_entry_points from opentelemetry import trace from opentelemetry.configuration import Configuration +from opentelemetry.instrumentation.configurator import BaseConfigurator from opentelemetry.sdk.metrics.export import MetricsExporter from opentelemetry.sdk.resources import Resource from opentelemetry.sdk.trace import TracerProvider @@ -38,15 +40,15 @@ _DEFAULT_IDS_GENERATOR = RANDOM_IDS_GENERATOR -def get_ids_generator() -> str: +def _get_ids_generator() -> str: return Configuration().IDS_GENERATOR or _DEFAULT_IDS_GENERATOR -def get_service_name() -> str: +def _get_service_name() -> str: return Configuration().SERVICE_NAME or "" -def get_exporter_names() -> Sequence[str]: +def _get_exporter_names() -> Sequence[str]: exporter = Configuration().EXPORTER or _DEFAULT_EXPORTER if exporter.lower().strip() == "none": return [] @@ -62,10 +64,10 @@ def get_exporter_names() -> Sequence[str]: return names -def init_tracing( +def _init_tracing( exporters: Sequence[SpanExporter], ids_generator: trace.IdsGenerator ): - service_name = get_service_name() + service_name = _get_service_name() provider = TracerProvider( resource=Resource.create({"service.name": service_name}), ids_generator=ids_generator(), @@ -85,12 +87,12 @@ def init_tracing( ) -def init_metrics(exporters: Sequence[MetricsExporter]): +def _init_metrics(exporters: Sequence[MetricsExporter]): if exporters: logger.warning("automatic metric initialization is not supported yet.") -def import_tracer_provider_config_components( +def _import_tracer_provider_config_components( selected_components, entry_point_name ) -> Sequence[Tuple[str, object]]: component_entry_points = { @@ -112,7 +114,7 @@ def import_tracer_provider_config_components( return component_impls -def import_exporters( +def _import_exporters( exporter_names: Sequence[str], ) -> Tuple[Sequence[SpanExporter], Sequence[MetricsExporter]]: trace_exporters, metric_exporters = {}, {} @@ -120,7 +122,7 @@ def import_exporters( for ( exporter_name, exporter_impl, - ) in import_tracer_provider_config_components( + ) in _import_tracer_provider_config_components( exporter_names, "opentelemetry_exporter" ): if issubclass(exporter_impl, SpanExporter): @@ -136,11 +138,11 @@ def import_exporters( return trace_exporters, metric_exporters -def import_ids_generator(ids_generator_name: str) -> trace.IdsGenerator: +def _import_ids_generator(ids_generator_name: str) -> trace.IdsGenerator: # pylint: disable=unbalanced-tuple-unpacking [ (ids_generator_name, ids_generator_impl) - ] = import_tracer_provider_config_components( + ] = _import_tracer_provider_config_components( [ids_generator_name.strip()], "opentelemetry_ids_generator" ) @@ -150,19 +152,19 @@ def import_ids_generator(ids_generator_name: str) -> trace.IdsGenerator: raise RuntimeError("{0} is not an IdsGenerator".format(ids_generator_name)) -def initialize_components(): - exporter_names = get_exporter_names() - trace_exporters, metric_exporters = import_exporters(exporter_names) - ids_generator_name = get_ids_generator() - ids_generator = import_ids_generator(ids_generator_name) - init_tracing(trace_exporters, ids_generator) +def _initialize_components(): + exporter_names = _get_exporter_names() + trace_exporters, metric_exporters = _import_exporters(exporter_names) + ids_generator_name = _get_ids_generator() + ids_generator = _import_ids_generator(ids_generator_name) + _init_tracing(trace_exporters, ids_generator) # We don't support automatic initialization for metric yet but have added # some boilerplate in order to make sure current implementation does not # lock us out of supporting metrics later without major surgery. - init_metrics(metric_exporters) + _init_metrics(metric_exporters) -class Configurator: - def configure(self): - initialize_components() +class Configurator(BaseConfigurator): + def _configure(self): + _initialize_components() From 4165e2cf6f71f87c6c7de6d6123497233f00afe7 Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Thu, 10 Dec 2020 12:21:22 -0800 Subject: [PATCH 06/11] update dependencies --- CHANGELOG.md | 4 ++++ opentelemetry-instrumentation/setup.cfg | 1 - opentelemetry-sdk/setup.cfg | 3 ++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0702323c5d..fe67219f8f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#1449](https://github.com/open-telemetry/opentelemetry-python/pull/1449)) - Added support for Jaeger propagator ([#1219](https://github.com/open-telemetry/opentelemetry-python/pull/1219)) +- Remove dependency on SDK from `opentelemetry-instrumentation` package. The + `opentelemetry-sdk` package now registers an entrypoint `opentelemetry_configurator` + to allow `opentelemetry-instrument` to load the configuration for the SDK + ([#1420](https://github.com/open-telemetry/opentelemetry-python/pull/1420)) ## [0.16b1](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v0.16b1) - 2020-11-26 ### Added diff --git a/opentelemetry-instrumentation/setup.cfg b/opentelemetry-instrumentation/setup.cfg index 558e6a54e2..d031f2fee8 100644 --- a/opentelemetry-instrumentation/setup.cfg +++ b/opentelemetry-instrumentation/setup.cfg @@ -42,7 +42,6 @@ zip_safe = False include_package_data = True install_requires = opentelemetry-api == 0.17.dev0 - opentelemetry-sdk == 0.17.dev0 wrapt >= 1.0.0, < 2.0.0 [options.packages.find] diff --git a/opentelemetry-sdk/setup.cfg b/opentelemetry-sdk/setup.cfg index 210cf0ea18..97bb83df94 100644 --- a/opentelemetry-sdk/setup.cfg +++ b/opentelemetry-sdk/setup.cfg @@ -42,6 +42,7 @@ zip_safe = False include_package_data = True install_requires = opentelemetry-api == 0.17.dev0 + opentelemetry-instrumentation == 0.17.dev0 [options.packages.find] where = src @@ -56,7 +57,7 @@ opentelemetry_propagator = opentelemetry_exporter = console_span = opentelemetry.sdk.trace.export:ConsoleSpanExporter console_metrics = opentelemetry.sdk.metrics.export:ConsoleMetricsExporter -opentelemetry_configure = +opentelemetry_configurator = sdk_configurator = opentelemetry.sdk.configuration:Configurator [options.extras_require] From 03e0ca265fa0d243970f6f2cbc37b10734eb9c65 Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Thu, 10 Dec 2020 13:50:47 -0800 Subject: [PATCH 07/11] fix tests --- .../tests/configuration/test_configurator.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/opentelemetry-sdk/tests/configuration/test_configurator.py b/opentelemetry-sdk/tests/configuration/test_configurator.py index 2f7dcc9a10..c8851321f1 100644 --- a/opentelemetry-sdk/tests/configuration/test_configurator.py +++ b/opentelemetry-sdk/tests/configuration/test_configurator.py @@ -19,9 +19,9 @@ from opentelemetry.configuration import Configuration from opentelemetry.sdk.configuration import ( - get_ids_generator, - import_ids_generator, - init_tracing, + _get_ids_generator, + _import_ids_generator, + _init_tracing, ) from opentelemetry.sdk.resources import Resource from opentelemetry.trace.ids_generator import RandomIdsGenerator @@ -99,7 +99,7 @@ def tearDown(self): def test_trace_init_default(self): environ["OTEL_SERVICE_NAME"] = "my-test-service" Configuration._reset() - init_tracing({"zipkin": Exporter}, RandomIdsGenerator) + _init_tracing({"zipkin": Exporter}, RandomIdsGenerator) self.assertEqual(self.set_provider_mock.call_count, 1) provider = self.set_provider_mock.call_args[0][0] @@ -114,7 +114,7 @@ def test_trace_init_default(self): def test_trace_init_otlp(self): environ["OTEL_SERVICE_NAME"] = "my-otlp-test-service" Configuration._reset() - init_tracing({"otlp": OTLPExporter}, RandomIdsGenerator) + _init_tracing({"otlp": OTLPExporter}, RandomIdsGenerator) self.assertEqual(self.set_provider_mock.call_count, 1) provider = self.set_provider_mock.call_args[0][0] @@ -141,8 +141,8 @@ def test_trace_init_custom_ids_generator(self, mock_iter_entry_points): ] ) Configuration._reset() - ids_generator_name = get_ids_generator() - ids_generator = import_ids_generator(ids_generator_name) - init_tracing({}, ids_generator) + ids_generator_name = _get_ids_generator() + ids_generator = _import_ids_generator(ids_generator_name) + _init_tracing({}, ids_generator) provider = self.set_provider_mock.call_args[0][0] self.assertIsInstance(provider.ids_generator, CustomIdsGenerator) From 9573a912284234d14188396fb949837c5bee6b5c Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Thu, 10 Dec 2020 13:51:01 -0800 Subject: [PATCH 08/11] fix tox --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 447613d039..69da199d93 100644 --- a/tox.ini +++ b/tox.ini @@ -83,7 +83,7 @@ commands_pre = py3{5,6,7,8}: python -m pip install -U pip setuptools wheel ; Install common packages for all the tests. These are not needed in all the ; cases but it saves a lot of boilerplate in this file. - test: pip install {toxinidir}/opentelemetry-api {toxinidir}/opentelemetry-sdk {toxinidir}/tests/util + test: pip install {toxinidir}/opentelemetry-api {toxinidir}/opentelemetry-instrumentation {toxinidir}/opentelemetry-sdk {toxinidir}/tests/util test-core-proto: pip install {toxinidir}/opentelemetry-proto instrumentation: pip install {toxinidir}/opentelemetry-instrumentation From 2dd75a2cac6caa99bec91cc41b3c7e8b1d8d7c2e Mon Sep 17 00:00:00 2001 From: Owais Lone Date: Fri, 11 Dec 2020 21:51:47 +0530 Subject: [PATCH 09/11] Upgrade isort and enable black compat mode (#1467) --- .isort.cfg | 3 ++- .pylintrc | 6 +++++- dev-requirements.txt | 5 +++-- docs/examples/django/pages/views.py | 1 + docs/examples/opentracing/main.py | 3 ++- .../src/opentelemetry/exporter/otlp/exporter.py | 4 ++-- opentelemetry-api/src/opentelemetry/util/__init__.py | 2 +- opentelemetry-api/tests/context/test_contextvars_context.py | 1 + opentelemetry-sdk/src/opentelemetry/sdk/util/__init__.py | 6 ++---- opentelemetry-sdk/tests/context/test_asyncio.py | 1 + scripts/eachdist.py | 2 +- 11 files changed, 21 insertions(+), 13 deletions(-) diff --git a/.isort.cfg b/.isort.cfg index cbe7a33601..85533188fa 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*/*,**/proto/*,opentelemetry-python-contrib/* +skip_glob=**/gen/*,.venv*/*,venv*/*,**/proto/*,opentelemetry-python-contrib/*,.tox/* known_first_party=opentelemetry,opentelemetry_example_app known_third_party=psutil,pytest,redis,redis_opentracing diff --git a/.pylintrc b/.pylintrc index 58fe77eef1..5daedb0139 100644 --- a/.pylintrc +++ b/.pylintrc @@ -70,7 +70,11 @@ 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 # 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 diff --git a/dev-requirements.txt b/dev-requirements.txt index c60b8640f6..bd2515b117 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -1,7 +1,8 @@ -pylint==2.4.4 +pylint==2.6.0 flake8~=3.7 -isort~=4.3 +isort~=5.6 black>=19.3b0,==19.* +httpretty~=1.0 mypy==0.790 sphinx~=2.1 sphinx-rtd-theme~=0.4 diff --git a/docs/examples/django/pages/views.py b/docs/examples/django/pages/views.py index 9d277e2b7f..4083888e17 100644 --- a/docs/examples/django/pages/views.py +++ b/docs/examples/django/pages/views.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. from django.http import HttpResponse + from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import ( diff --git a/docs/examples/opentracing/main.py b/docs/examples/opentracing/main.py index 0653ca82ec..bff9a7c3da 100755 --- a/docs/examples/opentracing/main.py +++ b/docs/examples/opentracing/main.py @@ -1,11 +1,12 @@ #!/usr/bin/env python +from rediscache import RedisCache + from opentelemetry import trace from opentelemetry.exporter.jaeger import JaegerSpanExporter from opentelemetry.instrumentation import opentracing_shim from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import SimpleExportSpanProcessor -from rediscache import RedisCache # Configure the tracer using the default implementation trace.set_tracer_provider(TracerProvider()) diff --git a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py index 93a87b8cf7..915e5f4d3e 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/exporter.py @@ -123,8 +123,8 @@ def _get_resource_data( def _load_credential_from_file(filepath) -> ChannelCredentials: try: - with open(filepath, "rb") as f: - credential = f.read() + with open(filepath, "rb") as creds_file: + credential = creds_file.read() return ssl_channel_credentials(credential) except FileNotFoundError: logger.exception("Failed to read credential file") diff --git a/opentelemetry-api/src/opentelemetry/util/__init__.py b/opentelemetry-api/src/opentelemetry/util/__init__.py index 58c297269e..c1c5a77f09 100644 --- a/opentelemetry-api/src/opentelemetry/util/__init__.py +++ b/opentelemetry-api/src/opentelemetry/util/__init__.py @@ -21,8 +21,8 @@ from opentelemetry.configuration import Configuration if TYPE_CHECKING: - from opentelemetry.trace import TracerProvider from opentelemetry.metrics import MeterProvider + from opentelemetry.trace import TracerProvider Provider = Union["TracerProvider", "MeterProvider"] diff --git a/opentelemetry-api/tests/context/test_contextvars_context.py b/opentelemetry-api/tests/context/test_contextvars_context.py index 7a384f1678..0c2ec1e6c2 100644 --- a/opentelemetry-api/tests/context/test_contextvars_context.py +++ b/opentelemetry-api/tests/context/test_contextvars_context.py @@ -21,6 +21,7 @@ try: import contextvars # pylint: disable=unused-import + from opentelemetry.context.contextvars_context import ( ContextVarsRuntimeContext, ) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/util/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/util/__init__.py index 09d7283cab..b2d3930bb1 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/util/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/util/__init__.py @@ -17,12 +17,10 @@ try: # pylint: disable=ungrouped-imports - from collections.abc import MutableMapping - from collections.abc import Sequence + from collections.abc import MutableMapping, Sequence except ImportError: # pylint: disable=no-name-in-module,ungrouped-imports - from collections import MutableMapping - from collections import Sequence + from collections import MutableMapping, Sequence def ns_to_iso_str(nanoseconds): diff --git a/opentelemetry-sdk/tests/context/test_asyncio.py b/opentelemetry-sdk/tests/context/test_asyncio.py index 452915d86c..c235e71d83 100644 --- a/opentelemetry-sdk/tests/context/test_asyncio.py +++ b/opentelemetry-sdk/tests/context/test_asyncio.py @@ -25,6 +25,7 @@ try: import contextvars # pylint: disable=unused-import + from opentelemetry.context.contextvars_context import ( ContextVarsRuntimeContext, ) 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, From d76c75c4bb36294e580d1f75abd112f5e63d9092 Mon Sep 17 00:00:00 2001 From: "(Eliseo) Nathaniel Ruiz Nowell" Date: Fri, 11 Dec 2020 19:05:30 +0000 Subject: [PATCH 10/11] Clone the contrib for every docs build requirement (#1464) --- docs-requirements.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs-requirements.txt b/docs-requirements.txt index 9a17569205..64fd71c5a9 100644 --- a/docs-requirements.txt +++ b/docs-requirements.txt @@ -6,13 +6,13 @@ sphinx-autodoc-typehints~=1.10.2 # doesn't work for pkg_resources. ./opentelemetry-api ./opentelemetry-sdk -./opentelemetry-python-contrib/exporter/opentelemetry-exporter-datadog -./opentelemetry-python-contrib/instrumentation/opentelemetry-instrumentation-grpc +-e "git+https://github.com/open-telemetry/opentelemetry-python-contrib.git#egg=opentelemetry-exporter-datadog&subdirectory=exporter/opentelemetry-exporter-datadog" +-e "git+https://github.com/open-telemetry/opentelemetry-python-contrib.git#egg=opentelemetry-instrumentation-grpc&subdirectory=instrumentation/opentelemetry-instrumentation-grpc" ./opentelemetry-instrumentation -./opentelemetry-python-contrib/instrumentation/opentelemetry-instrumentation-requests -./opentelemetry-python-contrib/instrumentation/opentelemetry-instrumentation-wsgi -./opentelemetry-python-contrib/instrumentation/opentelemetry-instrumentation-django -./opentelemetry-python-contrib/instrumentation/opentelemetry-instrumentation-flask +-e "git+https://github.com/open-telemetry/opentelemetry-python-contrib.git#egg=opentelemetry-instrumentation-requests&subdirectory=instrumentation/opentelemetry-instrumentation-requests" +-e "git+https://github.com/open-telemetry/opentelemetry-python-contrib.git#egg=opentelemetry-instrumentation-wsgi&subdirectory=instrumentation/opentelemetry-instrumentation-wsgi" +-e "git+https://github.com/open-telemetry/opentelemetry-python-contrib.git#egg=opentelemetry-instrumentation-django&subdirectory=instrumentation/opentelemetry-instrumentation-django" +-e "git+https://github.com/open-telemetry/opentelemetry-python-contrib.git#egg=opentelemetry-instrumentation-flask&subdirectory=instrumentation/opentelemetry-instrumentation-flask" # Required by ext packages asgiref~=3.0 From 08528601d16ff11262a8e8e460d9cdc0806025dc Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Fri, 11 Dec 2020 16:50:26 -0800 Subject: [PATCH 11/11] fix lint --- .../instrumentation/auto_instrumentation/sitecustomize.py | 1 - .../src/opentelemetry/instrumentation/configurator.py | 4 ++-- .../src/opentelemetry/sdk/configuration/__init__.py | 3 +-- tox.ini | 5 +++-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/auto_instrumentation/sitecustomize.py b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/auto_instrumentation/sitecustomize.py index ce375ba5cd..2a51d0b803 100644 --- a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/auto_instrumentation/sitecustomize.py +++ b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/auto_instrumentation/sitecustomize.py @@ -18,7 +18,6 @@ from pkg_resources import iter_entry_points - logger = getLogger(__file__) diff --git a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/configurator.py b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/configurator.py index dd0cd0b939..3efa71e89e 100644 --- a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/configurator.py +++ b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/configurator.py @@ -26,7 +26,7 @@ class BaseConfigurator(ABC): """An ABC for configurators - Configurators are used to configure + Configurators are used to configure SDKs (i.e. TracerProvider, MeterProvider, Processors...) to reduce the amount of manual configuration required. """ @@ -47,7 +47,7 @@ def _configure(self, **kwargs): def configure(self, **kwargs): """Configure the SDK""" - pass + self._configure(**kwargs) __all__ = ["BaseConfigurator"] diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/configuration/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/configuration/__init__.py index 210a4f9842..477aa5cf62 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/configuration/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/configuration/__init__.py @@ -14,7 +14,6 @@ from logging import getLogger from typing import Sequence, Tuple -from opentelemetry.instrumentation.configurator import BaseConfigurator from pkg_resources import iter_entry_points @@ -166,5 +165,5 @@ def _initialize_components(): class Configurator(BaseConfigurator): - def _configure(self): + def _configure(self, **kwargs): _initialize_components() diff --git a/tox.ini b/tox.ini index c0d9ea7eeb..1819bfe2f8 100644 --- a/tox.ini +++ b/tox.ini @@ -140,8 +140,8 @@ deps = commands_pre = python -m pip install -e {toxinidir}/opentelemetry-api[test] - python -m pip install -e {toxinidir}/opentelemetry-sdk[test] python -m pip install -e {toxinidir}/opentelemetry-instrumentation[test] + python -m pip install -e {toxinidir}/opentelemetry-sdk[test] python -m pip install -e {toxinidir}/opentelemetry-proto[test] python -m pip install -e {toxinidir}/tests/util[test] python -m pip install -e {toxinidir}/instrumentation/opentelemetry-instrumentation-opentracing-shim[test] @@ -175,8 +175,8 @@ deps = commands_pre = pip install -e {toxinidir}/opentelemetry-api \ - -e {toxinidir}/opentelemetry-sdk \ -e {toxinidir}/opentelemetry-instrumentation \ + -e {toxinidir}/opentelemetry-sdk \ -e {toxinidir}/opentelemetry-python-contrib/instrumentation/opentelemetry-instrumentation-requests \ -e {toxinidir}/opentelemetry-python-contrib/instrumentation/opentelemetry-instrumentation-wsgi @@ -193,6 +193,7 @@ changedir = commands_pre = pip install -e {toxinidir}/opentelemetry-api \ + -e {toxinidir}/opentelemetry-instrumentation \ -e {toxinidir}/opentelemetry-sdk \ -e {toxinidir}/tests/util \ -e {toxinidir}/exporter/opentelemetry-exporter-opencensus