diff --git a/.pylintrc b/.pylintrc index ab11620d772..4f37a7e10f0 100644 --- a/.pylintrc +++ b/.pylintrc @@ -166,7 +166,7 @@ notes=FIXME, # List of decorators that produce context managers, such as # contextlib.contextmanager. Add to this list to register other decorators that # produce valid context managers. -contextmanager-decorators=contextlib.contextmanager +contextmanager-decorators=contextlib.contextmanager, _agnosticcontextmanager # List of members which are set dynamically and missed by pylint inference # system, and so shouldn't trigger E1101 when accessed. Python regular diff --git a/CHANGELOG.md b/CHANGELOG.md index 0f9d6613214..ca3d0687bf1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,10 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +- Make `tracer.start_as_current_span()` decorator work with async functions + ([#3633](https://github.com/open-telemetry/opentelemetry-python/pull/3633)) - Fix python 3.12 deprecation warning ([#3751](https://github.com/open-telemetry/opentelemetry-python/pull/3751)) - bump mypy to 0.982 ([#3776](https://github.com/open-telemetry/opentelemetry-python/pull/3776)) +- Fix ValueError message for PeriodicExportingMetricsReader + ([#3769](https://github.com/open-telemetry/opentelemetry-python/pull/3769)) ## Version 1.23.0/0.44b0 (2024-02-23) diff --git a/docs/examples/logs/README.rst b/docs/examples/logs/README.rst index 0494578ee5f..608a904f1c2 100644 --- a/docs/examples/logs/README.rst +++ b/docs/examples/logs/README.rst @@ -21,6 +21,7 @@ Start the Collector locally to see data being exported. Write the following file exporters: logging: + verbosity: detailed service: pipelines: diff --git a/exporter/opentelemetry-exporter-opencensus/pyproject.toml b/exporter/opentelemetry-exporter-opencensus/pyproject.toml index 7966106566d..abe50f7b7f7 100644 --- a/exporter/opentelemetry-exporter-opencensus/pyproject.toml +++ b/exporter/opentelemetry-exporter-opencensus/pyproject.toml @@ -33,9 +33,6 @@ dependencies = [ "setuptools >= 16.0", ] -[project.optional-dependencies] -test = [] - [project.entry-points.opentelemetry_traces_exporter] opencensus = "opentelemetry.exporter.opencensus.trace_exporter:OpenCensusSpanExporter" diff --git a/exporter/opentelemetry-exporter-opencensus/test-requirements.txt b/exporter/opentelemetry-exporter-opencensus/test-requirements.txt new file mode 100644 index 00000000000..8a6345c7e22 --- /dev/null +++ b/exporter/opentelemetry-exporter-opencensus/test-requirements.txt @@ -0,0 +1,23 @@ +asgiref==3.7.2 +attrs==23.2.0 +Deprecated==1.2.14 +flaky==3.7.0 +grpcio==1.62.0 +importlib-metadata==6.11.0 +iniconfig==2.0.0 +opencensus-proto==0.1.0 +packaging==23.2 +pluggy==1.4.0 +protobuf==3.20.3 +py==1.11.0 +py-cpuinfo==9.0.0 +pytest==7.1.3 +pytest-benchmark==4.0.0 +tomli==2.0.1 +typing_extensions==4.10.0 +wrapt==1.16.0 +zipp==3.17.0 +-e opentelemetry-api +-e opentelemetry-sdk +-e opentelemetry-semantic-conventions +-e exporter/opentelemetry-exporter-opencensus diff --git a/exporter/opentelemetry-exporter-otlp-proto-common/pyproject.toml b/exporter/opentelemetry-exporter-otlp-proto-common/pyproject.toml index cf1749b910a..8043bfbcf9a 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-common/pyproject.toml +++ b/exporter/opentelemetry-exporter-otlp-proto-common/pyproject.toml @@ -27,9 +27,6 @@ dependencies = [ "opentelemetry-proto == 1.24.0.dev", ] -[project.optional-dependencies] -test = [] - [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python/tree/main/exporter/opentelemetry-exporter-otlp-proto-common" diff --git a/exporter/opentelemetry-exporter-otlp-proto-common/test-requirements.txt b/exporter/opentelemetry-exporter-otlp-proto-common/test-requirements.txt new file mode 100644 index 00000000000..60f3dcd2ea7 --- /dev/null +++ b/exporter/opentelemetry-exporter-otlp-proto-common/test-requirements.txt @@ -0,0 +1,19 @@ +asgiref==3.7.2 +attrs==23.2.0 +Deprecated==1.2.14 +flaky==3.7.0 +importlib-metadata==6.11.0 +iniconfig==2.0.0 +packaging==23.2 +pluggy==1.4.0 +protobuf==4.25.3 +py==1.11.0 +py-cpuinfo==9.0.0 +pytest==7.1.3 +pytest-benchmark==4.0.0 +tomli==2.0.1 +typing_extensions==4.10.0 +wrapt==1.16.0 +zipp==3.17.0 +-e opentelemetry-proto +-e exporter/opentelemetry-exporter-otlp-proto-common diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/pyproject.toml b/exporter/opentelemetry-exporter-otlp-proto-http/pyproject.toml index 95a613f6ef1..77a3bcb95b8 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/pyproject.toml +++ b/exporter/opentelemetry-exporter-otlp-proto-http/pyproject.toml @@ -33,11 +33,6 @@ dependencies = [ "requests ~= 2.7", ] -[project.optional-dependencies] -test = [ - "responses >= 0.22.0, < 0.25", -] - [project.entry-points.opentelemetry_traces_exporter] otlp_proto_http = "opentelemetry.exporter.otlp.proto.http.trace_exporter:OTLPSpanExporter" diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/test-requirements-0.txt b/exporter/opentelemetry-exporter-otlp-proto-http/test-requirements-0.txt new file mode 100644 index 00000000000..0faf2626687 --- /dev/null +++ b/exporter/opentelemetry-exporter-otlp-proto-http/test-requirements-0.txt @@ -0,0 +1,31 @@ +asgiref==3.7.2 +attrs==23.2.0 +certifi==2024.2.2 +charset-normalizer==3.3.2 +Deprecated==1.2.14 +flaky==3.7.0 +googleapis-common-protos==1.62.0 +idna==3.6 +importlib-metadata==6.11.0 +iniconfig==2.0.0 +packaging==23.2 +pluggy==1.4.0 +protobuf==3.19.6 +py==1.11.0 +py-cpuinfo==9.0.0 +pytest==7.1.3 +pytest-benchmark==4.0.0 +PyYAML==6.0.1 +requests==2.31.0 +responses==0.24.1 +tomli==2.0.1 +typing_extensions==4.10.0 +urllib3==2.2.1 +wrapt==1.16.0 +zipp==3.17.0 +-e opentelemetry-api +-e exporter/opentelemetry-exporter-otlp-proto-common +-e opentelemetry-proto +-e opentelemetry-sdk +-e opentelemetry-semantic-conventions +-e exporter/opentelemetry-exporter-otlp-proto-http diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/test-requirements-1.txt b/exporter/opentelemetry-exporter-otlp-proto-http/test-requirements-1.txt new file mode 100644 index 00000000000..d38b38f1c40 --- /dev/null +++ b/exporter/opentelemetry-exporter-otlp-proto-http/test-requirements-1.txt @@ -0,0 +1,31 @@ +asgiref==3.7.2 +attrs==23.2.0 +certifi==2024.2.2 +charset-normalizer==3.3.2 +Deprecated==1.2.14 +flaky==3.7.0 +googleapis-common-protos==1.62.0 +idna==3.6 +importlib-metadata==6.11.0 +iniconfig==2.0.0 +packaging==23.2 +pluggy==1.4.0 +protobuf==4.25.3 +py==1.11.0 +py-cpuinfo==9.0.0 +pytest==7.1.3 +pytest-benchmark==4.0.0 +PyYAML==6.0.1 +requests==2.31.0 +responses==0.24.1 +tomli==2.0.1 +typing_extensions==4.10.0 +urllib3==2.2.1 +wrapt==1.16.0 +zipp==3.17.0 +-e opentelemetry-api +-e exporter/opentelemetry-exporter-otlp-proto-common +-e opentelemetry-proto +-e opentelemetry-sdk +-e opentelemetry-semantic-conventions +-e exporter/opentelemetry-exporter-otlp-proto-http diff --git a/exporter/opentelemetry-exporter-otlp/pyproject.toml b/exporter/opentelemetry-exporter-otlp/pyproject.toml index 89233037b00..b61acce885d 100644 --- a/exporter/opentelemetry-exporter-otlp/pyproject.toml +++ b/exporter/opentelemetry-exporter-otlp/pyproject.toml @@ -29,9 +29,6 @@ dependencies = [ "opentelemetry-exporter-otlp-proto-http == 1.24.0.dev", ] -[project.optional-dependencies] -test = [] - [project.entry-points.opentelemetry_logs_exporter] otlp = "opentelemetry.exporter.otlp.proto.grpc._log_exporter:OTLPLogExporter" diff --git a/exporter/opentelemetry-exporter-otlp/test-requirements.txt b/exporter/opentelemetry-exporter-otlp/test-requirements.txt new file mode 100644 index 00000000000..99775220476 --- /dev/null +++ b/exporter/opentelemetry-exporter-otlp/test-requirements.txt @@ -0,0 +1,24 @@ +asgiref==3.7.2 +attrs==23.2.0 +Deprecated==1.2.14 +flaky==3.7.0 +importlib-metadata==6.11.0 +iniconfig==2.0.0 +packaging==23.2 +pluggy==1.4.0 +py==1.11.0 +py-cpuinfo==9.0.0 +pytest==7.1.3 +pytest-benchmark==4.0.0 +tomli==2.0.1 +typing_extensions==4.10.0 +wrapt==1.16.0 +zipp==3.17.0 +-e opentelemetry-api +-e exporter/opentelemetry-exporter-otlp-proto-common +-e exporter/opentelemetry-exporter-otlp-proto-grpc +-e exporter/opentelemetry-exporter-otlp-proto-http +-e opentelemetry-proto +-e opentelemetry-sdk +-e opentelemetry-semantic-conventions +-e exporter/opentelemetry-exporter-otlp diff --git a/exporter/opentelemetry-exporter-prometheus/pyproject.toml b/exporter/opentelemetry-exporter-prometheus/pyproject.toml index 0f086924ecb..3117ee6afbb 100644 --- a/exporter/opentelemetry-exporter-prometheus/pyproject.toml +++ b/exporter/opentelemetry-exporter-prometheus/pyproject.toml @@ -30,9 +30,6 @@ dependencies = [ "prometheus_client >= 0.5.0, < 1.0.0", ] -[project.optional-dependencies] -test = [] - [project.entry-points.opentelemetry_metrics_exporter] prometheus = "opentelemetry.exporter.prometheus:_AutoPrometheusMetricReader" diff --git a/exporter/opentelemetry-exporter-prometheus/test-requirements.txt b/exporter/opentelemetry-exporter-prometheus/test-requirements.txt new file mode 100644 index 00000000000..2b3dd0f9f04 --- /dev/null +++ b/exporter/opentelemetry-exporter-prometheus/test-requirements.txt @@ -0,0 +1,21 @@ +asgiref==3.7.2 +attrs==23.2.0 +Deprecated==1.2.14 +flaky==3.7.0 +importlib-metadata==6.11.0 +iniconfig==2.0.0 +packaging==23.2 +pluggy==1.4.0 +prometheus_client==0.20.0 +py==1.11.0 +py-cpuinfo==9.0.0 +pytest==7.1.3 +pytest-benchmark==4.0.0 +tomli==2.0.1 +typing_extensions==4.10.0 +wrapt==1.16.0 +zipp==3.17.0 +-e opentelemetry-api +-e opentelemetry-sdk +-e opentelemetry-semantic-conventions +-e exporter/opentelemetry-exporter-prometheus diff --git a/exporter/opentelemetry-exporter-zipkin-json/pyproject.toml b/exporter/opentelemetry-exporter-zipkin-json/pyproject.toml index 6072def4bb7..8d18ed5f568 100644 --- a/exporter/opentelemetry-exporter-zipkin-json/pyproject.toml +++ b/exporter/opentelemetry-exporter-zipkin-json/pyproject.toml @@ -30,9 +30,6 @@ dependencies = [ "requests ~= 2.7", ] -[project.optional-dependencies] -test = [] - [project.entry-points.opentelemetry_traces_exporter] zipkin_json = "opentelemetry.exporter.zipkin.json:ZipkinExporter" diff --git a/exporter/opentelemetry-exporter-zipkin-json/test-requirements.txt b/exporter/opentelemetry-exporter-zipkin-json/test-requirements.txt new file mode 100644 index 00000000000..0625946182a --- /dev/null +++ b/exporter/opentelemetry-exporter-zipkin-json/test-requirements.txt @@ -0,0 +1,25 @@ +asgiref==3.7.2 +attrs==23.2.0 +certifi==2024.2.2 +charset-normalizer==3.3.2 +Deprecated==1.2.14 +flaky==3.7.0 +idna==3.6 +importlib-metadata==6.11.0 +iniconfig==2.0.0 +packaging==23.2 +pluggy==1.4.0 +py==1.11.0 +py-cpuinfo==9.0.0 +pytest==7.1.3 +pytest-benchmark==4.0.0 +requests==2.31.0 +tomli==2.0.1 +typing_extensions==4.10.0 +urllib3==2.2.1 +wrapt==1.16.0 +zipp==3.17.0 +-e opentelemetry-api +-e opentelemetry-sdk +-e opentelemetry-semantic-conventions +-e exporter/opentelemetry-exporter-zipkin-json diff --git a/exporter/opentelemetry-exporter-zipkin-proto-http/pyproject.toml b/exporter/opentelemetry-exporter-zipkin-proto-http/pyproject.toml index e89d42d2335..25e0c95877d 100644 --- a/exporter/opentelemetry-exporter-zipkin-proto-http/pyproject.toml +++ b/exporter/opentelemetry-exporter-zipkin-proto-http/pyproject.toml @@ -32,9 +32,6 @@ dependencies = [ "requests ~= 2.7", ] -[project.optional-dependencies] -test = [] - [project.entry-points.opentelemetry_traces_exporter] zipkin_proto = "opentelemetry.exporter.zipkin.proto.http:ZipkinExporter" diff --git a/exporter/opentelemetry-exporter-zipkin-proto-http/test-requirements.txt b/exporter/opentelemetry-exporter-zipkin-proto-http/test-requirements.txt new file mode 100644 index 00000000000..acfa95ff2a0 --- /dev/null +++ b/exporter/opentelemetry-exporter-zipkin-proto-http/test-requirements.txt @@ -0,0 +1,27 @@ +asgiref==3.7.2 +attrs==23.2.0 +certifi==2024.2.2 +charset-normalizer==3.3.2 +Deprecated==1.2.14 +flaky==3.7.0 +idna==3.6 +importlib-metadata==6.11.0 +iniconfig==2.0.0 +packaging==23.2 +pluggy==1.4.0 +protobuf==3.20.3 +py==1.11.0 +py-cpuinfo==9.0.0 +pytest==7.1.3 +pytest-benchmark==4.0.0 +requests==2.31.0 +tomli==2.0.1 +typing_extensions==4.10.0 +urllib3==2.2.1 +wrapt==1.16.0 +zipp==3.17.0 +-e opentelemetry-api +-e exporter/opentelemetry-exporter-zipkin-json +-e opentelemetry-sdk +-e opentelemetry-semantic-conventions +-e exporter/opentelemetry-exporter-zipkin-proto-http diff --git a/exporter/opentelemetry-exporter-zipkin/pyproject.toml b/exporter/opentelemetry-exporter-zipkin/pyproject.toml index 5710158de77..2d22ea4f24f 100644 --- a/exporter/opentelemetry-exporter-zipkin/pyproject.toml +++ b/exporter/opentelemetry-exporter-zipkin/pyproject.toml @@ -29,9 +29,6 @@ dependencies = [ "opentelemetry-exporter-zipkin-proto-http == 1.24.0.dev", ] -[project.optional-dependencies] -test = [] - [project.entry-points.opentelemetry_traces_exporter] zipkin = "opentelemetry.exporter.zipkin.proto.http:ZipkinExporter" diff --git a/exporter/opentelemetry-exporter-zipkin/test-requirements.txt b/exporter/opentelemetry-exporter-zipkin/test-requirements.txt new file mode 100644 index 00000000000..b859e401d5c --- /dev/null +++ b/exporter/opentelemetry-exporter-zipkin/test-requirements.txt @@ -0,0 +1,22 @@ +asgiref==3.7.2 +attrs==23.2.0 +Deprecated==1.2.14 +flaky==3.7.0 +importlib-metadata==6.11.0 +iniconfig==2.0.0 +packaging==23.2 +pluggy==1.4.0 +py==1.11.0 +py-cpuinfo==9.0.0 +pytest==7.1.3 +pytest-benchmark==4.0.0 +tomli==2.0.1 +typing_extensions==4.10.0 +wrapt==1.16.0 +zipp==3.17.0 +-e opentelemetry-api +-e exporter/opentelemetry-exporter-zipkin-json +-e exporter/opentelemetry-exporter-zipkin-proto-http +-e opentelemetry-sdk +-e opentelemetry-semantic-conventions +-e exporter/opentelemetry-exporter-zipkin diff --git a/opentelemetry-api/pyproject.toml b/opentelemetry-api/pyproject.toml index 1edb203fe17..3a79346c010 100644 --- a/opentelemetry-api/pyproject.toml +++ b/opentelemetry-api/pyproject.toml @@ -27,15 +27,12 @@ dependencies = [ "Deprecated >= 1.2.6", # FIXME This should be able to be removed after 3.12 is released if there is a reliable API # in importlib.metadata. - "importlib-metadata >= 6.0, < 7.0", + "importlib-metadata >= 6.0, <= 7.0", ] dynamic = [ "version", ] -[project.optional-dependencies] -test = [] - [project.entry-points.opentelemetry_context] contextvars_context = "opentelemetry.context.contextvars_context:ContextVarsRuntimeContext" diff --git a/opentelemetry-api/src/opentelemetry/trace/__init__.py b/opentelemetry-api/src/opentelemetry/trace/__init__.py index 8910fd27518..3b6295e259d 100644 --- a/opentelemetry-api/src/opentelemetry/trace/__init__.py +++ b/opentelemetry-api/src/opentelemetry/trace/__init__.py @@ -77,7 +77,6 @@ import os import typing from abc import ABC, abstractmethod -from contextlib import contextmanager from enum import Enum from logging import getLogger from typing import Iterator, Optional, Sequence, cast @@ -109,6 +108,7 @@ ) from opentelemetry.trace.status import Status, StatusCode from opentelemetry.util import types +from opentelemetry.util._decorator import _agnosticcontextmanager from opentelemetry.util._once import Once from opentelemetry.util._providers import _load_provider @@ -324,7 +324,7 @@ def start_span( The newly-created span. """ - @contextmanager + @_agnosticcontextmanager @abstractmethod def start_as_current_span( self, @@ -431,7 +431,7 @@ def _tracer(self) -> Tracer: def start_span(self, *args, **kwargs) -> Span: # type: ignore return self._tracer.start_span(*args, **kwargs) # type: ignore - @contextmanager # type: ignore + @_agnosticcontextmanager # type: ignore def start_as_current_span(self, *args, **kwargs) -> Iterator[Span]: with self._tracer.start_as_current_span(*args, **kwargs) as span: # type: ignore yield span @@ -457,7 +457,7 @@ def start_span( # pylint: disable=unused-argument,no-self-use return INVALID_SPAN - @contextmanager + @_agnosticcontextmanager def start_as_current_span( self, name: str, @@ -543,7 +543,7 @@ def get_tracer_provider() -> TracerProvider: return cast("TracerProvider", _TRACER_PROVIDER) -@contextmanager +@_agnosticcontextmanager def use_span( span: Span, end_on_exit: bool = False, diff --git a/opentelemetry-api/src/opentelemetry/util/_decorator.py b/opentelemetry-api/src/opentelemetry/util/_decorator.py new file mode 100644 index 00000000000..233f29ff79d --- /dev/null +++ b/opentelemetry-api/src/opentelemetry/util/_decorator.py @@ -0,0 +1,81 @@ +# 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. + +import asyncio +import contextlib +import functools +import typing +from typing import Callable, Generic, Iterator, TypeVar + +V = TypeVar("V") +R = TypeVar("R") # Return type +Pargs = TypeVar("Pargs") # Generic type for arguments +Pkwargs = TypeVar("Pkwargs") # Generic type for arguments + +if hasattr(typing, "ParamSpec"): + # only available in python 3.10+ + # https://peps.python.org/pep-0612/ + P = typing.ParamSpec("P") # Generic type for all arguments + + +class _AgnosticContextManager( + contextlib._GeneratorContextManager, Generic[R] # type: ignore # FIXME use contextlib._GeneratorContextManager[R] when we drop the python 3.8 support +): # pylint: disable=protected-access + """Context manager that can decorate both async and sync functions. + + This is an overridden version of the contextlib._GeneratorContextManager + class that will decorate async functions with an async context manager + to end the span AFTER the entire async function coroutine finishes. + + Else it will report near zero spans durations for async functions. + + We are overriding the contextlib._GeneratorContextManager class as + reimplementing it is a lot of code to maintain and this class (even if it's + marked as protected) doesn't seems like to be evolving a lot. + + For more information, see: + https://github.com/open-telemetry/opentelemetry-python/pull/3633 + """ + + def __enter__(self) -> R: + """Reimplementing __enter__ to avoid the type error. + + The original __enter__ method returns Any type, but we want to return R. + """ + del self.args, self.kwds, self.func # type: ignore + try: + return next(self.gen) # type: ignore + except StopIteration: + raise RuntimeError("generator didn't yield") from None + + def __call__(self, func: V) -> V: + if asyncio.iscoroutinefunction(func): + + @functools.wraps(func) # type: ignore + async def async_wrapper(*args: Pargs, **kwargs: Pkwargs) -> R: + with self._recreate_cm(): # type: ignore + return await func(*args, **kwargs) # type: ignore + + return async_wrapper # type: ignore + return super().__call__(func) # type: ignore + + +def _agnosticcontextmanager( + func: "Callable[P, Iterator[R]]", +) -> "Callable[P, _AgnosticContextManager[R]]": + @functools.wraps(func) + def helper(*args: Pargs, **kwargs: Pkwargs) -> _AgnosticContextManager[R]: + return _AgnosticContextManager(func, args, kwargs) + + return helper diff --git a/opentelemetry-api/test-requirements.txt b/opentelemetry-api/test-requirements.txt new file mode 100644 index 00000000000..273750cb010 --- /dev/null +++ b/opentelemetry-api/test-requirements.txt @@ -0,0 +1,17 @@ +asgiref==3.7.2 +attrs==23.2.0 +Deprecated==1.2.14 +flaky==3.7.0 +importlib-metadata==6.11.0 +iniconfig==2.0.0 +packaging==23.2 +pluggy==1.4.0 +py==1.11.0 +py-cpuinfo==9.0.0 +pytest==7.1.3 +pytest-benchmark==4.0.0 +tomli==2.0.1 +typing_extensions==4.10.0 +wrapt==1.16.0 +zipp==3.17.0 +-e opentelemetry-api diff --git a/opentelemetry-api/tests/trace/test_proxy.py b/opentelemetry-api/tests/trace/test_proxy.py index e48a2157aec..8c367afb6da 100644 --- a/opentelemetry-api/tests/trace/test_proxy.py +++ b/opentelemetry-api/tests/trace/test_proxy.py @@ -15,7 +15,6 @@ # pylint: disable=W0212,W0222,W0221 import typing import unittest -from contextlib import contextmanager from opentelemetry import trace from opentelemetry.test.globals_test import TraceGlobalsTest @@ -24,6 +23,7 @@ NonRecordingSpan, Span, ) +from opentelemetry.util._decorator import _agnosticcontextmanager class TestProvider(trace.NoOpTracerProvider): @@ -40,7 +40,7 @@ class TestTracer(trace.NoOpTracer): def start_span(self, *args, **kwargs): return TestSpan(INVALID_SPAN_CONTEXT) - @contextmanager + @_agnosticcontextmanager # pylint: disable=protected-access def start_as_current_span(self, *args, **kwargs): # type: ignore with trace.use_span(self.start_span(*args, **kwargs)) as span: # type: ignore yield span diff --git a/opentelemetry-api/tests/trace/test_tracer.py b/opentelemetry-api/tests/trace/test_tracer.py index a7ad589ae60..fae836d564f 100644 --- a/opentelemetry-api/tests/trace/test_tracer.py +++ b/opentelemetry-api/tests/trace/test_tracer.py @@ -13,15 +13,15 @@ # limitations under the License. -from contextlib import contextmanager +import asyncio from unittest import TestCase -from unittest.mock import Mock from opentelemetry.trace import ( INVALID_SPAN, NoOpTracer, Span, Tracer, + _agnosticcontextmanager, get_current_span, ) @@ -39,29 +39,42 @@ def test_start_as_current_span_context_manager(self): self.assertIsInstance(span, Span) def test_start_as_current_span_decorator(self): - - mock_call = Mock() + # using a list to track the mock call order + calls = [] class MockTracer(Tracer): def start_span(self, *args, **kwargs): return INVALID_SPAN - @contextmanager + @_agnosticcontextmanager # pylint: disable=protected-access def start_as_current_span(self, *args, **kwargs): # type: ignore - mock_call() + calls.append(1) yield INVALID_SPAN + calls.append(9) mock_tracer = MockTracer() + # test 1 : sync function @mock_tracer.start_as_current_span("name") - def function(): # type: ignore - pass + def function_sync(data: str) -> int: + calls.append(5) + return len(data) - function() # type: ignore - function() # type: ignore - function() # type: ignore + calls = [] + res = function_sync("123") + self.assertEqual(res, 3) + self.assertEqual(calls, [1, 5, 9]) - self.assertEqual(mock_call.call_count, 3) + # test 2 : async function + @mock_tracer.start_as_current_span("name") + async def function_async(data: str) -> int: + calls.append(5) + return len(data) + + calls = [] + res = asyncio.run(function_async("123")) + self.assertEqual(res, 3) + self.assertEqual(calls, [1, 5, 9]) def test_get_current_span(self): with self.tracer.start_as_current_span("test") as span: diff --git a/opentelemetry-api/tests/util/test_contextmanager.py b/opentelemetry-api/tests/util/test_contextmanager.py new file mode 100644 index 00000000000..f26882c6c79 --- /dev/null +++ b/opentelemetry-api/tests/util/test_contextmanager.py @@ -0,0 +1,68 @@ +# 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. + +import asyncio +import unittest +from typing import Callable, Iterator + +from opentelemetry.util._decorator import _agnosticcontextmanager + + +@_agnosticcontextmanager +def cm() -> Iterator[int]: + yield 3 + + +@_agnosticcontextmanager +def cm_call_when_done(f: Callable[[], None]) -> Iterator[int]: + yield 3 + f() + + +class TestContextManager(unittest.TestCase): + def test_sync_with(self): + with cm() as val: + self.assertEqual(val, 3) + + def test_decorate_sync_func(self): + @cm() + def sync_func(a: str) -> str: + return a + a + + res = sync_func("a") + self.assertEqual(res, "aa") + + def test_decorate_async_func(self): + # Test that a universal context manager decorating an async function runs it's cleanup + # code after the entire async function coroutine finishes. This silently fails when + # using the normal @contextmanager decorator, which runs it's __exit__() after the + # un-started coroutine is returned. + # + # To see this behavior, change cm_call_when_done() to + # be decorated with @contextmanager. + + events = [] + + @cm_call_when_done(lambda: events.append("cm_done")) + async def async_func(a: str) -> str: + events.append("start_async_func") + await asyncio.sleep(0) + events.append("finish_sleep") + return a + a + + res = asyncio.run(async_func("a")) + self.assertEqual(res, "aa") + self.assertEqual( + events, ["start_async_func", "finish_sleep", "cm_done"] + ) diff --git a/opentelemetry-proto/pyproject.toml b/opentelemetry-proto/pyproject.toml index 822eaa88bfc..ed5c49c0f4c 100644 --- a/opentelemetry-proto/pyproject.toml +++ b/opentelemetry-proto/pyproject.toml @@ -27,9 +27,6 @@ dependencies = [ "protobuf>=3.19, < 5.0", ] -[project.optional-dependencies] -test = [] - [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-proto" diff --git a/opentelemetry-proto/test-requirements.txt b/opentelemetry-proto/test-requirements.txt new file mode 100644 index 00000000000..4908ed5baaf --- /dev/null +++ b/opentelemetry-proto/test-requirements.txt @@ -0,0 +1,17 @@ +asgiref==3.7.2 +attrs==23.2.0 +Deprecated==1.2.14 +flaky==3.7.0 +importlib-metadata==6.11.0 +iniconfig==2.0.0 +packaging==23.2 +pluggy==1.4.0 +py==1.11.0 +py-cpuinfo==9.0.0 +pytest==7.1.3 +pytest-benchmark==4.0.0 +tomli==2.0.1 +typing_extensions==4.10.0 +wrapt==1.16.0 +zipp==3.17.0 +-e opentelemetry-proto diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/__init__.py index e7099562eb8..14546636a94 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/__init__.py @@ -496,7 +496,7 @@ def __init__( elif self._export_interval_millis <= 0: raise ValueError( f"interval value {self._export_interval_millis} is invalid \ - and needs to be larger than zero and lower than infinity." + and needs to be larger than zero." ) def _at_fork_reinit(self): diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py index f937ece8958..7c0a194c82a 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py @@ -21,7 +21,6 @@ import threading import traceback import typing -from contextlib import contextmanager from os import environ from time import time_ns from types import MappingProxyType, TracebackType @@ -66,6 +65,7 @@ from opentelemetry.trace import SpanContext from opentelemetry.trace.status import Status, StatusCode from opentelemetry.util import types +from opentelemetry.util._decorator import _agnosticcontextmanager logger = logging.getLogger(__name__) @@ -1038,7 +1038,7 @@ def __init__( self._span_limits = span_limits self._instrumentation_scope = instrumentation_scope - @contextmanager + @_agnosticcontextmanager # pylint: disable=protected-access def start_as_current_span( self, name: str, diff --git a/opentelemetry-semantic-conventions/pyproject.toml b/opentelemetry-semantic-conventions/pyproject.toml index 3c44bf50b25..acdfacf8908 100644 --- a/opentelemetry-semantic-conventions/pyproject.toml +++ b/opentelemetry-semantic-conventions/pyproject.toml @@ -24,9 +24,6 @@ classifiers = [ "Programming Language :: Python :: 3.11", ] -[project.optional-dependencies] -test = [] - [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-semantic-conventions" diff --git a/opentelemetry-semantic-conventions/test-requirements.txt b/opentelemetry-semantic-conventions/test-requirements.txt new file mode 100644 index 00000000000..84629406b07 --- /dev/null +++ b/opentelemetry-semantic-conventions/test-requirements.txt @@ -0,0 +1,17 @@ +asgiref==3.7.2 +attrs==23.2.0 +Deprecated==1.2.14 +flaky==3.7.0 +importlib-metadata==6.11.0 +iniconfig==2.0.0 +packaging==23.2 +pluggy==1.4.0 +py==1.11.0 +py-cpuinfo==9.0.0 +pytest==7.1.3 +pytest-benchmark==4.0.0 +tomli==2.0.1 +typing_extensions==4.10.0 +wrapt==1.16.0 +zipp==3.17.0 +-e opentelemetry-semantic-conventions diff --git a/propagator/opentelemetry-propagator-b3/pyproject.toml b/propagator/opentelemetry-propagator-b3/pyproject.toml index 9e17f4c8d3e..736006e74e4 100644 --- a/propagator/opentelemetry-propagator-b3/pyproject.toml +++ b/propagator/opentelemetry-propagator-b3/pyproject.toml @@ -29,9 +29,6 @@ dependencies = [ "opentelemetry-api ~= 1.3", ] -[project.optional-dependencies] -test = [] - [project.entry-points.opentelemetry_propagator] b3 = "opentelemetry.propagators.b3:B3SingleFormat" b3multi = "opentelemetry.propagators.b3:B3MultiFormat" diff --git a/propagator/opentelemetry-propagator-b3/test-requirements.txt b/propagator/opentelemetry-propagator-b3/test-requirements.txt new file mode 100644 index 00000000000..366dfca0d89 --- /dev/null +++ b/propagator/opentelemetry-propagator-b3/test-requirements.txt @@ -0,0 +1,18 @@ +asgiref==3.7.2 +attrs==23.2.0 +Deprecated==1.2.14 +flaky==3.7.0 +importlib-metadata==6.11.0 +iniconfig==2.0.0 +packaging==23.2 +pluggy==1.4.0 +py==1.11.0 +py-cpuinfo==9.0.0 +pytest==7.1.3 +pytest-benchmark==4.0.0 +tomli==2.0.1 +typing_extensions==4.10.0 +wrapt==1.16.0 +zipp==3.17.0 +-e opentelemetry-api +-e propagator/opentelemetry-propagator-b3 diff --git a/propagator/opentelemetry-propagator-jaeger/pyproject.toml b/propagator/opentelemetry-propagator-jaeger/pyproject.toml index 105f7088614..b716925f439 100644 --- a/propagator/opentelemetry-propagator-jaeger/pyproject.toml +++ b/propagator/opentelemetry-propagator-jaeger/pyproject.toml @@ -28,9 +28,6 @@ dependencies = [ "opentelemetry-api ~= 1.3", ] -[project.optional-dependencies] -test = [] - [project.entry-points.opentelemetry_propagator] jaeger = "opentelemetry.propagators.jaeger:JaegerPropagator" diff --git a/propagator/opentelemetry-propagator-jaeger/test-requirements.txt b/propagator/opentelemetry-propagator-jaeger/test-requirements.txt new file mode 100644 index 00000000000..ed7338bfbc2 --- /dev/null +++ b/propagator/opentelemetry-propagator-jaeger/test-requirements.txt @@ -0,0 +1,18 @@ +asgiref==3.7.2 +attrs==23.2.0 +Deprecated==1.2.14 +flaky==3.7.0 +importlib-metadata==6.11.0 +iniconfig==2.0.0 +packaging==23.2 +pluggy==1.4.0 +py==1.11.0 +py-cpuinfo==9.0.0 +pytest==7.1.3 +pytest-benchmark==4.0.0 +tomli==2.0.1 +typing_extensions==4.10.0 +wrapt==1.16.0 +zipp==3.17.0 +-e opentelemetry-api +-e propagator/opentelemetry-propagator-jaeger diff --git a/shim/opentelemetry-opencensus-shim/pyproject.toml b/shim/opentelemetry-opencensus-shim/pyproject.toml index 404444922a3..be92937faed 100644 --- a/shim/opentelemetry-opencensus-shim/pyproject.toml +++ b/shim/opentelemetry-opencensus-shim/pyproject.toml @@ -32,12 +32,6 @@ dependencies = [ ] [project.optional-dependencies] -test = [ - "opentelemetry-test-utils == 0.45b0.dev", - "opencensus == 0.11.1", - # Temporary fix for https://github.com/census-instrumentation/opencensus-python/issues/1219 - "six == 1.16.0", -] [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python/tree/main/shim/opentelemetry-opencensus-shim" diff --git a/shim/opentelemetry-opencensus-shim/test-requirements.txt b/shim/opentelemetry-opencensus-shim/test-requirements.txt new file mode 100644 index 00000000000..68008fb500e --- /dev/null +++ b/shim/opentelemetry-opencensus-shim/test-requirements.txt @@ -0,0 +1,36 @@ +asgiref==3.7.2 +attrs==23.2.0 +cachetools==5.3.3 +certifi==2024.2.2 +charset-normalizer==3.3.2 +Deprecated==1.2.14 +flaky==3.7.0 +google-api-core==2.17.1 +google-auth==2.28.1 +googleapis-common-protos==1.62.0 +grpcio==1.62.0 +idna==3.6 +importlib-metadata==6.11.0 +iniconfig==2.0.0 +opencensus==0.11.1 +opencensus-context==0.1.3 +opencensus-proto==0.1.0 +packaging==23.2 +pluggy==1.4.0 +protobuf==3.20.3 +py==1.11.0 +py-cpuinfo==9.0.0 +pyasn1==0.5.1 +pyasn1-modules==0.3.0 +pytest==7.1.3 +pytest-benchmark==4.0.0 +requests==2.31.0 +rsa==4.9 +six==1.16.0 +tomli==2.0.1 +typing_extensions==4.10.0 +urllib3==2.2.1 +wrapt==1.16.0 +zipp==3.17.0 +-e opentelemetry-api +-e shim/opentelemetry-opencensus-shim diff --git a/shim/opentelemetry-opentracing-shim/pyproject.toml b/shim/opentelemetry-opentracing-shim/pyproject.toml index 0a2057ecfd0..79507939f4c 100644 --- a/shim/opentelemetry-opentracing-shim/pyproject.toml +++ b/shim/opentelemetry-opentracing-shim/pyproject.toml @@ -30,12 +30,6 @@ dependencies = [ "opentracing ~= 2.0", ] -[project.optional-dependencies] -test = [ - "opentelemetry-test-utils == 0.45b0.dev", - "opentracing >= 2.2.0, <3", -] - [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python/tree/main/shim/opentelemetry-opentracing-shim" diff --git a/shim/opentelemetry-opentracing-shim/test-requirements.txt b/shim/opentelemetry-opentracing-shim/test-requirements.txt new file mode 100644 index 00000000000..37a2afbf99f --- /dev/null +++ b/shim/opentelemetry-opentracing-shim/test-requirements.txt @@ -0,0 +1,19 @@ +asgiref==3.7.2 +attrs==23.2.0 +Deprecated==1.2.14 +flaky==3.7.0 +importlib-metadata==6.11.0 +iniconfig==2.0.0 +opentracing==2.4.0 +packaging==23.2 +pluggy==1.4.0 +py==1.11.0 +py-cpuinfo==9.0.0 +pytest==7.1.3 +pytest-benchmark==4.0.0 +tomli==2.0.1 +typing_extensions==4.10.0 +wrapt==1.16.0 +zipp==3.17.0 +-e opentelemetry-api +-e shim/opentelemetry-opentracing-shim diff --git a/tests/opentelemetry-test-utils/pyproject.toml b/tests/opentelemetry-test-utils/pyproject.toml index b6a39e492cd..6978ba5e22c 100644 --- a/tests/opentelemetry-test-utils/pyproject.toml +++ b/tests/opentelemetry-test-utils/pyproject.toml @@ -28,9 +28,6 @@ dependencies = [ "opentelemetry-sdk == 1.24.0.dev", ] -[project.optional-dependencies] -test = [] - [project.urls] Homepage = "https://github.com/open-telemetry/opentelemetry-python/tests/opentelemetry-test-utils" diff --git a/tests/opentelemetry-test-utils/test-requirements.txt b/tests/opentelemetry-test-utils/test-requirements.txt new file mode 100644 index 00000000000..19b6fb58cb0 --- /dev/null +++ b/tests/opentelemetry-test-utils/test-requirements.txt @@ -0,0 +1,20 @@ +asgiref==3.7.2 +attrs==23.2.0 +Deprecated==1.2.14 +flaky==3.7.0 +importlib-metadata==6.11.0 +iniconfig==2.0.0 +packaging==23.2 +pluggy==1.4.0 +py==1.11.0 +py-cpuinfo==9.0.0 +pytest==7.1.3 +pytest-benchmark==4.0.0 +tomli==2.0.1 +typing_extensions==4.10.0 +wrapt==1.16.0 +zipp==3.17.0 +-e opentelemetry-api +-e opentelemetry-sdk +-e opentelemetry-semantic-conventions +-e tests/opentelemetry-test-utils diff --git a/tox.ini b/tox.ini index 3d688944eba..2b82d804dc9 100644 --- a/tox.ini +++ b/tox.ini @@ -100,13 +100,16 @@ commands_pre = ; Install without -e to test the actual installation py3{8,9,10,11}: python -m pip install -U pip setuptools wheel + api: pip install -r {toxinidir}/opentelemetry-api/test-requirements.txt sdk: pip install -r {toxinidir}/opentelemetry-sdk/test-requirements.txt + semantic-conventions: pip install -r {toxinidir}/opentelemetry-semantic-conventions/test-requirements.txt + test-utils: pip install -r {toxinidir}/tests/opentelemetry-test-utils/test-requirements.txt ; 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. opentelemetry: pip install {toxinidir}/opentelemetry-api {toxinidir}/opentelemetry-semantic-conventions {toxinidir}/opentelemetry-sdk {toxinidir}/tests/opentelemetry-test-utils - protobuf: pip install {toxinidir}/opentelemetry-proto + protobuf: pip install -r {toxinidir}/opentelemetry-proto/test-requirements.txt getting-started: pip install -r {toxinidir}/docs/getting_started/tests/requirements.txt getting-started: pip install -e {env:CONTRIB_REPO}\#egg=opentelemetry-util-http&subdirectory=util/opentelemetry-util-http @@ -115,45 +118,34 @@ commands_pre = getting-started: pip install -e {env:CONTRIB_REPO}\#egg=opentelemetry-instrumentation-wsgi&subdirectory=instrumentation/opentelemetry-instrumentation-wsgi getting-started: pip install -e {env:CONTRIB_REPO}\#egg=opentelemetry-instrumentation-flask&subdirectory=instrumentation/opentelemetry-instrumentation-flask - opencensus: pip install {toxinidir}/exporter/opentelemetry-exporter-opencensus + exporter-opencensus: pip install -r {toxinidir}/exporter/opentelemetry-exporter-opencensus/test-requirements.txt - exporter-otlp-proto-common: pip install {toxinidir}/opentelemetry-proto - exporter-otlp-proto-common: pip install {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-common + exporter-otlp-proto-common: pip install -r {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-common/test-requirements.txt - exporter-otlp-combined: pip install {toxinidir}/opentelemetry-proto - exporter-otlp-combined: pip install {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-common - exporter-otlp-combined: pip install {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-grpc - exporter-otlp-combined: pip install {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-http - exporter-otlp-combined: pip install {toxinidir}/exporter/opentelemetry-exporter-otlp + exporter-otlp-combined: pip install -r {toxinidir}/exporter/opentelemetry-exporter-otlp/test-requirements.txt exporter-otlp-proto-grpc: pip install {toxinidir}/opentelemetry-proto exporter-otlp-proto-grpc: pip install {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-common exporter-otlp-proto-grpc: pip install {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-grpc - exporter-otlp-proto-http: pip install {toxinidir}/opentelemetry-proto - exporter-otlp-proto-http: pip install {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-common - exporter-otlp-proto-http: pip install {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-http[test] + proto3-opentelemetry-exporter-otlp-proto-http: pip install -r {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-http/test-requirements-0.txt + proto4-opentelemetry-exporter-otlp-proto-http: pip install -r {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-http/test-requirements-1.txt - opentracing-shim: pip install {toxinidir}/opentelemetry-sdk - opentracing-shim: pip install {toxinidir}/shim/opentelemetry-opentracing-shim + opentracing-shim: pip install -r {toxinidir}/shim/opentelemetry-opentracing-shim/test-requirements.txt - opencensus-shim: pip install {toxinidir}/opentelemetry-sdk - opencensus-shim: pip install {toxinidir}/shim/opentelemetry-opencensus-shim[test] + opencensus-shim: pip install -r {toxinidir}/shim/opentelemetry-opencensus-shim/test-requirements.txt - exporter-prometheus: pip install {toxinidir}/exporter/opentelemetry-exporter-prometheus + exporter-prometheus: pip install -r {toxinidir}/exporter/opentelemetry-exporter-prometheus/test-requirements.txt - exporter-zipkin-combined: pip install {toxinidir}/exporter/opentelemetry-exporter-zipkin-json - exporter-zipkin-combined: pip install {toxinidir}/exporter/opentelemetry-exporter-zipkin-proto-http - exporter-zipkin-combined: pip install {toxinidir}/exporter/opentelemetry-exporter-zipkin + exporter-zipkin-combined: pip install -r {toxinidir}/exporter/opentelemetry-exporter-zipkin/test-requirements.txt - exporter-zipkin-proto-http: pip install {toxinidir}/exporter/opentelemetry-exporter-zipkin-json - exporter-zipkin-proto-http: pip install {toxinidir}/exporter/opentelemetry-exporter-zipkin-proto-http + exporter-zipkin-proto-http: pip install -r {toxinidir}/exporter/opentelemetry-exporter-zipkin-proto-http/test-requirements.txt - exporter-zipkin-json: pip install {toxinidir}/exporter/opentelemetry-exporter-zipkin-json + exporter-zipkin-json: pip install -r {toxinidir}/exporter/opentelemetry-exporter-zipkin-json/test-requirements.txt - b3: pip install {toxinidir}/propagator/opentelemetry-propagator-b3 + propagator-b3: pip install -r {toxinidir}/propagator/opentelemetry-propagator-b3/test-requirements.txt - propagator-jaeger: pip install {toxinidir}/propagator/opentelemetry-propagator-jaeger + propagator-jaeger: pip install -r {toxinidir}/propagator/opentelemetry-propagator-jaeger/test-requirements.txt ; In order to get a healthy coverage report, ; we have to install packages in editable mode. @@ -213,24 +205,24 @@ deps = -r dev-requirements.txt commands_pre = - python -m pip install -e {toxinidir}/opentelemetry-api[test] - python -m pip install -e {toxinidir}/opentelemetry-semantic-conventions[test] + pip install -r {toxinidir}/opentelemetry-api/test-requirements.txt pip install -r {toxinidir}/opentelemetry-sdk/test-requirements.txt - python -m pip install -e {toxinidir}/opentelemetry-proto[test] - python -m pip install -e {toxinidir}/tests/opentelemetry-test-utils[test] - python -m pip install -e {toxinidir}/shim/opentelemetry-opentracing-shim[test] - python -m pip install -e {toxinidir}/shim/opentelemetry-opencensus-shim[test] - python -m pip install -e {toxinidir}/exporter/opentelemetry-exporter-opencensus[test] - python -m pip install -e {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-common[test] + pip install -r {toxinidir}/opentelemetry-semantic-conventions/test-requirements.txt + pip install -r {toxinidir}/opentelemetry-proto/test-requirements.txt + pip install -r {toxinidir}/shim/opentelemetry-opentracing-shim/test-requirements.txt + pip install -r {toxinidir}/shim/opentelemetry-opencensus-shim/test-requirements.txt + pip install -r {toxinidir}/exporter/opentelemetry-exporter-opencensus/test-requirements.txt + pip install -r {toxinidir}/tests/opentelemetry-test-utils/test-requirements.txt + pip install -r {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-common/test-requirements.txt python -m pip install -e {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-grpc[test] - python -m pip install -e {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-http[test] - python -m pip install -e {toxinidir}/exporter/opentelemetry-exporter-otlp[test] - python -m pip install -e {toxinidir}/exporter/opentelemetry-exporter-prometheus[test] - python -m pip install -e {toxinidir}/exporter/opentelemetry-exporter-zipkin-json[test] - python -m pip install -e {toxinidir}/exporter/opentelemetry-exporter-zipkin-proto-http[test] - python -m pip install -e {toxinidir}/exporter/opentelemetry-exporter-zipkin[test] - python -m pip install -e {toxinidir}/propagator/opentelemetry-propagator-b3[test] - python -m pip install -e {toxinidir}/propagator/opentelemetry-propagator-jaeger[test] + pip install -r {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-http/test-requirements-1.txt + pip install -r {toxinidir}/exporter/opentelemetry-exporter-prometheus/test-requirements.txt + pip install -r {toxinidir}/exporter/opentelemetry-exporter-zipkin-proto-http/test-requirements.txt + pip install -r {toxinidir}/exporter/opentelemetry-exporter-zipkin-json/test-requirements.txt + pip install -r {toxinidir}/exporter/opentelemetry-exporter-otlp/test-requirements.txt + pip install -r {toxinidir}/exporter/opentelemetry-exporter-zipkin/test-requirements.txt + pip install -r {toxinidir}/propagator/opentelemetry-propagator-b3/test-requirements.txt + pip install -r {toxinidir}/propagator/opentelemetry-propagator-jaeger/test-requirements.txt # Pin protobuf version due to lint failing on v3.20.0 # https://github.com/protocolbuffers/protobuf/issues/9730 python -m pip install protobuf==3.19.4