From b4513326307cc73c003ae5b82c58ea01e32fece7 Mon Sep 17 00:00:00 2001 From: Aaron Abbott Date: Tue, 2 Jun 2020 01:13:22 +0000 Subject: [PATCH 01/11] Typing fixes around loader Had to also make some small changes to the actual implementation of `Configuration()` --- dev-requirements.txt | 2 +- .../src/opentelemetry/__init__.py | 0 .../opentelemetry/configuration/__init__.py | 69 +++++++++---------- .../src/opentelemetry/metrics/__init__.py | 4 +- .../src/opentelemetry/trace/__init__.py | 4 +- .../src/opentelemetry/util/__init__.py | 36 +++++++--- .../tests/configuration/test_configuration.py | 6 +- 7 files changed, 66 insertions(+), 55 deletions(-) create mode 100644 opentelemetry-api/src/opentelemetry/__init__.py diff --git a/dev-requirements.txt b/dev-requirements.txt index b8ae14c89c3..0f855699167 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -2,7 +2,7 @@ pylint==2.4.4 flake8==3.7.9 isort~=4.3 black>=19.3b0,==19.* -mypy==0.740 +mypy==0.770 sphinx~=2.1 sphinx-rtd-theme~=0.4 sphinx-autodoc-typehints~=1.10.2 diff --git a/opentelemetry-api/src/opentelemetry/__init__.py b/opentelemetry-api/src/opentelemetry/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/opentelemetry-api/src/opentelemetry/configuration/__init__.py b/opentelemetry-api/src/opentelemetry/configuration/__init__.py index 48093415020..e656f4caa25 100644 --- a/opentelemetry-api/src/opentelemetry/configuration/__init__.py +++ b/opentelemetry-api/src/opentelemetry/configuration/__init__.py @@ -12,9 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -# FIXME find a better way to avoid all those "Expression has type "Any"" errors -# type: ignore - """ Simple configuration manager @@ -95,17 +92,23 @@ from os import environ from re import fullmatch +from typing import Union, Type, Optional, Dict, TypeVar +ConfigValue = Union[str, bool, int, float] -class Configuration: - _instance = None - __slots__ = [] +class Configuration: + _instance: Optional["Configuration"] = None + _config_map: Dict[str, ConfigValue] def __new__(cls) -> "Configuration": - if Configuration._instance is None: + if cls._instance is not None: + instance = cls._instance + else: - for key, value in environ.items(): + instance = super().__new__(cls) + instance._config_map = {} + for key, value_str in environ.items(): match = fullmatch( r"OPENTELEMETRY_PYTHON_([A-Za-z_][\w_]*)", key @@ -114,45 +117,43 @@ def __new__(cls) -> "Configuration": if match is not None: key = match.group(1) + value: ConfigValue = value_str - if value == "True": + if value_str == "True": value = True - elif value == "False": + elif value_str == "False": value = False else: try: - value = int(value) + value = int(value_str) except ValueError: pass try: - value = float(value) + value = float(value_str) except ValueError: pass - setattr(Configuration, "_{}".format(key), value) - setattr( - Configuration, - key, - property( - fget=lambda cls, key=key: getattr( - cls, "_{}".format(key) - ) - ), - ) + instance._config_map[key] = value - Configuration.__slots__.append(key) + cls._instance = instance - Configuration.__slots__ = tuple(Configuration.__slots__) + return instance - Configuration._instance = object.__new__(cls) + def __getattr__(self, name: str) -> Optional[ConfigValue]: + return self._config_map.get(name) - return cls._instance + def __setattr__(self, key: str, val: ConfigValue) -> None: + if key == "_config_map": + super().__setattr__(key, val) + else: + raise AttributeError(key) - def __getattr__(self, name): - return None + def get(self, name: str, default: ConfigValue) -> ConfigValue: + val = self._config_map.get(name, default) + return val @classmethod - def _reset(cls): + def _reset(cls) -> None: """ This method "resets" the global configuration attributes @@ -160,10 +161,6 @@ def _reset(cls): only. """ - for slot in cls.__slots__: - if slot in cls.__dict__.keys(): - delattr(cls, slot) - delattr(cls, "_{}".format(slot)) - - cls.__slots__ = [] - cls._instance = None + if cls._instance: + cls._instance._config_map.clear() # pylint: disable=protected-access + cls._instance = None diff --git a/opentelemetry-api/src/opentelemetry/metrics/__init__.py b/opentelemetry-api/src/opentelemetry/metrics/__init__.py index b7ad62adb2e..e3fa7987930 100644 --- a/opentelemetry-api/src/opentelemetry/metrics/__init__.py +++ b/opentelemetry-api/src/opentelemetry/metrics/__init__.py @@ -34,7 +34,7 @@ from logging import getLogger from typing import Callable, Dict, Sequence, Tuple, Type, TypeVar -from opentelemetry.util import _load_provider +from opentelemetry.util import _load_meter_provider logger = getLogger(__name__) ValueT = TypeVar("ValueT", int, float) @@ -410,6 +410,6 @@ def get_meter_provider() -> MeterProvider: global _METER_PROVIDER # pylint: disable=global-statement if _METER_PROVIDER is None: - _METER_PROVIDER = _load_provider("meter_provider") + _METER_PROVIDER = _load_meter_provider("meter_provider") return _METER_PROVIDER diff --git a/opentelemetry-api/src/opentelemetry/trace/__init__.py b/opentelemetry-api/src/opentelemetry/trace/__init__.py index 13aaf2c6a4f..25af91a4007 100644 --- a/opentelemetry-api/src/opentelemetry/trace/__init__.py +++ b/opentelemetry-api/src/opentelemetry/trace/__init__.py @@ -78,7 +78,7 @@ from logging import getLogger from opentelemetry.trace.status import Status -from opentelemetry.util import _load_provider, types +from opentelemetry.util import _load_trace_provider, types logger = getLogger(__name__) @@ -706,6 +706,6 @@ def get_tracer_provider() -> TracerProvider: global _TRACER_PROVIDER # pylint: disable=global-statement if _TRACER_PROVIDER is None: - _TRACER_PROVIDER = _load_provider("tracer_provider") + _TRACER_PROVIDER = _load_trace_provider("tracer_provider") return _TRACER_PROVIDER diff --git a/opentelemetry-api/src/opentelemetry/util/__init__.py b/opentelemetry-api/src/opentelemetry/util/__init__.py index bab42b0bde2..dfe94e85f98 100644 --- a/opentelemetry-api/src/opentelemetry/util/__init__.py +++ b/opentelemetry-api/src/opentelemetry/util/__init__.py @@ -14,11 +14,17 @@ import re import time from logging import getLogger -from typing import Sequence, Union +from typing import Sequence, Union, cast, TYPE_CHECKING from pkg_resources import iter_entry_points -from opentelemetry.configuration import Configuration # type: ignore +from opentelemetry.configuration import Configuration + +if TYPE_CHECKING: + from opentelemetry.trace import TracerProvider + from opentelemetry.metrics import MeterProvider + +Provider = Union["TracerProvider", "MeterProvider"] logger = getLogger(__name__) @@ -34,25 +40,33 @@ def time_ns() -> int: return int(time.time() * 1e9) -def _load_provider( - provider: str, -) -> Union["TracerProvider", "MeterProvider"]: # type: ignore +def _load_provider(provider: str) -> Provider: try: - return next( # type: ignore + entry_point = next( iter_entry_points( "opentelemetry_{}".format(provider), - name=getattr( - Configuration(), # type: ignore - provider, - "default_{}".format(provider), + name=cast( + str, + Configuration().get( + provider, "default_{}".format(provider), + ), ), ) - ).load()() + ) + return cast(Provider, entry_point.load()(),) except Exception: # pylint: disable=broad-except logger.error("Failed to load configured provider %s", provider) raise +def _load_meter_provider(provider: str) -> "MeterProvider": + return cast("MeterProvider", _load_provider(provider)) + + +def _load_trace_provider(provider: str) -> "TracerProvider": + return cast("TracerProvider", _load_provider(provider)) + + # Pattern for matching up until the first '/' after the 'https://' part. _URL_PATTERN = r"(https?|ftp)://.*?/" diff --git a/opentelemetry-api/tests/configuration/test_configuration.py b/opentelemetry-api/tests/configuration/test_configuration.py index a817a1bf43d..f9054c288a4 100644 --- a/opentelemetry-api/tests/configuration/test_configuration.py +++ b/opentelemetry-api/tests/configuration/test_configuration.py @@ -16,16 +16,16 @@ from unittest import TestCase from unittest.mock import patch -from opentelemetry.configuration import Configuration # type: ignore +from opentelemetry.configuration import Configuration class TestConfiguration(TestCase): - def tearDown(self): + def tearDown(self) -> None: # This call resets the attributes of the Configuration class so that # each test is executed in the same conditions. Configuration._reset() - def test_singleton(self): + def test_singleton(self) -> None: self.assertIsInstance(Configuration(), Configuration) self.assertIs(Configuration(), Configuration()) From b2c859c847b80e2ee77d89c1e9ef30388b3cbb2d Mon Sep 17 00:00:00 2001 From: Aaron Abbott Date: Tue, 2 Jun 2020 16:33:13 +0000 Subject: [PATCH 02/11] lint --- opentelemetry-api/src/opentelemetry/configuration/__init__.py | 2 +- opentelemetry-api/src/opentelemetry/util/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/opentelemetry-api/src/opentelemetry/configuration/__init__.py b/opentelemetry-api/src/opentelemetry/configuration/__init__.py index e656f4caa25..2790cb61458 100644 --- a/opentelemetry-api/src/opentelemetry/configuration/__init__.py +++ b/opentelemetry-api/src/opentelemetry/configuration/__init__.py @@ -92,7 +92,7 @@ from os import environ from re import fullmatch -from typing import Union, Type, Optional, Dict, TypeVar +from typing import Dict, Optional, Type, TypeVar, Union ConfigValue = Union[str, bool, int, float] diff --git a/opentelemetry-api/src/opentelemetry/util/__init__.py b/opentelemetry-api/src/opentelemetry/util/__init__.py index dfe94e85f98..ed1268fcb62 100644 --- a/opentelemetry-api/src/opentelemetry/util/__init__.py +++ b/opentelemetry-api/src/opentelemetry/util/__init__.py @@ -14,7 +14,7 @@ import re import time from logging import getLogger -from typing import Sequence, Union, cast, TYPE_CHECKING +from typing import TYPE_CHECKING, Sequence, Union, cast from pkg_resources import iter_entry_points From 359dfe3ed4c5aecef4fa5ddbd67516a530aaf356 Mon Sep 17 00:00:00 2001 From: Aaron Abbott Date: Tue, 2 Jun 2020 17:04:58 +0000 Subject: [PATCH 03/11] __init__.pyi file for namespace import --- opentelemetry-api/src/opentelemetry/{__init__.py => __init__.pyi} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename opentelemetry-api/src/opentelemetry/{__init__.py => __init__.pyi} (100%) diff --git a/opentelemetry-api/src/opentelemetry/__init__.py b/opentelemetry-api/src/opentelemetry/__init__.pyi similarity index 100% rename from opentelemetry-api/src/opentelemetry/__init__.py rename to opentelemetry-api/src/opentelemetry/__init__.pyi From da22b91ed4a421477c432ad613f95db21f10964c Mon Sep 17 00:00:00 2001 From: Aaron Abbott Date: Tue, 2 Jun 2020 19:08:09 +0000 Subject: [PATCH 04/11] update test, use generic --- .../opentelemetry/configuration/__init__.py | 3 ++- .../tests/configuration/test_configuration.py | 21 ++++++++++++------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/opentelemetry-api/src/opentelemetry/configuration/__init__.py b/opentelemetry-api/src/opentelemetry/configuration/__init__.py index 2790cb61458..bd54b312bde 100644 --- a/opentelemetry-api/src/opentelemetry/configuration/__init__.py +++ b/opentelemetry-api/src/opentelemetry/configuration/__init__.py @@ -95,6 +95,7 @@ from typing import Dict, Optional, Type, TypeVar, Union ConfigValue = Union[str, bool, int, float] +_T = TypeVar("_T", ConfigValue, Optional[ConfigValue]) class Configuration: @@ -148,7 +149,7 @@ def __setattr__(self, key: str, val: ConfigValue) -> None: else: raise AttributeError(key) - def get(self, name: str, default: ConfigValue) -> ConfigValue: + def get(self, name: str, default: _T) -> _T: val = self._config_map.get(name, default) return val diff --git a/opentelemetry-api/tests/configuration/test_configuration.py b/opentelemetry-api/tests/configuration/test_configuration.py index f9054c288a4..32b62e619d5 100644 --- a/opentelemetry-api/tests/configuration/test_configuration.py +++ b/opentelemetry-api/tests/configuration/test_configuration.py @@ -39,7 +39,7 @@ def test_singleton(self) -> None: "OPENTELEMETRY_PTHON_TRACEX_PROVIDER": "tracex_provider", }, ) - def test_environment_variables(self): # type: ignore + def test_environment_variables(self): self.assertEqual( Configuration().METER_PROVIDER, "meter_provider" ) # pylint: disable=no-member @@ -62,16 +62,21 @@ def test_property(self): with self.assertRaises(AttributeError): Configuration().TRACER_PROVIDER = "new_tracer_provider" - def test_slots(self): + def test_slots(self) -> None: with self.assertRaises(AttributeError): Configuration().XYZ = "xyz" # pylint: disable=assigning-non-slot - def test_getattr(self): + def test_getattr(self) -> None: + # literal access self.assertIsNone(Configuration().XYZ) - def test_reset(self): + # dynamic access + self.assertIsNone(getattr(Configuration(), "XYZ")) + self.assertIsNone(Configuration().get("XYZ", None)) + + def test_reset(self) -> None: environ_patcher = patch.dict( - "os.environ", # type: ignore + "os.environ", {"OPENTELEMETRY_PYTHON_TRACER_PROVIDER": "tracer_provider"}, ) @@ -96,7 +101,7 @@ def test_reset(self): "OPENTELEMETRY_PYTHON_FALSE": "False", }, ) - def test_boolean(self): + def test_boolean(self) -> None: self.assertIsInstance( Configuration().TRUE, bool ) # pylint: disable=no-member @@ -114,7 +119,7 @@ def test_boolean(self): "OPENTELEMETRY_PYTHON_NON_INTEGER": "-12z3", }, ) - def test_integer(self): + def test_integer(self) -> None: self.assertEqual( Configuration().POSITIVE_INTEGER, 123 ) # pylint: disable=no-member @@ -133,7 +138,7 @@ def test_integer(self): "OPENTELEMETRY_PYTHON_NON_FLOAT": "-12z3.123", }, ) - def test_float(self): + def test_float(self) -> None: self.assertEqual( Configuration().POSITIVE_FLOAT, 123.123 ) # pylint: disable=no-member From 22549702d0d5406edcdb9fbaa94e55208233314a Mon Sep 17 00:00:00 2001 From: Aaron Abbott Date: Tue, 2 Jun 2020 19:15:13 +0000 Subject: [PATCH 05/11] add docstring --- opentelemetry-api/src/opentelemetry/configuration/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/opentelemetry-api/src/opentelemetry/configuration/__init__.py b/opentelemetry-api/src/opentelemetry/configuration/__init__.py index bd54b312bde..5c2cefd260f 100644 --- a/opentelemetry-api/src/opentelemetry/configuration/__init__.py +++ b/opentelemetry-api/src/opentelemetry/configuration/__init__.py @@ -150,6 +150,7 @@ def __setattr__(self, key: str, val: ConfigValue) -> None: raise AttributeError(key) def get(self, name: str, default: _T) -> _T: + """Use this typed method for dynamic access instead of `getattr()`""" val = self._config_map.get(name, default) return val From 90daacddb67df73dbec5738a293dc46c8128f50a Mon Sep 17 00:00:00 2001 From: Aaron Abbott Date: Tue, 2 Jun 2020 19:35:36 +0000 Subject: [PATCH 06/11] update docstring --- opentelemetry-api/src/opentelemetry/configuration/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentelemetry-api/src/opentelemetry/configuration/__init__.py b/opentelemetry-api/src/opentelemetry/configuration/__init__.py index 5c2cefd260f..3a161f8a6d8 100644 --- a/opentelemetry-api/src/opentelemetry/configuration/__init__.py +++ b/opentelemetry-api/src/opentelemetry/configuration/__init__.py @@ -150,7 +150,7 @@ def __setattr__(self, key: str, val: ConfigValue) -> None: raise AttributeError(key) def get(self, name: str, default: _T) -> _T: - """Use this typed method for dynamic access instead of `getattr()`""" + """Use this typed method for dynamic access instead of `getattr`""" val = self._config_map.get(name, default) return val From ea2375666870c596549e07e66eef13d61498191b Mon Sep 17 00:00:00 2001 From: Aaron Abbott Date: Tue, 2 Jun 2020 20:08:25 +0000 Subject: [PATCH 07/11] CI fixes fix docstring for good, use comment style annotations where needed to support python<=3.4 --- .../src/opentelemetry/configuration/__init__.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/opentelemetry-api/src/opentelemetry/configuration/__init__.py b/opentelemetry-api/src/opentelemetry/configuration/__init__.py index 3a161f8a6d8..9dc092ee005 100644 --- a/opentelemetry-api/src/opentelemetry/configuration/__init__.py +++ b/opentelemetry-api/src/opentelemetry/configuration/__init__.py @@ -99,8 +99,8 @@ class Configuration: - _instance: Optional["Configuration"] = None - _config_map: Dict[str, ConfigValue] + _instance = None # type: Optional["Configuration"] + _config_map = {} # type: Dict[str, ConfigValue] def __new__(cls) -> "Configuration": if cls._instance is not None: @@ -108,7 +108,6 @@ def __new__(cls) -> "Configuration": else: instance = super().__new__(cls) - instance._config_map = {} for key, value_str in environ.items(): match = fullmatch( @@ -150,7 +149,10 @@ def __setattr__(self, key: str, val: ConfigValue) -> None: raise AttributeError(key) def get(self, name: str, default: _T) -> _T: - """Use this typed method for dynamic access instead of `getattr`""" + """Use this typed method for dynamic access instead of `getattr` + + :rtype: str or bool or int or float or None + """ val = self._config_map.get(name, default) return val From af9570462d25e4db694896ecd4158b12e223fafa Mon Sep 17 00:00:00 2001 From: Aaron Abbott Date: Tue, 2 Jun 2020 20:41:24 +0000 Subject: [PATCH 08/11] another typing comment annotation --- opentelemetry-api/src/opentelemetry/configuration/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentelemetry-api/src/opentelemetry/configuration/__init__.py b/opentelemetry-api/src/opentelemetry/configuration/__init__.py index 9dc092ee005..25099a60e1e 100644 --- a/opentelemetry-api/src/opentelemetry/configuration/__init__.py +++ b/opentelemetry-api/src/opentelemetry/configuration/__init__.py @@ -117,7 +117,7 @@ def __new__(cls) -> "Configuration": if match is not None: key = match.group(1) - value: ConfigValue = value_str + value = value_str # type: ConfigValue if value_str == "True": value = True From 480f13333f443d3166fa681011391bf0d1396ace Mon Sep 17 00:00:00 2001 From: Aaron Abbott Date: Wed, 3 Jun 2020 18:08:53 +0000 Subject: [PATCH 09/11] use ClassVar for class variables --- .../src/opentelemetry/configuration/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/opentelemetry-api/src/opentelemetry/configuration/__init__.py b/opentelemetry-api/src/opentelemetry/configuration/__init__.py index 25099a60e1e..292fa1d9be9 100644 --- a/opentelemetry-api/src/opentelemetry/configuration/__init__.py +++ b/opentelemetry-api/src/opentelemetry/configuration/__init__.py @@ -92,15 +92,15 @@ from os import environ from re import fullmatch -from typing import Dict, Optional, Type, TypeVar, Union +from typing import Dict, Optional, Type, TypeVar, Union, ClassVar ConfigValue = Union[str, bool, int, float] _T = TypeVar("_T", ConfigValue, Optional[ConfigValue]) class Configuration: - _instance = None # type: Optional["Configuration"] - _config_map = {} # type: Dict[str, ConfigValue] + _instance = None # type: ClassVar[Optional[Configuration]] + _config_map = {} # type: ClassVar[Dict[str, ConfigValue]] def __new__(cls) -> "Configuration": if cls._instance is not None: From ad267b54ba3ee7e8543a38382c37d978211b9d5d Mon Sep 17 00:00:00 2001 From: Aaron Abbott Date: Wed, 3 Jun 2020 18:15:56 +0000 Subject: [PATCH 10/11] lint, also fixed lint from master --- .../src/opentelemetry/ext/boto/__init__.py | 2 +- ext/opentelemetry-ext-boto/tests/test_boto_instrumentation.py | 1 - opentelemetry-api/src/opentelemetry/configuration/__init__.py | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/ext/opentelemetry-ext-boto/src/opentelemetry/ext/boto/__init__.py b/ext/opentelemetry-ext-boto/src/opentelemetry/ext/boto/__init__.py index fa66fda61dd..0831dec4179 100644 --- a/ext/opentelemetry-ext-boto/src/opentelemetry/ext/boto/__init__.py +++ b/ext/opentelemetry-ext-boto/src/opentelemetry/ext/boto/__init__.py @@ -47,9 +47,9 @@ import logging from inspect import currentframe -from boto.connection import AWSAuthConnection, AWSQueryConnection from wrapt import ObjectProxy, wrap_function_wrapper +from boto.connection import AWSAuthConnection, AWSQueryConnection from opentelemetry.auto_instrumentation.instrumentor import BaseInstrumentor from opentelemetry.ext.boto.version import __version__ from opentelemetry.trace import SpanKind, get_tracer diff --git a/ext/opentelemetry-ext-boto/tests/test_boto_instrumentation.py b/ext/opentelemetry-ext-boto/tests/test_boto_instrumentation.py index 492fac5a883..9fa3605fe70 100644 --- a/ext/opentelemetry-ext-boto/tests/test_boto_instrumentation.py +++ b/ext/opentelemetry-ext-boto/tests/test_boto_instrumentation.py @@ -19,7 +19,6 @@ import boto.elasticache import boto.s3 import boto.sts - from moto import ( # pylint: disable=import-error mock_ec2_deprecated, mock_lambda_deprecated, diff --git a/opentelemetry-api/src/opentelemetry/configuration/__init__.py b/opentelemetry-api/src/opentelemetry/configuration/__init__.py index 292fa1d9be9..0bd2bce8d64 100644 --- a/opentelemetry-api/src/opentelemetry/configuration/__init__.py +++ b/opentelemetry-api/src/opentelemetry/configuration/__init__.py @@ -92,7 +92,7 @@ from os import environ from re import fullmatch -from typing import Dict, Optional, Type, TypeVar, Union, ClassVar +from typing import ClassVar, Dict, Optional, TypeVar, Union ConfigValue = Union[str, bool, int, float] _T = TypeVar("_T", ConfigValue, Optional[ConfigValue]) From 75096a2c3f373989fad17a7a5881724074174874 Mon Sep 17 00:00:00 2001 From: Aaron Abbott Date: Wed, 3 Jun 2020 19:52:37 +0000 Subject: [PATCH 11/11] undo lint changes to boto files for some reason `scripts/eachdist.py lint` is not in sync with `tox lint` and it messes up CI --- .../src/opentelemetry/ext/boto/__init__.py | 2 +- ext/opentelemetry-ext-boto/tests/test_boto_instrumentation.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ext/opentelemetry-ext-boto/src/opentelemetry/ext/boto/__init__.py b/ext/opentelemetry-ext-boto/src/opentelemetry/ext/boto/__init__.py index 0831dec4179..fa66fda61dd 100644 --- a/ext/opentelemetry-ext-boto/src/opentelemetry/ext/boto/__init__.py +++ b/ext/opentelemetry-ext-boto/src/opentelemetry/ext/boto/__init__.py @@ -47,9 +47,9 @@ import logging from inspect import currentframe +from boto.connection import AWSAuthConnection, AWSQueryConnection from wrapt import ObjectProxy, wrap_function_wrapper -from boto.connection import AWSAuthConnection, AWSQueryConnection from opentelemetry.auto_instrumentation.instrumentor import BaseInstrumentor from opentelemetry.ext.boto.version import __version__ from opentelemetry.trace import SpanKind, get_tracer diff --git a/ext/opentelemetry-ext-boto/tests/test_boto_instrumentation.py b/ext/opentelemetry-ext-boto/tests/test_boto_instrumentation.py index 9fa3605fe70..492fac5a883 100644 --- a/ext/opentelemetry-ext-boto/tests/test_boto_instrumentation.py +++ b/ext/opentelemetry-ext-boto/tests/test_boto_instrumentation.py @@ -19,6 +19,7 @@ import boto.elasticache import boto.s3 import boto.sts + from moto import ( # pylint: disable=import-error mock_ec2_deprecated, mock_lambda_deprecated,