diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2dacdd6b059..651b13ab559 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,7 +10,7 @@ env: # Otherwise, set variable to the commit of your branch on # opentelemetry-python-contrib which is compatible with these Core repo # changes. - CONTRIB_REPO_SHA: 9a7c2f7ba16669d00be273aa9e988af0df7aba4c + CONTRIB_REPO_SHA: 3c2788469834aa4f5976e1644d757f43d60bc219 # This is needed because we do not clone the core repo in contrib builds anymore. # When running contrib builds as part of core builds, we use actions/checkout@v2 which # does not set an environment variable (simply just runs tox), which is different when @@ -176,7 +176,7 @@ jobs: - "tornado" - "tortoiseorm" - "urllib" - - "urllib3v" + - "urllib3" - "wsgi" - "prometheus-remote-write" - "richconsole" 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 42a0bb4d354..bc9a8dd77da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,14 +7,28 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +## Version 1.24.0/0.45b0 (2024-03-28) + +- Make create_gauge non-abstract method + ([#3817](https://github.com/open-telemetry/opentelemetry-python/pull/3817)) +- 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)) - Add to_json method to ExponentialHistogram ([#3780](https://github.com/open-telemetry/opentelemetry-python/pull/3780)) - bump mypy to 0.982 ([#3776](https://github.com/open-telemetry/opentelemetry-python/pull/3776)) +- Add support for OTEL_SDK_DISABLED environment variable + ([#3648](https://github.com/open-telemetry/opentelemetry-python/pull/3648)) - Fix ValueError message for PeriodicExportingMetricsReader ([#3769](https://github.com/open-telemetry/opentelemetry-python/pull/3769)) +- Use `BaseException` instead of `Exception` in `record_exception` + ([#3354](https://github.com/open-telemetry/opentelemetry-python/pull/3354)) +- Make span.record_exception more robust + ([#3778](https://github.com/open-telemetry/opentelemetry-python/pull/3778)) +- Fix license field in pyproject.toml files + ([#3803](https://github.com/open-telemetry/opentelemetry-python/pull/3803)) ## Version 1.23.0/0.44b0 (2024-02-23) @@ -1490,3 +1504,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Remove dependency on 'backoff' library ([#3679](https://github.com/open-telemetry/opentelemetry-python/pull/3679)) + +- Make create_gauge non-abstract method + ([#3817](https://github.com/open-telemetry/opentelemetry-python/pull/3817)) +- 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)) +- Add support for OTEL_SDK_DISABLED environment variable + ([#3648](https://github.com/open-telemetry/opentelemetry-python/pull/3648)) +- Fix ValueError message for PeriodicExportingMetricsReader + ([#3769](https://github.com/open-telemetry/opentelemetry-python/pull/3769)) +- Use `BaseException` instead of `Exception` in `record_exception` + ([#3354](https://github.com/open-telemetry/opentelemetry-python/pull/3354)) +- Make span.record_exception more robust + ([#3778](https://github.com/open-telemetry/opentelemetry-python/pull/3778)) +- Fix license field in pyproject.toml files + ([#3803](https://github.com/open-telemetry/opentelemetry-python/pull/3803)) + diff --git a/docs/examples/error_handler/error_handler_0/pyproject.toml b/docs/examples/error_handler/error_handler_0/pyproject.toml index 689a4dd0191..7869303c110 100644 --- a/docs/examples/error_handler/error_handler_0/pyproject.toml +++ b/docs/examples/error_handler/error_handler_0/pyproject.toml @@ -7,7 +7,7 @@ name = "error-handler-0" dynamic = ["version"] description = "This is just an error handler example package" readme = "README.rst" -license = "Apache-2.0" +license = {text = "Apache-2.0"} requires-python = ">=3.8" authors = [ { name = "OpenTelemetry Authors", email = "cncf-opentelemetry-contributors@lists.cncf.io" }, diff --git a/docs/examples/error_handler/error_handler_1/pyproject.toml b/docs/examples/error_handler/error_handler_1/pyproject.toml index af9ad21d181..b2e04d4a676 100644 --- a/docs/examples/error_handler/error_handler_1/pyproject.toml +++ b/docs/examples/error_handler/error_handler_1/pyproject.toml @@ -7,7 +7,7 @@ name = "error-handler-1" dynamic = ["version"] description = "This is just an error handler example package" readme = "README.rst" -license = "Apache-2.0" +license = {text = "Apache-2.0"} requires-python = ">=3.8" authors = [ { name = "OpenTelemetry Authors", email = "cncf-opentelemetry-contributors@lists.cncf.io" }, 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/eachdist.ini b/eachdist.ini index 7749b33a842..b7d73f192aa 100644 --- a/eachdist.ini +++ b/eachdist.ini @@ -11,7 +11,7 @@ sortfirst= exporter/* [stable] -version=1.24.0.dev +version=1.25.0.dev packages= opentelemetry-sdk @@ -27,7 +27,7 @@ packages= opentelemetry-api [prerelease] -version=0.45b0.dev +version=0.46b0.dev packages= opentelemetry-opentracing-shim diff --git a/exporter/opentelemetry-exporter-opencensus/pyproject.toml b/exporter/opentelemetry-exporter-opencensus/pyproject.toml index abe50f7b7f7..44ba08ebcb0 100644 --- a/exporter/opentelemetry-exporter-opencensus/pyproject.toml +++ b/exporter/opentelemetry-exporter-opencensus/pyproject.toml @@ -7,7 +7,7 @@ name = "opentelemetry-exporter-opencensus" dynamic = ["version"] description = "OpenCensus Exporter" readme = "README.rst" -license = "Apache-2.0" +license = {text = "Apache-2.0"} requires-python = ">=3.8" authors = [ { name = "OpenTelemetry Authors", email = "cncf-opentelemetry-contributors@lists.cncf.io" }, @@ -27,7 +27,7 @@ classifiers = [ dependencies = [ "grpcio >= 1.0.0, < 2.0.0", "opencensus-proto >= 0.1.0, < 1.0.0", - "opentelemetry-api >= 1.24.0.dev", + "opentelemetry-api >= 1.25.0.dev", "opentelemetry-sdk >= 1.15", "protobuf ~= 3.13", "setuptools >= 16.0", diff --git a/exporter/opentelemetry-exporter-opencensus/src/opentelemetry/exporter/opencensus/version.py b/exporter/opentelemetry-exporter-opencensus/src/opentelemetry/exporter/opencensus/version.py index 2b23bc49941..ff4933b20b8 100644 --- a/exporter/opentelemetry-exporter-opencensus/src/opentelemetry/exporter/opencensus/version.py +++ b/exporter/opentelemetry-exporter-opencensus/src/opentelemetry/exporter/opencensus/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.45b0.dev" +__version__ = "0.46b0.dev" diff --git a/exporter/opentelemetry-exporter-otlp-proto-common/pyproject.toml b/exporter/opentelemetry-exporter-otlp-proto-common/pyproject.toml index 8043bfbcf9a..64e1b02c7a5 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-common/pyproject.toml +++ b/exporter/opentelemetry-exporter-otlp-proto-common/pyproject.toml @@ -7,7 +7,7 @@ name = "opentelemetry-exporter-otlp-proto-common" dynamic = ["version"] description = "OpenTelemetry Protobuf encoding" readme = "README.rst" -license = "Apache-2.0" +license = {text = "Apache-2.0"} requires-python = ">=3.8" authors = [ { name = "OpenTelemetry Authors", email = "cncf-opentelemetry-contributors@lists.cncf.io" }, @@ -24,7 +24,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", ] dependencies = [ - "opentelemetry-proto == 1.24.0.dev", + "opentelemetry-proto == 1.25.0.dev", ] [project.urls] diff --git a/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/version.py b/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/version.py index 8c35630f0e1..e8b404f0501 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/version.py +++ b/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.24.0.dev" +__version__ = "1.25.0.dev" diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/pyproject.toml b/exporter/opentelemetry-exporter-otlp-proto-grpc/pyproject.toml index b6d9e130661..967dcebe943 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/pyproject.toml +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/pyproject.toml @@ -7,7 +7,7 @@ name = "opentelemetry-exporter-otlp-proto-grpc" dynamic = ["version"] description = "OpenTelemetry Collector Protobuf over gRPC Exporter" readme = "README.rst" -license = "Apache-2.0" +license = {text = "Apache-2.0"} requires-python = ">=3.8" authors = [ { name = "OpenTelemetry Authors", email = "cncf-opentelemetry-contributors@lists.cncf.io" }, @@ -28,9 +28,9 @@ dependencies = [ "googleapis-common-protos ~= 1.52", "grpcio >= 1.0.0, < 2.0.0", "opentelemetry-api ~= 1.15", - "opentelemetry-proto == 1.24.0.dev", - "opentelemetry-sdk ~= 1.24.0.dev", - "opentelemetry-exporter-otlp-proto-common == 1.24.0.dev", + "opentelemetry-proto == 1.25.0.dev", + "opentelemetry-sdk ~= 1.25.0.dev", + "opentelemetry-exporter-otlp-proto-common == 1.25.0.dev", ] [project.optional-dependencies] diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/version.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/version.py index 8c35630f0e1..e8b404f0501 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/version.py +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.24.0.dev" +__version__ = "1.25.0.dev" diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/pyproject.toml b/exporter/opentelemetry-exporter-otlp-proto-http/pyproject.toml index 77a3bcb95b8..1e170528518 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/pyproject.toml +++ b/exporter/opentelemetry-exporter-otlp-proto-http/pyproject.toml @@ -7,7 +7,7 @@ name = "opentelemetry-exporter-otlp-proto-http" dynamic = ["version"] description = "OpenTelemetry Collector Protobuf over HTTP Exporter" readme = "README.rst" -license = "Apache-2.0" +license = {text = "Apache-2.0"} requires-python = ">=3.8" authors = [ { name = "OpenTelemetry Authors", email = "cncf-opentelemetry-contributors@lists.cncf.io" }, @@ -27,9 +27,9 @@ dependencies = [ "Deprecated >= 1.2.6", "googleapis-common-protos ~= 1.52", "opentelemetry-api ~= 1.15", - "opentelemetry-proto == 1.24.0.dev", - "opentelemetry-sdk ~= 1.24.0.dev", - "opentelemetry-exporter-otlp-proto-common == 1.24.0.dev", + "opentelemetry-proto == 1.25.0.dev", + "opentelemetry-sdk ~= 1.25.0.dev", + "opentelemetry-exporter-otlp-proto-common == 1.25.0.dev", "requests ~= 2.7", ] diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/version.py b/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/version.py index 8c35630f0e1..e8b404f0501 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/version.py +++ b/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.24.0.dev" +__version__ = "1.25.0.dev" diff --git a/exporter/opentelemetry-exporter-otlp/pyproject.toml b/exporter/opentelemetry-exporter-otlp/pyproject.toml index 89233037b00..d6aa3aa4cd8 100644 --- a/exporter/opentelemetry-exporter-otlp/pyproject.toml +++ b/exporter/opentelemetry-exporter-otlp/pyproject.toml @@ -7,7 +7,7 @@ name = "opentelemetry-exporter-otlp" dynamic = ["version"] description = "OpenTelemetry Collector Exporters" readme = "README.rst" -license = "Apache-2.0" +license = {text = "Apache-2.0"} requires-python = ">=3.8" authors = [ { name = "OpenTelemetry Authors", email = "cncf-opentelemetry-contributors@lists.cncf.io" }, @@ -25,13 +25,10 @@ classifiers = [ "Typing :: Typed", ] dependencies = [ - "opentelemetry-exporter-otlp-proto-grpc == 1.24.0.dev", - "opentelemetry-exporter-otlp-proto-http == 1.24.0.dev", + "opentelemetry-exporter-otlp-proto-grpc == 1.25.0.dev", + "opentelemetry-exporter-otlp-proto-http == 1.25.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/src/opentelemetry/exporter/otlp/version.py b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/version.py index 8c35630f0e1..e8b404f0501 100644 --- a/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/version.py +++ b/exporter/opentelemetry-exporter-otlp/src/opentelemetry/exporter/otlp/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.24.0.dev" +__version__ = "1.25.0.dev" 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 3117ee6afbb..6fdb327124f 100644 --- a/exporter/opentelemetry-exporter-prometheus/pyproject.toml +++ b/exporter/opentelemetry-exporter-prometheus/pyproject.toml @@ -7,7 +7,7 @@ name = "opentelemetry-exporter-prometheus" dynamic = ["version"] description = "Prometheus Metric Exporter for OpenTelemetry" readme = "README.rst" -license = "Apache-2.0" +license = {text = "Apache-2.0"} requires-python = ">=3.8" authors = [ { name = "OpenTelemetry Authors", email = "cncf-opentelemetry-contributors@lists.cncf.io" }, @@ -26,7 +26,7 @@ classifiers = [ dependencies = [ "opentelemetry-api ~= 1.12", # DONOTMERGE: confirm that this will becomes ~= 1.21 in the next release - "opentelemetry-sdk ~= 1.24.0.dev", + "opentelemetry-sdk ~= 1.25.0.dev", "prometheus_client >= 0.5.0, < 1.0.0", ] diff --git a/exporter/opentelemetry-exporter-prometheus/src/opentelemetry/exporter/prometheus/version.py b/exporter/opentelemetry-exporter-prometheus/src/opentelemetry/exporter/prometheus/version.py index 2b23bc49941..ff4933b20b8 100644 --- a/exporter/opentelemetry-exporter-prometheus/src/opentelemetry/exporter/prometheus/version.py +++ b/exporter/opentelemetry-exporter-prometheus/src/opentelemetry/exporter/prometheus/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.45b0.dev" +__version__ = "0.46b0.dev" diff --git a/exporter/opentelemetry-exporter-zipkin-json/pyproject.toml b/exporter/opentelemetry-exporter-zipkin-json/pyproject.toml index 8d18ed5f568..ef34f2fc6ef 100644 --- a/exporter/opentelemetry-exporter-zipkin-json/pyproject.toml +++ b/exporter/opentelemetry-exporter-zipkin-json/pyproject.toml @@ -7,7 +7,7 @@ name = "opentelemetry-exporter-zipkin-json" dynamic = ["version"] description = "Zipkin Span JSON Exporter for OpenTelemetry" readme = "README.rst" -license = "Apache-2.0" +license = {text = "Apache-2.0"} requires-python = ">=3.8" authors = [ { name = "OpenTelemetry Authors", email = "cncf-opentelemetry-contributors@lists.cncf.io" }, diff --git a/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/json/version.py b/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/json/version.py index 8c35630f0e1..e8b404f0501 100644 --- a/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/json/version.py +++ b/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/json/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.24.0.dev" +__version__ = "1.25.0.dev" diff --git a/exporter/opentelemetry-exporter-zipkin-proto-http/pyproject.toml b/exporter/opentelemetry-exporter-zipkin-proto-http/pyproject.toml index 25e0c95877d..a934fc7edd1 100644 --- a/exporter/opentelemetry-exporter-zipkin-proto-http/pyproject.toml +++ b/exporter/opentelemetry-exporter-zipkin-proto-http/pyproject.toml @@ -7,7 +7,7 @@ name = "opentelemetry-exporter-zipkin-proto-http" dynamic = ["version"] description = "Zipkin Span Protobuf Exporter for OpenTelemetry" readme = "README.rst" -license = "Apache-2.0" +license = {text = "Apache-2.0"} requires-python = ">=3.8" authors = [ { name = "OpenTelemetry Authors", email = "cncf-opentelemetry-contributors@lists.cncf.io" }, @@ -26,7 +26,7 @@ classifiers = [ ] dependencies = [ "opentelemetry-api ~= 1.3", - "opentelemetry-exporter-zipkin-json == 1.24.0.dev", + "opentelemetry-exporter-zipkin-json == 1.25.0.dev", "opentelemetry-sdk ~= 1.11", "protobuf ~= 3.12", "requests ~= 2.7", diff --git a/exporter/opentelemetry-exporter-zipkin-proto-http/src/opentelemetry/exporter/zipkin/proto/http/version.py b/exporter/opentelemetry-exporter-zipkin-proto-http/src/opentelemetry/exporter/zipkin/proto/http/version.py index 8c35630f0e1..e8b404f0501 100644 --- a/exporter/opentelemetry-exporter-zipkin-proto-http/src/opentelemetry/exporter/zipkin/proto/http/version.py +++ b/exporter/opentelemetry-exporter-zipkin-proto-http/src/opentelemetry/exporter/zipkin/proto/http/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.24.0.dev" +__version__ = "1.25.0.dev" diff --git a/exporter/opentelemetry-exporter-zipkin/pyproject.toml b/exporter/opentelemetry-exporter-zipkin/pyproject.toml index 5710158de77..905a52fae7d 100644 --- a/exporter/opentelemetry-exporter-zipkin/pyproject.toml +++ b/exporter/opentelemetry-exporter-zipkin/pyproject.toml @@ -7,7 +7,7 @@ name = "opentelemetry-exporter-zipkin" dynamic = ["version"] description = "Zipkin Span Exporters for OpenTelemetry" readme = "README.rst" -license = "Apache-2.0" +license = {text = "Apache-2.0"} requires-python = ">=3.8" authors = [ { name = "OpenTelemetry Authors", email = "cncf-opentelemetry-contributors@lists.cncf.io" }, @@ -25,13 +25,10 @@ classifiers = [ "Typing :: Typed", ] dependencies = [ - "opentelemetry-exporter-zipkin-json == 1.24.0.dev", - "opentelemetry-exporter-zipkin-proto-http == 1.24.0.dev", + "opentelemetry-exporter-zipkin-json == 1.25.0.dev", + "opentelemetry-exporter-zipkin-proto-http == 1.25.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/src/opentelemetry/exporter/zipkin/version.py b/exporter/opentelemetry-exporter-zipkin/src/opentelemetry/exporter/zipkin/version.py index 8c35630f0e1..e8b404f0501 100644 --- a/exporter/opentelemetry-exporter-zipkin/src/opentelemetry/exporter/zipkin/version.py +++ b/exporter/opentelemetry-exporter-zipkin/src/opentelemetry/exporter/zipkin/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.24.0.dev" +__version__ = "1.25.0.dev" 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 cd9dc258b34..3f8f070992d 100644 --- a/opentelemetry-api/pyproject.toml +++ b/opentelemetry-api/pyproject.toml @@ -6,7 +6,7 @@ build-backend = "hatchling.build" name = "opentelemetry-api" description = "OpenTelemetry Python API" readme = "README.rst" -license = "Apache-2.0" +license = {text = "Apache-2.0"} requires-python = ">=3.8" authors = [ { name = "OpenTelemetry Authors", email = "cncf-opentelemetry-contributors@lists.cncf.io" }, diff --git a/opentelemetry-api/src/opentelemetry/metrics/_internal/__init__.py b/opentelemetry-api/src/opentelemetry/metrics/_internal/__init__.py index 2e6914f8e3c..1579a1a2445 100644 --- a/opentelemetry-api/src/opentelemetry/metrics/_internal/__init__.py +++ b/opentelemetry-api/src/opentelemetry/metrics/_internal/__init__.py @@ -41,6 +41,7 @@ """ +import warnings from abc import ABC, abstractmethod from logging import getLogger from os import environ @@ -385,8 +386,7 @@ def create_histogram( description: A description for this instrument and what it measures. """ - @abstractmethod - def create_gauge( + def create_gauge( # type: ignore # pylint: disable=no-self-use self, name: str, unit: str = "", @@ -400,6 +400,7 @@ def create_gauge( example, ``By`` for bytes. UCUM units are recommended. description: A description for this instrument and what it measures. """ + warnings.warn("create_gauge() is not implemented and will be a no-op") @abstractmethod def create_observable_gauge( 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/trace/span.py b/opentelemetry-api/src/opentelemetry/trace/span.py index 8201fdb251e..5d46ffcb4a9 100644 --- a/opentelemetry-api/src/opentelemetry/trace/span.py +++ b/opentelemetry-api/src/opentelemetry/trace/span.py @@ -169,7 +169,7 @@ def set_status( @abc.abstractmethod def record_exception( self, - exception: Exception, + exception: BaseException, attributes: types.Attributes = None, timestamp: typing.Optional[int] = None, escaped: bool = False, @@ -563,7 +563,7 @@ def set_status( def record_exception( self, - exception: Exception, + exception: BaseException, attributes: types.Attributes = None, timestamp: typing.Optional[int] = None, escaped: 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/src/opentelemetry/version.py b/opentelemetry-api/src/opentelemetry/version.py index 8c35630f0e1..e8b404f0501 100644 --- a/opentelemetry-api/src/opentelemetry/version.py +++ b/opentelemetry-api/src/opentelemetry/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.24.0.dev" +__version__ = "1.25.0.dev" diff --git a/opentelemetry-api/tests/metrics/test_meter.py b/opentelemetry-api/tests/metrics/test_meter.py index 8b427a73721..2226965521e 100644 --- a/opentelemetry-api/tests/metrics/test_meter.py +++ b/opentelemetry-api/tests/metrics/test_meter.py @@ -134,7 +134,6 @@ def test_create_gauge(self): """ self.assertTrue(hasattr(Meter, "create_gauge")) - self.assertTrue(Meter.create_gauge.__isabstractmethod__) def test_create_observable_gauge(self): """ diff --git a/opentelemetry-api/tests/metrics/test_subclass_instantiation.py b/opentelemetry-api/tests/metrics/test_subclass_instantiation.py new file mode 100644 index 00000000000..a5b68d1c063 --- /dev/null +++ b/opentelemetry-api/tests/metrics/test_subclass_instantiation.py @@ -0,0 +1,209 @@ +# 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 + +# NOTE: The tests in this file are intended to test the semver compatibility of the public API. +# Any tests that fail here indicate that the public API has changed in a way that is not backwards compatible. +# Either bump the major version of the API, or make the necessary changes to the API to remain semver compatible. + +from typing import Optional + +from opentelemetry.metrics import ( + Asynchronous, + Counter, + Histogram, + Instrument, + Meter, + MeterProvider, + ObservableCounter, + ObservableGauge, + ObservableUpDownCounter, + Synchronous, + UpDownCounter, + _Gauge, +) + + +class MeterProviderImplTest(MeterProvider): + def get_meter( + self, + name: str, + version: Optional[str] = None, + schema_url: Optional[str] = None, + ) -> Meter: + return super().get_meter(name, version, schema_url) + + +def test_meter_provider_subclass_instantiation(): + meter_provider = MeterProviderImplTest() + assert isinstance(meter_provider, MeterProvider) + + +class MeterImplTest(Meter): + def create_counter(self, name, description, **kwargs): + pass + + def create_up_down_counter(self, name, description, **kwargs): + pass + + def create_observable_counter(self, name, description, **kwargs): + pass + + def create_histogram(self, name, description, **kwargs): + pass + + def create_observable_gauge(self, name, description, **kwargs): + pass + + def create_observable_up_down_counter(self, name, description, **kwargs): + pass + + +def test_meter_subclass_instantiation(): + meter = MeterImplTest("subclass_test") + assert isinstance(meter, Meter) + + +class SynchronousImplTest(Synchronous): + def __init__( + self, name: str, unit: str = "", description: str = "" + ) -> None: + super().__init__(name, unit, description) + + +def test_synchronous_subclass_instantiation(): + synchronous = SynchronousImplTest("subclass_test") + assert isinstance(synchronous, Synchronous) + + +class AsynchronousImplTest(Asynchronous): + def __init__( + self, name: str, unit: str = "", description: str = "" + ) -> None: + super().__init__(name, unit, description) + + +def test_asynchronous_subclass_instantiation(): + asynchronous = AsynchronousImplTest("subclass_test") + assert isinstance(asynchronous, Asynchronous) + + +class CounterImplTest(Counter): + def __init__( + self, name: str, unit: str = "", description: str = "" + ) -> None: + super().__init__(name, unit, description) + + def add(self, amount: int, **kwargs): + pass + + +def test_counter_subclass_instantiation(): + counter = CounterImplTest("subclass_test") + assert isinstance(counter, Counter) + + +class UpDownCounterImplTest(UpDownCounter): + def __init__( + self, name: str, unit: str = "", description: str = "" + ) -> None: + super().__init__(name, unit, description) + + def add(self, amount: int, **kwargs): + pass + + +def test_up_down_counter_subclass_instantiation(): + up_down_counter = UpDownCounterImplTest("subclass_test") + assert isinstance(up_down_counter, UpDownCounter) + + +class ObservableCounterImplTest(ObservableCounter): + def __init__( + self, name: str, unit: str = "", description: str = "" + ) -> None: + super().__init__(name, unit, description) + + +def test_observable_counter_subclass_instantiation(): + observable_counter = ObservableCounterImplTest("subclass_test") + assert isinstance(observable_counter, ObservableCounter) + + +class HistogramImplTest(Histogram): + def __init__( + self, name: str, unit: str = "", description: str = "" + ) -> None: + super().__init__(name, unit, description) + + def record(self, amount: int, **kwargs): + pass + + +def test_histogram_subclass_instantiation(): + histogram = HistogramImplTest("subclass_test") + assert isinstance(histogram, Histogram) + + +class GaugeImplTest(_Gauge): + def __init__( + self, name: str, unit: str = "", description: str = "" + ) -> None: + super().__init__(name, unit, description) + + def set(self, amount: int, **kwargs): + pass + + +def test_gauge_subclass_instantiation(): + gauge = GaugeImplTest("subclass_test") + assert isinstance(gauge, _Gauge) + + +class InstrumentImplTest(Instrument): + def __init__( + self, name: str, unit: str = "", description: str = "" + ) -> None: + super().__init__(name, unit, description) + + +def test_instrument_subclass_instantiation(): + instrument = InstrumentImplTest("subclass_test") + assert isinstance(instrument, Instrument) + + +class ObservableGaugeImplTest(ObservableGauge): + def __init__( + self, name: str, unit: str = "", description: str = "" + ) -> None: + super().__init__(name, unit, description) + + +def test_observable_gauge_subclass_instantiation(): + observable_gauge = ObservableGaugeImplTest("subclass_test") + assert isinstance(observable_gauge, ObservableGauge) + + +class ObservableUpDownCounterImplTest(ObservableUpDownCounter): + def __init__( + self, name: str, unit: str = "", description: str = "" + ) -> None: + super().__init__(name, unit, description) + + +def test_observable_up_down_counter_subclass_instantiation(): + observable_up_down_counter = ObservableUpDownCounterImplTest( + "subclass_test" + ) + assert isinstance(observable_up_down_counter, ObservableUpDownCounter) 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 4a5ae1de5e0..a31deddcfc1 100644 --- a/opentelemetry-proto/pyproject.toml +++ b/opentelemetry-proto/pyproject.toml @@ -7,7 +7,7 @@ name = "opentelemetry-proto" dynamic = ["version"] description = "OpenTelemetry Python Proto" readme = "README.rst" -license = "Apache-2.0" +license = {text = "Apache-2.0"} requires-python = ">=3.8" authors = [ { name = "OpenTelemetry Authors", email = "cncf-opentelemetry-contributors@lists.cncf.io" }, diff --git a/opentelemetry-proto/src/opentelemetry/proto/version.py b/opentelemetry-proto/src/opentelemetry/proto/version.py index 8c35630f0e1..e8b404f0501 100644 --- a/opentelemetry-proto/src/opentelemetry/proto/version.py +++ b/opentelemetry-proto/src/opentelemetry/proto/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.24.0.dev" +__version__ = "1.25.0.dev" diff --git a/opentelemetry-sdk/pyproject.toml b/opentelemetry-sdk/pyproject.toml index e8718e2d679..25568d42c6d 100644 --- a/opentelemetry-sdk/pyproject.toml +++ b/opentelemetry-sdk/pyproject.toml @@ -7,7 +7,7 @@ name = "opentelemetry-sdk" dynamic = ["version"] description = "OpenTelemetry Python SDK" readme = "README.rst" -license = "Apache-2.0" +license = {text = "Apache-2.0"} requires-python = ">=3.8" authors = [ { name = "OpenTelemetry Authors", email = "cncf-opentelemetry-contributors@lists.cncf.io" }, @@ -25,8 +25,8 @@ classifiers = [ "Typing :: Typed", ] dependencies = [ - "opentelemetry-api == 1.24.0.dev", - "opentelemetry-semantic-conventions == 0.45b0.dev", + "opentelemetry-api == 1.25.0.dev", + "opentelemetry-semantic-conventions == 0.46b0.dev", "typing-extensions >= 3.7.4", ] diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py index d84c9919608..8ba0dae6f2e 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py @@ -37,6 +37,7 @@ from opentelemetry.sdk.environment_variables import ( OTEL_ATTRIBUTE_COUNT_LIMIT, OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT, + OTEL_SDK_DISABLED, ) from opentelemetry.sdk.resources import Resource from opentelemetry.sdk.util import ns_to_iso_str @@ -607,6 +608,8 @@ def __init__( self._multi_log_record_processor = ( multi_log_record_processor or SynchronousMultiLogRecordProcessor() ) + disabled = environ.get(OTEL_SDK_DISABLED, "") + self._disabled = disabled.lower().strip() == "true" self._at_exit_handler = None if shutdown_on_exit: self._at_exit_handler = atexit.register(self.shutdown) @@ -621,6 +624,9 @@ def get_logger( version: Optional[str] = None, schema_url: Optional[str] = None, ) -> Logger: + if self._disabled: + _logger.warning("SDK is disabled.") + return NoOpLogger(name, version=version, schema_url=schema_url) return Logger( self._resource, self._multi_log_record_processor, diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/environment_variables.py b/opentelemetry-sdk/src/opentelemetry/sdk/environment_variables.py index a69e451cbb8..6557d2a1391 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/environment_variables.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/environment_variables.py @@ -12,6 +12,14 @@ # See the License for the specific language governing permissions and # limitations under the License. +OTEL_SDK_DISABLED = "OTEL_SDK_DISABLED" +""" +.. envvar:: OTEL_SDK_DISABLED + +The :envvar:`OTEL_SDK_DISABLED` environment variable disables the SDK for all signals +Default: "false" +""" + OTEL_RESOURCE_ATTRIBUTES = "OTEL_RESOURCE_ATTRIBUTES" """ .. envvar:: OTEL_RESOURCE_ATTRIBUTES diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/__init__.py index 9b5aac16143..908d8f81cf8 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/__init__.py @@ -14,6 +14,7 @@ from atexit import register, unregister from logging import getLogger +from os import environ from threading import Lock from time import time_ns from typing import Optional, Sequence @@ -32,6 +33,7 @@ ) from opentelemetry.metrics import UpDownCounter as APIUpDownCounter from opentelemetry.metrics import _Gauge as APIGauge +from opentelemetry.sdk.environment_variables import OTEL_SDK_DISABLED from opentelemetry.sdk.metrics._internal.exceptions import MetricsTimeoutError from opentelemetry.sdk.metrics._internal.instrument import ( _Counter, @@ -394,6 +396,8 @@ def __init__( self._measurement_consumer = SynchronousMeasurementConsumer( sdk_config=self._sdk_config ) + disabled = environ.get(OTEL_SDK_DISABLED, "") + self._disabled = disabled.lower().strip() == "true" if shutdown_on_exit: self._atexit_handler = register(self.shutdown) @@ -512,6 +516,10 @@ def get_meter( schema_url: Optional[str] = None, ) -> Meter: + if self._disabled: + _logger.warning("SDK is disabled.") + return NoOpMeter(name, version=version, schema_url=schema_url) + if self._shutdown: _logger.warning( "A shutdown `MeterProvider` can not provide a `Meter`" diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py index f937ece8958..0110a5c0e05 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 @@ -31,6 +30,7 @@ Dict, Iterator, List, + MutableMapping, Optional, Sequence, Tuple, @@ -50,6 +50,7 @@ OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT, OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT, OTEL_LINK_ATTRIBUTE_COUNT_LIMIT, + OTEL_SDK_DISABLED, OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT, OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT, OTEL_SPAN_EVENT_COUNT_LIMIT, @@ -63,9 +64,10 @@ InstrumentationInfo, InstrumentationScope, ) -from opentelemetry.trace import SpanContext +from opentelemetry.trace import NoOpTracer, SpanContext from opentelemetry.trace.status import Status, StatusCode from opentelemetry.util import types +from opentelemetry.util._decorator import _agnosticcontextmanager logger = logging.getLogger(__name__) @@ -744,17 +746,17 @@ def __init__( parent: Optional[trace_api.SpanContext] = None, sampler: Optional[sampling.Sampler] = None, trace_config: None = None, # TODO - resource: Resource = None, + resource: Optional[Resource] = None, attributes: types.Attributes = None, - events: Sequence[Event] = None, + events: Optional[Sequence[Event]] = None, links: Sequence[trace_api.Link] = (), kind: trace_api.SpanKind = trace_api.SpanKind.INTERNAL, span_processor: SpanProcessor = SpanProcessor(), - instrumentation_info: InstrumentationInfo = None, + instrumentation_info: Optional[InstrumentationInfo] = None, record_exception: bool = True, set_status_on_exception: bool = True, limits=_UnsetLimits, - instrumentation_scope: InstrumentationScope = None, + instrumentation_scope: Optional[InstrumentationScope] = None, ) -> None: if resource is None: resource = Resource.create({}) @@ -981,20 +983,19 @@ def __exit__( def record_exception( self, - exception: Exception, + exception: BaseException, attributes: types.Attributes = None, timestamp: Optional[int] = None, escaped: bool = False, ) -> None: """Records an exception as a span event.""" - try: - stacktrace = traceback.format_exc() - except Exception: # pylint: disable=broad-except - # workaround for python 3.4, format_exc can raise - # an AttributeError if the __context__ on - # an exception is None - stacktrace = "Exception occurred on stacktrace formatting" - _attributes = { + # TODO: keep only exception as first argument after baseline is 3.10 + stacktrace = "".join( + traceback.format_exception( + type(exception), value=exception, tb=exception.__traceback__ + ) + ) + _attributes: MutableMapping[str, types.AttributeValue] = { "exception.type": exception.__class__.__name__, "exception.message": str(exception), "exception.stacktrace": stacktrace, @@ -1038,14 +1039,14 @@ 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, context: Optional[context_api.Context] = None, kind: trace_api.SpanKind = trace_api.SpanKind.INTERNAL, attributes: types.Attributes = None, - links: Sequence[trace_api.Link] = (), + links: Optional[Sequence[trace_api.Link]] = (), start_time: Optional[int] = None, record_exception: bool = True, set_status_on_exception: bool = True, @@ -1075,7 +1076,7 @@ def start_span( # pylint: disable=too-many-locals context: Optional[context_api.Context] = None, kind: trace_api.SpanKind = trace_api.SpanKind.INTERNAL, attributes: types.Attributes = None, - links: Sequence[trace_api.Link] = (), + links: Optional[Sequence[trace_api.Link]] = (), start_time: Optional[int] = None, record_exception: bool = True, set_status_on_exception: bool = True, @@ -1152,15 +1153,15 @@ class TracerProvider(trace_api.TracerProvider): def __init__( self, - sampler: sampling.Sampler = None, - resource: Resource = None, + sampler: Optional[sampling.Sampler] = None, + resource: Optional[Resource] = None, shutdown_on_exit: bool = True, active_span_processor: Union[ - SynchronousMultiSpanProcessor, ConcurrentMultiSpanProcessor + SynchronousMultiSpanProcessor, ConcurrentMultiSpanProcessor, None ] = None, - id_generator: IdGenerator = None, - span_limits: SpanLimits = None, - ): + id_generator: Optional[IdGenerator] = None, + span_limits: Optional[SpanLimits] = None, + ) -> None: self._active_span_processor = ( active_span_processor or SynchronousMultiSpanProcessor() ) @@ -1176,6 +1177,8 @@ def __init__( sampler = sampling._get_from_env_or_default() self.sampler = sampler self._span_limits = span_limits or SpanLimits() + disabled = environ.get(OTEL_SDK_DISABLED, "") + self._disabled = disabled.lower().strip() == "true" self._atexit_handler = None if shutdown_on_exit: @@ -1191,6 +1194,9 @@ def get_tracer( instrumenting_library_version: typing.Optional[str] = None, schema_url: typing.Optional[str] = None, ) -> "trace_api.Tracer": + if self._disabled: + logger.warning("SDK is disabled.") + return NoOpTracer() if not instrumenting_module_name: # Reject empty strings too. instrumenting_module_name = "" logger.error("get_tracer called with missing module name.") diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/sampling.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/sampling.py index 0236fac6b62..40e142ea1a9 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/sampling.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/sampling.py @@ -184,7 +184,7 @@ def __init__( self, decision: Decision, attributes: "Attributes" = None, - trace_state: "TraceState" = None, + trace_state: Optional["TraceState"] = None, ) -> None: self.decision = decision if attributes is None: @@ -201,10 +201,10 @@ def should_sample( parent_context: Optional["Context"], trace_id: int, name: str, - kind: SpanKind = None, + kind: Optional[SpanKind] = None, attributes: Attributes = None, - links: Sequence["Link"] = None, - trace_state: "TraceState" = None, + links: Optional[Sequence["Link"]] = None, + trace_state: Optional["TraceState"] = None, ) -> "SamplingResult": pass @@ -216,7 +216,7 @@ def get_description(self) -> str: class StaticSampler(Sampler): """Sampler that always returns the same decision.""" - def __init__(self, decision: "Decision"): + def __init__(self, decision: "Decision") -> None: self._decision = decision def should_sample( @@ -224,10 +224,10 @@ def should_sample( parent_context: Optional["Context"], trace_id: int, name: str, - kind: SpanKind = None, + kind: Optional[SpanKind] = None, attributes: Attributes = None, - links: Sequence["Link"] = None, - trace_state: "TraceState" = None, + links: Optional[Sequence["Link"]] = None, + trace_state: Optional["TraceState"] = None, ) -> "SamplingResult": if self._decision is Decision.DROP: attributes = None @@ -285,10 +285,10 @@ def should_sample( parent_context: Optional["Context"], trace_id: int, name: str, - kind: SpanKind = None, + kind: Optional[SpanKind] = None, attributes: Attributes = None, - links: Sequence["Link"] = None, - trace_state: "TraceState" = None, + links: Optional[Sequence["Link"]] = None, + trace_state: Optional["TraceState"] = None, ) -> "SamplingResult": decision = Decision.DROP if trace_id & self.TRACE_ID_LIMIT < self.bound: @@ -340,10 +340,10 @@ def should_sample( parent_context: Optional["Context"], trace_id: int, name: str, - kind: SpanKind = None, + kind: Optional[SpanKind] = None, attributes: Attributes = None, - links: Sequence["Link"] = None, - trace_state: "TraceState" = None, + links: Optional[Sequence["Link"]] = None, + trace_state: Optional["TraceState"] = None, ) -> "SamplingResult": parent_span_context = get_current_span( parent_context @@ -443,7 +443,9 @@ def _get_from_env_or_default() -> Sampler: return _KNOWN_SAMPLERS[trace_sampler] -def _get_parent_trace_state(parent_context) -> Optional["TraceState"]: +def _get_parent_trace_state( + parent_context: Optional[Context], +) -> Optional["TraceState"]: parent_span_context = get_current_span(parent_context).get_span_context() if parent_span_context is None or not parent_span_context.is_valid: return None diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/version.py b/opentelemetry-sdk/src/opentelemetry/sdk/version.py index 8c35630f0e1..e8b404f0501 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/version.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.24.0.dev" +__version__ = "1.25.0.dev" diff --git a/opentelemetry-sdk/tests/logs/test_logs.py b/opentelemetry-sdk/tests/logs/test_logs.py index 935b5ee2493..71098531d4f 100644 --- a/opentelemetry-sdk/tests/logs/test_logs.py +++ b/opentelemetry-sdk/tests/logs/test_logs.py @@ -15,12 +15,14 @@ # pylint: disable=protected-access import unittest -from unittest.mock import patch +from unittest.mock import Mock, patch from opentelemetry.sdk._logs import LoggerProvider from opentelemetry.sdk._logs._internal import ( + NoOpLogger, SynchronousMultiLogRecordProcessor, ) +from opentelemetry.sdk.environment_variables import OTEL_SDK_DISABLED from opentelemetry.sdk.resources import Resource @@ -61,6 +63,11 @@ def test_get_logger(self): logger._instrumentation_scope.schema_url, "schema_url" ) + @patch.dict("os.environ", {OTEL_SDK_DISABLED: "true"}) + def test_get_logger_with_sdk_disabled(self): + logger = LoggerProvider().get_logger(Mock()) + self.assertIsInstance(logger, NoOpLogger) + @patch.object(Resource, "create") def test_logger_provider_init(self, resource_patch): logger_provider = LoggerProvider() diff --git a/opentelemetry-sdk/tests/metrics/test_metrics.py b/opentelemetry-sdk/tests/metrics/test_metrics.py index 6232e072e23..199305005b3 100644 --- a/opentelemetry-sdk/tests/metrics/test_metrics.py +++ b/opentelemetry-sdk/tests/metrics/test_metrics.py @@ -19,6 +19,7 @@ from unittest.mock import MagicMock, Mock, patch from opentelemetry.metrics import NoOpMeter +from opentelemetry.sdk.environment_variables import OTEL_SDK_DISABLED from opentelemetry.sdk.metrics import ( Counter, Histogram, @@ -465,6 +466,11 @@ def test_create_observable_up_down_counter(self): ) self.assertEqual(observable_up_down_counter.name, "name") + @patch.dict("os.environ", {OTEL_SDK_DISABLED: "true"}) + def test_get_meter_with_sdk_disabled(self): + meter_provider = MeterProvider() + self.assertIsInstance(meter_provider.get_meter(Mock()), NoOpMeter) + class InMemoryMetricExporter(MetricExporter): def __init__(self): diff --git a/opentelemetry-sdk/tests/trace/test_trace.py b/opentelemetry-sdk/tests/trace/test_trace.py index 40f4f4b3162..5441bed6dd7 100644 --- a/opentelemetry-sdk/tests/trace/test_trace.py +++ b/opentelemetry-sdk/tests/trace/test_trace.py @@ -13,6 +13,7 @@ # limitations under the License. # pylint: disable=too-many-lines +# pylint: disable=no-member import shutil import subprocess @@ -33,6 +34,7 @@ OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT, OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT, OTEL_LINK_ATTRIBUTE_COUNT_LIMIT, + OTEL_SDK_DISABLED, OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT, OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT, OTEL_SPAN_EVENT_COUNT_LIMIT, @@ -162,6 +164,13 @@ def test_tracer_provider_accepts_concurrent_multi_span_processor(self): span_processor, tracer_provider._active_span_processor ) + @mock.patch.dict("os.environ", {OTEL_SDK_DISABLED: "true"}) + def test_get_tracer_with_sdk_disabled(self): + tracer_provider = trace.TracerProvider() + self.assertIsInstance( + tracer_provider.get_tracer(Mock()), trace_api.NoOpTracer + ) + class TestTracerSampling(unittest.TestCase): def tearDown(self): @@ -1283,6 +1292,23 @@ def test_record_exception_context_manager(self): finally: self.assertEqual(len(span.events), 0) + def test_record_exception_out_of_scope(self): + span = trace._Span("name", mock.Mock(spec=trace_api.SpanContext)) + out_of_scope_exception = ValueError("invalid") + span.record_exception(out_of_scope_exception) + exception_event = span.events[0] + self.assertEqual("exception", exception_event.name) + self.assertEqual( + "invalid", exception_event.attributes["exception.message"] + ) + self.assertEqual( + "ValueError", exception_event.attributes["exception.type"] + ) + self.assertIn( + "ValueError: invalid", + exception_event.attributes["exception.stacktrace"], + ) + def span_event_start_fmt(span_processor_name, span_name): return span_processor_name + ":" + span_name + ":start" diff --git a/opentelemetry-semantic-conventions/pyproject.toml b/opentelemetry-semantic-conventions/pyproject.toml index 290c54b3704..876fb94a985 100644 --- a/opentelemetry-semantic-conventions/pyproject.toml +++ b/opentelemetry-semantic-conventions/pyproject.toml @@ -7,7 +7,7 @@ name = "opentelemetry-semantic-conventions" dynamic = ["version"] description = "OpenTelemetry Semantic Conventions" readme = "README.rst" -license = "Apache-2.0" +license = {text = "Apache-2.0"} requires-python = ">=3.8" authors = [ { name = "OpenTelemetry Authors", email = "cncf-opentelemetry-contributors@lists.cncf.io" }, diff --git a/opentelemetry-semantic-conventions/src/opentelemetry/semconv/version.py b/opentelemetry-semantic-conventions/src/opentelemetry/semconv/version.py index 2b23bc49941..ff4933b20b8 100644 --- a/opentelemetry-semantic-conventions/src/opentelemetry/semconv/version.py +++ b/opentelemetry-semantic-conventions/src/opentelemetry/semconv/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.45b0.dev" +__version__ = "0.46b0.dev" diff --git a/propagator/opentelemetry-propagator-b3/pyproject.toml b/propagator/opentelemetry-propagator-b3/pyproject.toml index 736006e74e4..dede9efaa93 100644 --- a/propagator/opentelemetry-propagator-b3/pyproject.toml +++ b/propagator/opentelemetry-propagator-b3/pyproject.toml @@ -7,7 +7,7 @@ name = "opentelemetry-propagator-b3" dynamic = ["version"] description = "OpenTelemetry B3 Propagator" readme = "README.rst" -license = "Apache-2.0" +license = {text = "Apache-2.0"} requires-python = ">=3.8" authors = [ { name = "OpenTelemetry Authors", email = "cncf-opentelemetry-contributors@lists.cncf.io" }, diff --git a/propagator/opentelemetry-propagator-b3/src/opentelemetry/propagators/b3/version.py b/propagator/opentelemetry-propagator-b3/src/opentelemetry/propagators/b3/version.py index 8c35630f0e1..e8b404f0501 100644 --- a/propagator/opentelemetry-propagator-b3/src/opentelemetry/propagators/b3/version.py +++ b/propagator/opentelemetry-propagator-b3/src/opentelemetry/propagators/b3/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.24.0.dev" +__version__ = "1.25.0.dev" diff --git a/propagator/opentelemetry-propagator-jaeger/pyproject.toml b/propagator/opentelemetry-propagator-jaeger/pyproject.toml index b716925f439..df8df9a98f8 100644 --- a/propagator/opentelemetry-propagator-jaeger/pyproject.toml +++ b/propagator/opentelemetry-propagator-jaeger/pyproject.toml @@ -7,7 +7,7 @@ name = "opentelemetry-propagator-jaeger" dynamic = ["version"] description = "OpenTelemetry Jaeger Propagator" readme = "README.rst" -license = "Apache-2.0" +license = {text = "Apache-2.0"} requires-python = ">=3.8" authors = [ { name = "OpenTelemetry Authors", email = "cncf-opentelemetry-contributors@lists.cncf.io" }, diff --git a/propagator/opentelemetry-propagator-jaeger/src/opentelemetry/propagators/jaeger/version.py b/propagator/opentelemetry-propagator-jaeger/src/opentelemetry/propagators/jaeger/version.py index 8c35630f0e1..e8b404f0501 100644 --- a/propagator/opentelemetry-propagator-jaeger/src/opentelemetry/propagators/jaeger/version.py +++ b/propagator/opentelemetry-propagator-jaeger/src/opentelemetry/propagators/jaeger/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.24.0.dev" +__version__ = "1.25.0.dev" diff --git a/scripts/build.sh b/scripts/build.sh index 46b6f1289f2..4a049b23fe3 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -8,13 +8,13 @@ set -ev # Get the latest versions of packaging tools python3 -m pip install --upgrade pip build setuptools wheel -BASEDIR=$(dirname $(readlink -f $(dirname $0))) +BASEDIR=$(dirname "$(readlink -f "$(dirname $0)")") DISTDIR=dist ( cd $BASEDIR mkdir -p $DISTDIR - rm -rf $DISTDIR/* + rm -rf ${DISTDIR:?}/* for d in opentelemetry-api/ opentelemetry-sdk/ opentelemetry-proto/ opentelemetry-semantic-conventions/ exporter/*/ shim/opentelemetry-opentracing-shim/ propagator/*/ tests/opentelemetry-test-utils/; do ( diff --git a/scripts/coverage.sh b/scripts/coverage.sh index 56cbc78dde5..99dce848782 100755 --- a/scripts/coverage.sh +++ b/scripts/coverage.sh @@ -22,9 +22,6 @@ function cov { fi } -PYTHON_VERSION=$(python -c 'import sys; print(".".join(map(str, sys.version_info[:3])))') -PYTHON_VERSION_INFO=(${PYTHON_VERSION//./ }) - coverage erase cov opentelemetry-api diff --git a/shim/opentelemetry-opencensus-shim/pyproject.toml b/shim/opentelemetry-opencensus-shim/pyproject.toml index be92937faed..85f97848097 100644 --- a/shim/opentelemetry-opencensus-shim/pyproject.toml +++ b/shim/opentelemetry-opencensus-shim/pyproject.toml @@ -7,7 +7,7 @@ name = "opentelemetry-opencensus-shim" dynamic = ["version"] description = "OpenCensus Shim for OpenTelemetry" readme = "README.rst" -license = "Apache-2.0" +license = {text = "Apache-2.0"} requires-python = ">=3.8" authors = [ { name = "OpenTelemetry Authors", email = "cncf-opentelemetry-contributors@lists.cncf.io" }, diff --git a/shim/opentelemetry-opencensus-shim/src/opentelemetry/shim/opencensus/version.py b/shim/opentelemetry-opencensus-shim/src/opentelemetry/shim/opencensus/version.py index 2b23bc49941..ff4933b20b8 100644 --- a/shim/opentelemetry-opencensus-shim/src/opentelemetry/shim/opencensus/version.py +++ b/shim/opentelemetry-opencensus-shim/src/opentelemetry/shim/opencensus/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.45b0.dev" +__version__ = "0.46b0.dev" diff --git a/shim/opentelemetry-opentracing-shim/pyproject.toml b/shim/opentelemetry-opentracing-shim/pyproject.toml index 79507939f4c..0a91ffd7acc 100644 --- a/shim/opentelemetry-opentracing-shim/pyproject.toml +++ b/shim/opentelemetry-opentracing-shim/pyproject.toml @@ -7,7 +7,7 @@ name = "opentelemetry-opentracing-shim" dynamic = ["version"] description = "OpenTracing Shim for OpenTelemetry" readme = "README.rst" -license = "Apache-2.0" +license = {text = "Apache-2.0"} requires-python = ">=3.8" authors = [ { name = "OpenTelemetry Authors", email = "cncf-opentelemetry-contributors@lists.cncf.io" }, diff --git a/shim/opentelemetry-opentracing-shim/src/opentelemetry/shim/opentracing_shim/version.py b/shim/opentelemetry-opentracing-shim/src/opentelemetry/shim/opentracing_shim/version.py index 2b23bc49941..ff4933b20b8 100644 --- a/shim/opentelemetry-opentracing-shim/src/opentelemetry/shim/opentracing_shim/version.py +++ b/shim/opentelemetry-opentracing-shim/src/opentelemetry/shim/opentracing_shim/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.45b0.dev" +__version__ = "0.46b0.dev" diff --git a/tests/opentelemetry-test-utils/pyproject.toml b/tests/opentelemetry-test-utils/pyproject.toml index 6978ba5e22c..e4547b6e340 100644 --- a/tests/opentelemetry-test-utils/pyproject.toml +++ b/tests/opentelemetry-test-utils/pyproject.toml @@ -7,7 +7,7 @@ name = "opentelemetry-test-utils" dynamic = ["version"] description = "Test utilities for OpenTelemetry unit tests" readme = "README.rst" -license = "Apache-2.0" +license = {text = "Apache-2.0"} requires-python = ">=3.8" authors = [ { name = "OpenTelemetry Authors", email = "cncf-opentelemetry-contributors@lists.cncf.io" }, @@ -24,8 +24,8 @@ classifiers = [ ] dependencies = [ "asgiref ~= 3.0", - "opentelemetry-api == 1.24.0.dev", - "opentelemetry-sdk == 1.24.0.dev", + "opentelemetry-api == 1.25.0.dev", + "opentelemetry-sdk == 1.25.0.dev", ] [project.urls] diff --git a/tests/opentelemetry-test-utils/src/opentelemetry/test/version.py b/tests/opentelemetry-test-utils/src/opentelemetry/test/version.py index ef9e7fdbaf9..e38c2cb2e40 100644 --- a/tests/opentelemetry-test-utils/src/opentelemetry/test/version.py +++ b/tests/opentelemetry-test-utils/src/opentelemetry/test/version.py @@ -1 +1 @@ -__version__ = "0.45b0.dev" +__version__ = "0.46b0.dev" diff --git a/tox.ini b/tox.ini index 3f4c9434c0f..2b82d804dc9 100644 --- a/tox.ini +++ b/tox.ini @@ -122,11 +122,7 @@ commands_pre = 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 @@ -141,9 +137,7 @@ commands_pre = 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 -r {toxinidir}/exporter/opentelemetry-exporter-zipkin-proto-http/test-requirements.txt @@ -214,7 +208,6 @@ commands_pre = pip install -r {toxinidir}/opentelemetry-api/test-requirements.txt pip install -r {toxinidir}/opentelemetry-sdk/test-requirements.txt pip install -r {toxinidir}/opentelemetry-semantic-conventions/test-requirements.txt - python -m pip install -e {toxinidir}/opentelemetry-proto[test] 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 @@ -223,11 +216,11 @@ commands_pre = 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] pip install -r {toxinidir}/exporter/opentelemetry-exporter-otlp-proto-http/test-requirements-1.txt - python -m pip install -e {toxinidir}/exporter/opentelemetry-exporter-otlp[test] 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 - python -m pip install -e {toxinidir}/exporter/opentelemetry-exporter-zipkin[test] + 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