diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 14b8db0a5a5..404b1cb4853 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,7 +10,14 @@ 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: 36275f3cbf00c2021caa1d922bd98215c50b9af3 + CONTRIB_REPO_SHA: 4a4d889b1876323d7f70507b5e4d079f454fe0d6 + # 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 + # contrib builds are run directly from contrib (since test.yml is executed, which sets CORE_REPO_SHA) + # The solution is to include CORE_REPO_SHA as part of THIS environment so it can be accessed + # from within the contrib build. + CORE_REPO_SHA: ${{ github.sha }} jobs: build: @@ -104,19 +111,19 @@ jobs: key: v2-tox-cache-${{ matrix.tox-environment }}-${{ hashFiles('tox.ini', 'dev-requirements.txt') }}-core - name: run tox run: tox -e ${{ matrix.tox-environment }} + + # Contrib unit test suite in order to ensure changes in core do not break anything in contrib. + # We only run contrib unit tests on the oldest supported Python version (3.6) as running the same tests + # on all versions is somewhat redundant. contrib-build: env: # We use these variables to convert between tox and GHA version literals py36: 3.6 - py37: 3.7 - py38: 3.8 - py39: 3.9 - pypy3: pypy3 runs-on: ${{ matrix.os }} strategy: fail-fast: false # ensures the entire test matrix is run, even if one permutation fails matrix: - python-version: [ py36, py37, py38, py39, pypy3 ] + python-version: [ py36 ] package: ["instrumentation", "exporter"] os: [ ubuntu-20.04] steps: @@ -147,38 +154,3 @@ jobs: key: v2-tox-cache-${{ matrix.python-version }}-${{ matrix.package }}-${{ matrix.os }}-${{ hashFiles('tox.ini', 'dev-requirements.txt') }}-contrib - name: run tox run: tox -f ${{ matrix.python-version }}-${{ matrix.package }} - contrib-misc: - strategy: - fail-fast: false - matrix: - tox-environment: [ "docker-tests"] - name: ${{ matrix.tox-environment }} - runs-on: ubuntu-20.04 - steps: - - name: Checkout Contrib Repo @ SHA - ${{ env.CONTRIB_REPO_SHA }} - uses: actions/checkout@v2 - with: - repository: open-telemetry/opentelemetry-python-contrib - ref: ${{ env.CONTRIB_REPO_SHA }} - - name: Checkout Core Repo @ SHA ${{ github.sha }} - uses: actions/checkout@v2 - with: - repository: open-telemetry/opentelemetry-python - path: opentelemetry-python-core - - name: Set up Python - uses: actions/setup-python@v2 - with: - python-version: 3.9 - architecture: 'x64' - - name: Install tox - run: pip install -U tox - - name: Cache tox environment - # Preserves .tox directory between runs for faster installs - uses: actions/cache@v2 - with: - path: | - .tox - ~/.cache/pip - key: v2-tox-cache-${{ matrix.tox-environment }}-${{ hashFiles('tox.ini', 'dev-requirements.txt') }}-contrib - - name: run tox - run: tox -e ${{ matrix.tox-environment }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b99cf87218..52eb2166509 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,13 +4,15 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased](https://github.com/open-telemetry/opentelemetry-python/compare/v1.5.0-0.24b0...HEAD) -<<<<<<< HEAD +## [Unreleased](https://github.com/open-telemetry/opentelemetry-python/compare/v1.6.0-0.25b0...HEAD) - Make Measurement a concrete class ([#2153](https://github.com/open-telemetry/opentelemetry-python/pull/2153)) - Add metrics API ([#1887](https://github.com/open-telemetry/opentelemetry-python/pull/1887)) + +## [1.6.0-0.25b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.6.0-0.25b0) - 2021-10-13 + - Fix race in `set_tracer_provider()` ([#2182](https://github.com/open-telemetry/opentelemetry-python/pull/2182)) - Automatically load OTEL environment variables as options for `opentelemetry-instrument` @@ -39,6 +41,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#2145](https://github.com/open-telemetry/opentelemetry-python/pull/2145)) - Add `schema_url` to `TracerProvider.get_tracer` ([#2154](https://github.com/open-telemetry/opentelemetry-python/pull/2154)) +- Make baggage implementation w3c spec complaint + ([#2167](https://github.com/open-telemetry/opentelemetry-python/pull/2167)) +- Add name to `BatchSpanProcessor` worker thread + ([#2186](https://github.com/open-telemetry/opentelemetry-python/pull/2186)) ## [1.5.0-0.24b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.5.0-0.24b0) - 2021-08-26 diff --git a/eachdist.ini b/eachdist.ini index 065c543e94f..548d6d36e0a 100644 --- a/eachdist.ini +++ b/eachdist.ini @@ -12,7 +12,7 @@ sortfirst= exporter/* [stable] -version=1.5.0 +version=1.6.0 packages= opentelemetry-sdk @@ -31,7 +31,7 @@ packages= opentelemetry-api [prerelease] -version=0.24b0 +version=0.25b0 packages= opentelemetry-opentracing-shim diff --git a/exporter/opentelemetry-exporter-jaeger-proto-grpc/src/opentelemetry/exporter/jaeger/proto/grpc/version.py b/exporter/opentelemetry-exporter-jaeger-proto-grpc/src/opentelemetry/exporter/jaeger/proto/grpc/version.py index 14cffddd57a..7373c3ac09b 100644 --- a/exporter/opentelemetry-exporter-jaeger-proto-grpc/src/opentelemetry/exporter/jaeger/proto/grpc/version.py +++ b/exporter/opentelemetry-exporter-jaeger-proto-grpc/src/opentelemetry/exporter/jaeger/proto/grpc/version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.5.0" +__version__ = "1.6.0" diff --git a/exporter/opentelemetry-exporter-jaeger-thrift/src/opentelemetry/exporter/jaeger/thrift/version.py b/exporter/opentelemetry-exporter-jaeger-thrift/src/opentelemetry/exporter/jaeger/thrift/version.py index 14cffddd57a..7373c3ac09b 100644 --- a/exporter/opentelemetry-exporter-jaeger-thrift/src/opentelemetry/exporter/jaeger/thrift/version.py +++ b/exporter/opentelemetry-exporter-jaeger-thrift/src/opentelemetry/exporter/jaeger/thrift/version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.5.0" +__version__ = "1.6.0" diff --git a/exporter/opentelemetry-exporter-jaeger/setup.cfg b/exporter/opentelemetry-exporter-jaeger/setup.cfg index e882a65f975..91f4c8ba9b1 100644 --- a/exporter/opentelemetry-exporter-jaeger/setup.cfg +++ b/exporter/opentelemetry-exporter-jaeger/setup.cfg @@ -39,8 +39,8 @@ python_requires = >=3.6 packages=find_namespace: install_requires = - opentelemetry-exporter-jaeger-proto-grpc == 1.5.0 - opentelemetry-exporter-jaeger-thrift == 1.5.0 + opentelemetry-exporter-jaeger-proto-grpc == 1.6.0 + opentelemetry-exporter-jaeger-thrift == 1.6.0 [options.extras_require] test = diff --git a/exporter/opentelemetry-exporter-jaeger/src/opentelemetry/exporter/jaeger/version.py b/exporter/opentelemetry-exporter-jaeger/src/opentelemetry/exporter/jaeger/version.py index 14cffddd57a..7373c3ac09b 100644 --- a/exporter/opentelemetry-exporter-jaeger/src/opentelemetry/exporter/jaeger/version.py +++ b/exporter/opentelemetry-exporter-jaeger/src/opentelemetry/exporter/jaeger/version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.5.0" +__version__ = "1.6.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 d33bd87ce4b..2a05c9b3611 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.24b0" +__version__ = "0.25b0" diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/setup.cfg b/exporter/opentelemetry-exporter-otlp-proto-grpc/setup.cfg index 5d144190d35..9d0fd68d048 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/setup.cfg +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/setup.cfg @@ -43,7 +43,7 @@ install_requires = googleapis-common-protos ~= 1.52 opentelemetry-api ~= 1.3 opentelemetry-sdk ~= 1.3 - opentelemetry-proto == 1.5.0 + opentelemetry-proto == 1.6.0 backoff ~= 1.10.0 [options.extras_require] 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 c8902adc49b..e97f1318ecd 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.5.0" +__version__ = "1.6.0" diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/setup.cfg b/exporter/opentelemetry-exporter-otlp-proto-http/setup.cfg index 9ea3711965e..ad9311713a3 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/setup.cfg +++ b/exporter/opentelemetry-exporter-otlp-proto-http/setup.cfg @@ -43,7 +43,7 @@ install_requires = googleapis-common-protos ~= 1.52 opentelemetry-api ~= 1.3 opentelemetry-sdk ~= 1.3 - opentelemetry-proto == 1.5.0 + opentelemetry-proto == 1.6.0 backoff ~= 1.10.0 [options.extras_require] 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 c8902adc49b..e97f1318ecd 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.5.0" +__version__ = "1.6.0" diff --git a/exporter/opentelemetry-exporter-otlp/setup.cfg b/exporter/opentelemetry-exporter-otlp/setup.cfg index 88daac2533b..53ebc029753 100644 --- a/exporter/opentelemetry-exporter-otlp/setup.cfg +++ b/exporter/opentelemetry-exporter-otlp/setup.cfg @@ -38,8 +38,8 @@ classifiers = python_requires = >=3.6 packages=find_namespace: install_requires = - opentelemetry-exporter-otlp-proto-grpc == 1.5.0 - opentelemetry-exporter-otlp-proto-http == 1.5.0 + opentelemetry-exporter-otlp-proto-grpc == 1.6.0 + opentelemetry-exporter-otlp-proto-http == 1.6.0 [options.entry_points] opentelemetry_traces_exporter = 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 c8902adc49b..e97f1318ecd 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.5.0" +__version__ = "1.6.0" 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 c8902adc49b..e97f1318ecd 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.5.0" +__version__ = "1.6.0" diff --git a/exporter/opentelemetry-exporter-zipkin-proto-http/setup.cfg b/exporter/opentelemetry-exporter-zipkin-proto-http/setup.cfg index a6cdd5b5f87..90d69c94782 100644 --- a/exporter/opentelemetry-exporter-zipkin-proto-http/setup.cfg +++ b/exporter/opentelemetry-exporter-zipkin-proto-http/setup.cfg @@ -45,7 +45,7 @@ install_requires = requests ~= 2.7 opentelemetry-api ~= 1.3 opentelemetry-sdk ~= 1.3 - opentelemetry-exporter-zipkin-json == 1.5.0 + opentelemetry-exporter-zipkin-json == 1.6.0 [options.packages.find] where = src 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 c8902adc49b..e97f1318ecd 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.5.0" +__version__ = "1.6.0" diff --git a/exporter/opentelemetry-exporter-zipkin/setup.cfg b/exporter/opentelemetry-exporter-zipkin/setup.cfg index 70e850bfe79..f4f5c5e0830 100644 --- a/exporter/opentelemetry-exporter-zipkin/setup.cfg +++ b/exporter/opentelemetry-exporter-zipkin/setup.cfg @@ -38,8 +38,8 @@ classifiers = python_requires = >=3.6 packages=find_namespace: install_requires = - opentelemetry-exporter-zipkin-json == 1.5.0 - opentelemetry-exporter-zipkin-proto-http == 1.5.0 + opentelemetry-exporter-zipkin-json == 1.6.0 + opentelemetry-exporter-zipkin-proto-http == 1.6.0 [options.extras_require] test = 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 c8902adc49b..e97f1318ecd 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.5.0" +__version__ = "1.6.0" diff --git a/opentelemetry-api/src/opentelemetry/baggage/__init__.py b/opentelemetry-api/src/opentelemetry/baggage/__init__.py index 2368c5a325f..8dea6dbfb94 100644 --- a/opentelemetry-api/src/opentelemetry/baggage/__init__.py +++ b/opentelemetry-api/src/opentelemetry/baggage/__init__.py @@ -12,18 +12,30 @@ # See the License for the specific language governing permissions and # limitations under the License. -import typing +from logging import getLogger +from re import compile from types import MappingProxyType +from typing import Mapping, Optional from opentelemetry.context import create_key, get_value, set_value from opentelemetry.context.context import Context +from opentelemetry.util.re import ( + _BAGGAGE_PROPERTY_FORMAT, + _KEY_FORMAT, + _VALUE_FORMAT, +) _BAGGAGE_KEY = create_key("baggage") +_logger = getLogger(__name__) + +_KEY_PATTERN = compile(_KEY_FORMAT) +_VALUE_PATTERN = compile(_VALUE_FORMAT) +_PROPERT_PATTERN = compile(_BAGGAGE_PROPERTY_FORMAT) def get_all( - context: typing.Optional[Context] = None, -) -> typing.Mapping[str, object]: + context: Optional[Context] = None, +) -> Mapping[str, object]: """Returns the name/value pairs in the Baggage Args: @@ -39,8 +51,8 @@ def get_all( def get_baggage( - name: str, context: typing.Optional[Context] = None -) -> typing.Optional[object]: + name: str, context: Optional[Context] = None +) -> Optional[object]: """Provides access to the value for a name/value pair in the Baggage @@ -56,7 +68,7 @@ def get_baggage( def set_baggage( - name: str, value: object, context: typing.Optional[Context] = None + name: str, value: object, context: Optional[Context] = None ) -> Context: """Sets a value in the Baggage @@ -69,13 +81,20 @@ def set_baggage( A Context with the value updated """ baggage = dict(get_all(context=context)) - baggage[name] = value + if not _is_valid_key(name): + _logger.warning( + "Baggage key `%s` does not match format, ignoring", name + ) + elif not _is_valid_value(str(value)): + _logger.warning( + "Baggage value `%s` does not match format, ignoring", value + ) + else: + baggage[name] = value return set_value(_BAGGAGE_KEY, baggage, context=context) -def remove_baggage( - name: str, context: typing.Optional[Context] = None -) -> Context: +def remove_baggage(name: str, context: Optional[Context] = None) -> Context: """Removes a value from the Baggage Args: @@ -91,7 +110,7 @@ def remove_baggage( return set_value(_BAGGAGE_KEY, baggage, context=context) -def clear(context: typing.Optional[Context] = None) -> Context: +def clear(context: Optional[Context] = None) -> Context: """Removes all values from the Baggage Args: @@ -101,3 +120,22 @@ def clear(context: typing.Optional[Context] = None) -> Context: A Context with all baggage entries removed """ return set_value(_BAGGAGE_KEY, {}, context=context) + + +def _is_valid_key(name: str) -> bool: + return _KEY_PATTERN.fullmatch(str(name)) is not None + + +def _is_valid_value(value: object) -> bool: + parts = str(value).split(";") + is_valid_value = _VALUE_PATTERN.fullmatch(parts[0]) is not None + if len(parts) > 1: # one or more properties metadata + for property in parts[1:]: + if _PROPERT_PATTERN.fullmatch(property) is None: + is_valid_value = False + break + return is_valid_value + + +def _is_valid_pair(key: str, value: str) -> bool: + return _is_valid_key(key) and _is_valid_value(value) diff --git a/opentelemetry-api/src/opentelemetry/baggage/propagation/__init__.py b/opentelemetry-api/src/opentelemetry/baggage/propagation/__init__.py index 9d170aae9a9..8ba28357c3a 100644 --- a/opentelemetry-api/src/opentelemetry/baggage/propagation/__init__.py +++ b/opentelemetry-api/src/opentelemetry/baggage/propagation/__init__.py @@ -12,13 +12,18 @@ # See the License for the specific language governing permissions and # limitations under the License. # -import typing +from logging import getLogger +from re import split +from typing import Iterable, Mapping, Optional, Set from urllib.parse import quote_plus, unquote_plus -from opentelemetry.baggage import get_all, set_baggage +from opentelemetry.baggage import _is_valid_pair, get_all, set_baggage from opentelemetry.context import get_current from opentelemetry.context.context import Context from opentelemetry.propagators import textmap +from opentelemetry.util.re import _DELIMITER_PATTERN + +_logger = getLogger(__name__) class W3CBaggagePropagator(textmap.TextMapPropagator): @@ -32,7 +37,7 @@ class W3CBaggagePropagator(textmap.TextMapPropagator): def extract( self, carrier: textmap.CarrierT, - context: typing.Optional[Context] = None, + context: Optional[Context] = None, getter: textmap.Getter = textmap.default_getter, ) -> Context: """Extract Baggage from the carrier. @@ -49,20 +54,46 @@ def extract( ) if not header or len(header) > self._MAX_HEADER_LENGTH: + _logger.warning( + "Baggage header `%s` exceeded the maximum number of bytes per baggage-string", + header, + ) return context - baggage_entries = header.split(",") + baggage_entries = split(_DELIMITER_PATTERN, header) total_baggage_entries = self._MAX_PAIRS + + if len(baggage_entries) > self._MAX_PAIRS: + _logger.warning( + "Baggage header `%s` exceeded the maximum number of list-members", + header, + ) + for entry in baggage_entries: if len(entry) > self._MAX_PAIR_LENGTH: + _logger.warning( + "Baggage entry `%s` exceeded the maximum number of bytes per list-member", + entry, + ) + continue + if not entry: # empty string continue try: name, value = entry.split("=", 1) except Exception: # pylint: disable=broad-except + _logger.warning( + "Baggage list-member `%s` doesn't match the format", entry + ) continue + name = unquote_plus(name).strip().lower() + value = unquote_plus(value).strip() + if not _is_valid_pair(name, value): + _logger.warning("Invalid baggage entry: `%s`", entry) + continue + context = set_baggage( - unquote_plus(name).strip(), - unquote_plus(value).strip(), + name, + value, context=context, ) total_baggage_entries -= 1 @@ -74,7 +105,7 @@ def extract( def inject( self, carrier: textmap.CarrierT, - context: typing.Optional[Context] = None, + context: Optional[Context] = None, setter: textmap.Setter = textmap.default_setter, ) -> None: """Injects Baggage into the carrier. @@ -90,12 +121,12 @@ def inject( setter.set(carrier, self._BAGGAGE_HEADER_NAME, baggage_string) @property - def fields(self) -> typing.Set[str]: + def fields(self) -> Set[str]: """Returns a set with the fields set in `inject`.""" return {self._BAGGAGE_HEADER_NAME} -def _format_baggage(baggage_entries: typing.Mapping[str, object]) -> str: +def _format_baggage(baggage_entries: Mapping[str, object]) -> str: return ",".join( quote_plus(str(key)) + "=" + quote_plus(str(value)) for key, value in baggage_entries.items() @@ -103,8 +134,8 @@ def _format_baggage(baggage_entries: typing.Mapping[str, object]) -> str: def _extract_first_element( - items: typing.Optional[typing.Iterable[textmap.CarrierT]], -) -> typing.Optional[textmap.CarrierT]: + items: Optional[Iterable[textmap.CarrierT]], +) -> Optional[textmap.CarrierT]: if items is None: return None return next(iter(items), None) diff --git a/opentelemetry-api/src/opentelemetry/context/__init__.py b/opentelemetry-api/src/opentelemetry/context/__init__.py index a8dd39c53ab..7f56cdb216b 100644 --- a/opentelemetry-api/src/opentelemetry/context/__init__.py +++ b/opentelemetry-api/src/opentelemetry/context/__init__.py @@ -157,3 +157,9 @@ def detach(token: object) -> None: _RUNTIME_CONTEXT.detach(token) # type: ignore except Exception: # pylint: disable=broad-except logger.error("Failed to detach context") + + +# FIXME This is a temporary location for the suppress instrumentation key. +# Once the decision around how to suppress instrumentation is made in the +# spec, this key should be moved accordingly. +_SUPPRESS_INSTRUMENTATION_KEY = create_key("suppress_instrumentation") diff --git a/opentelemetry-api/src/opentelemetry/util/re.py b/opentelemetry-api/src/opentelemetry/util/re.py index b503c4893aa..32c3e3ffb4c 100644 --- a/opentelemetry-api/src/opentelemetry/util/re.py +++ b/opentelemetry-api/src/opentelemetry/util/re.py @@ -27,10 +27,12 @@ ) # A value contains a URL encoded UTF-8 string. _VALUE_FORMAT = r"[\x21\x23-\x2b\x2d-\x3a\x3c-\x5b\x5d-\x7e]*" -_HEADER_FORMAT = _KEY_FORMAT + _OWS + r"=" + _OWS + _VALUE_FORMAT -_HEADER_PATTERN = compile(_HEADER_FORMAT) +_KEY_VALUE_FORMAT = rf"{_OWS}{_KEY_FORMAT}{_OWS}={_OWS}{_VALUE_FORMAT}{_OWS}" +_HEADER_PATTERN = compile(_KEY_VALUE_FORMAT) _DELIMITER_PATTERN = compile(r"[ \t]*,[ \t]*") +_BAGGAGE_PROPERTY_FORMAT = rf"{_KEY_VALUE_FORMAT}|{_OWS}{_KEY_FORMAT}{_OWS}" + # pylint: disable=invalid-name def parse_headers(s: str) -> Mapping[str, str]: diff --git a/opentelemetry-api/src/opentelemetry/version.py b/opentelemetry-api/src/opentelemetry/version.py index c8902adc49b..e97f1318ecd 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.5.0" +__version__ = "1.6.0" diff --git a/opentelemetry-api/tests/baggage/test_baggage_propagation.py b/opentelemetry-api/tests/baggage/test_baggage_propagation.py index caecc4615ea..69a1039a498 100644 --- a/opentelemetry-api/tests/baggage/test_baggage_propagation.py +++ b/opentelemetry-api/tests/baggage/test_baggage_propagation.py @@ -15,6 +15,7 @@ # type: ignore import unittest +from logging import WARNING from unittest.mock import Mock, patch from opentelemetry import baggage @@ -62,19 +63,27 @@ def test_valid_header_with_space(self): self.assertEqual(self._extract(header), expected) def test_valid_header_with_properties(self): - header = "key1=val1,key2=val2;prop=1" - expected = {"key1": "val1", "key2": "val2;prop=1"} + header = "key1=val1,key2=val2;prop=1;prop2;prop3=2" + expected = {"key1": "val1", "key2": "val2;prop=1;prop2;prop3=2"} self.assertEqual(self._extract(header), expected) - def test_valid_header_with_url_escaped_comma(self): - header = "key%2C1=val1,key2=val2%2Cval3" - expected = {"key,1": "val1", "key2": "val2,val3"} + def test_valid_header_with_url_escaped_values(self): + header = "key1=val1,key2=val2%3Aval3,key3=val4%40%23%24val5" + expected = { + "key1": "val1", + "key2": "val2:val3", + "key3": "val4@#$val5", + } self.assertEqual(self._extract(header), expected) - def test_valid_header_with_invalid_value(self): + def test_header_with_invalid_value(self): header = "key1=val1,key2=val2,a,val3" - expected = {"key1": "val1", "key2": "val2"} - self.assertEqual(self._extract(header), expected) + with self.assertLogs(level=WARNING) as warning: + self._extract(header) + self.assertIn( + "Baggage list-member `a` doesn't match the format", + warning.output[0], + ) def test_valid_header_with_empty_value(self): header = "key1=,key2=val2" @@ -82,9 +91,8 @@ def test_valid_header_with_empty_value(self): self.assertEqual(self._extract(header), expected) def test_invalid_header(self): - header = "header1" - expected = {} - self.assertEqual(self._extract(header), expected) + self.assertEqual(self._extract("header1"), {}) + self.assertEqual(self._extract(" = "), {}) def test_header_too_long(self): long_value = "s" * (W3CBaggagePropagator._MAX_HEADER_LENGTH + 1) @@ -107,62 +115,85 @@ def test_header_contains_pair_too_long(self): long_value = "s" * (W3CBaggagePropagator._MAX_PAIR_LENGTH + 1) header = "key1=value1,key2={},key3=value3".format(long_value) expected = {"key1": "value1", "key3": "value3"} - self.assertEqual(self._extract(header), expected) + with self.assertLogs(level=WARNING) as warning: + self.assertEqual(self._extract(header), expected) + self.assertIn( + "exceeded the maximum number of bytes per list-member", + warning.output[0], + ) def test_extract_unquote_plus(self): self.assertEqual( - self._extract("key+key=value+value"), {"key key": "value value"} + self._extract("keykey=value%5Evalue"), {"keykey": "value^value"} ) self.assertEqual( - self._extract("key%2Fkey=value%2Fvalue"), - {"key/key": "value/value"}, + self._extract("key%23key=value%23value"), + {"key#key": "value#value"}, ) def test_header_max_entries_skip_invalid_entry(self): - self.assertEqual( - self._extract( - ",".join( - [ - f"key{index}=value{index}" - if index != 2 - else ( - f"key{index}=" - f"value{'s' * (W3CBaggagePropagator._MAX_PAIR_LENGTH + 1)}" - ) - for index in range(W3CBaggagePropagator._MAX_PAIRS + 1) - ] - ) - ), - { - f"key{index}": f"value{index}" - for index in range(W3CBaggagePropagator._MAX_PAIRS + 1) - if index != 2 - }, - ) - self.assertEqual( - self._extract( - ",".join( - [ - f"key{index}=value{index}" - if index != 2 - else f"key{index}xvalue{index}" - for index in range(W3CBaggagePropagator._MAX_PAIRS + 1) - ] - ) - ), - { - f"key{index}": f"value{index}" - for index in range(W3CBaggagePropagator._MAX_PAIRS + 1) - if index != 2 - }, - ) + with self.assertLogs(level=WARNING) as warning: + self.assertEqual( + self._extract( + ",".join( + [ + f"key{index}=value{index}" + if index != 2 + else ( + f"key{index}=" + f"value{'s' * (W3CBaggagePropagator._MAX_PAIR_LENGTH + 1)}" + ) + for index in range( + W3CBaggagePropagator._MAX_PAIRS + 1 + ) + ] + ) + ), + { + f"key{index}": f"value{index}" + for index in range(W3CBaggagePropagator._MAX_PAIRS + 1) + if index != 2 + }, + ) + self.assertIn( + "exceeded the maximum number of list-members", + warning.output[0], + ) + + with self.assertLogs(level=WARNING) as warning: + self.assertEqual( + self._extract( + ",".join( + [ + f"key{index}=value{index}" + if index != 2 + else f"key{index}xvalue{index}" + for index in range( + W3CBaggagePropagator._MAX_PAIRS + 1 + ) + ] + ) + ), + { + f"key{index}": f"value{index}" + for index in range(W3CBaggagePropagator._MAX_PAIRS + 1) + if index != 2 + }, + ) + self.assertIn( + "exceeded the maximum number of list-members", + warning.output[0], + ) def test_inject_no_baggage_entries(self): values = {} output = self._inject(values) self.assertEqual(None, output) + def test_inject_invalid_entries(self): + self.assertEqual(None, self._inject({"key": "val ue"})) + def test_inject(self): values = { "key1": "val1", @@ -178,7 +209,6 @@ def test_inject_escaped_values(self): "key2": "val3=4", } output = self._inject(values) - self.assertIn("key1=val1%2Cval2", output) self.assertIn("key2=val3%3D4", output) def test_inject_non_string_values(self): diff --git a/opentelemetry-distro/setup.cfg b/opentelemetry-distro/setup.cfg index 36779604d0e..bf41c9010a6 100644 --- a/opentelemetry-distro/setup.cfg +++ b/opentelemetry-distro/setup.cfg @@ -42,8 +42,8 @@ zip_safe = False include_package_data = True install_requires = opentelemetry-api ~= 1.3 - opentelemetry-instrumentation == 0.24b0 - opentelemetry-sdk == 1.5.0 + opentelemetry-instrumentation == 0.25b0 + opentelemetry-sdk == 1.6.0 [options.packages.find] where = src @@ -57,4 +57,4 @@ opentelemetry_configurator = [options.extras_require] test = otlp = - opentelemetry-exporter-otlp == 1.5.0 + opentelemetry-exporter-otlp == 1.6.0 diff --git a/opentelemetry-distro/src/opentelemetry/distro/version.py b/opentelemetry-distro/src/opentelemetry/distro/version.py index d33bd87ce4b..2a05c9b3611 100644 --- a/opentelemetry-distro/src/opentelemetry/distro/version.py +++ b/opentelemetry-distro/src/opentelemetry/distro/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.24b0" +__version__ = "0.25b0" diff --git a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/bootstrap_gen.py b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/bootstrap_gen.py index efd37e52661..282d4491cad 100644 --- a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/bootstrap_gen.py +++ b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/bootstrap_gen.py @@ -18,125 +18,125 @@ libraries = { "aiohttp": { "library": "aiohttp ~= 3.0", - "instrumentation": "opentelemetry-instrumentation-aiohttp-client==0.24b0", + "instrumentation": "opentelemetry-instrumentation-aiohttp-client==0.25b0", }, "aiopg": { "library": "aiopg >= 0.13.0, < 1.3.0", - "instrumentation": "opentelemetry-instrumentation-aiopg==0.24b0", + "instrumentation": "opentelemetry-instrumentation-aiopg==0.25b0", }, "asgiref": { "library": "asgiref ~= 3.0", - "instrumentation": "opentelemetry-instrumentation-asgi==0.24b0", + "instrumentation": "opentelemetry-instrumentation-asgi==0.25b0", }, "asyncpg": { "library": "asyncpg >= 0.12.0", - "instrumentation": "opentelemetry-instrumentation-asyncpg==0.24b0", + "instrumentation": "opentelemetry-instrumentation-asyncpg==0.25b0", }, "boto": { "library": "boto~=2.0", - "instrumentation": "opentelemetry-instrumentation-boto==0.24b0", + "instrumentation": "opentelemetry-instrumentation-boto==0.25b0", }, "botocore": { "library": "botocore ~= 1.0", - "instrumentation": "opentelemetry-instrumentation-botocore==0.24b0", + "instrumentation": "opentelemetry-instrumentation-botocore==0.25b0", }, "celery": { "library": "celery >= 4.0, < 6.0", - "instrumentation": "opentelemetry-instrumentation-celery==0.24b0", + "instrumentation": "opentelemetry-instrumentation-celery==0.25b0", }, "django": { "library": "django >= 1.10", - "instrumentation": "opentelemetry-instrumentation-django==0.24b0", + "instrumentation": "opentelemetry-instrumentation-django==0.25b0", }, "elasticsearch": { "library": "elasticsearch >= 2.0", - "instrumentation": "opentelemetry-instrumentation-elasticsearch==0.24b0", + "instrumentation": "opentelemetry-instrumentation-elasticsearch==0.25b0", }, "falcon": { "library": "falcon >= 2.0.0, < 4.0.0", - "instrumentation": "opentelemetry-instrumentation-falcon==0.24b0", + "instrumentation": "opentelemetry-instrumentation-falcon==0.25b0", }, "fastapi": { "library": "fastapi ~= 0.58", - "instrumentation": "opentelemetry-instrumentation-fastapi==0.24b0", + "instrumentation": "opentelemetry-instrumentation-fastapi==0.25b0", }, "flask": { "library": "flask >= 1.0, < 3.0", - "instrumentation": "opentelemetry-instrumentation-flask==0.24b0", + "instrumentation": "opentelemetry-instrumentation-flask==0.25b0", }, "grpcio": { "library": "grpcio ~= 1.27", - "instrumentation": "opentelemetry-instrumentation-grpc==0.24b0", + "instrumentation": "opentelemetry-instrumentation-grpc==0.25b0", }, "httpx": { "library": "httpx >= 0.18.0, < 0.19.0", - "instrumentation": "opentelemetry-instrumentation-httpx==0.24b0", + "instrumentation": "opentelemetry-instrumentation-httpx==0.25b0", }, "jinja2": { "library": "jinja2 >= 2.7, < 4.0", - "instrumentation": "opentelemetry-instrumentation-jinja2==0.24b0", + "instrumentation": "opentelemetry-instrumentation-jinja2==0.25b0", }, "mysql-connector-python": { "library": "mysql-connector-python ~= 8.0", - "instrumentation": "opentelemetry-instrumentation-mysql==0.24b0", + "instrumentation": "opentelemetry-instrumentation-mysql==0.25b0", }, "pika": { "library": "pika >= 1.1.0", - "instrumentation": "opentelemetry-instrumentation-pika==0.24b0", + "instrumentation": "opentelemetry-instrumentation-pika==0.25b0", }, "psycopg2": { "library": "psycopg2 >= 2.7.3.1", - "instrumentation": "opentelemetry-instrumentation-psycopg2==0.24b0", + "instrumentation": "opentelemetry-instrumentation-psycopg2==0.25b0", }, "pymemcache": { "library": "pymemcache ~= 1.3", - "instrumentation": "opentelemetry-instrumentation-pymemcache==0.24b0", + "instrumentation": "opentelemetry-instrumentation-pymemcache==0.25b0", }, "pymongo": { "library": "pymongo ~= 3.1", - "instrumentation": "opentelemetry-instrumentation-pymongo==0.24b0", + "instrumentation": "opentelemetry-instrumentation-pymongo==0.25b0", }, "PyMySQL": { "library": "PyMySQL ~= 0.10.1", - "instrumentation": "opentelemetry-instrumentation-pymysql==0.24b0", + "instrumentation": "opentelemetry-instrumentation-pymysql==0.25b0", }, "pyramid": { "library": "pyramid >= 1.7", - "instrumentation": "opentelemetry-instrumentation-pyramid==0.24b0", + "instrumentation": "opentelemetry-instrumentation-pyramid==0.25b0", }, "redis": { "library": "redis >= 2.6", - "instrumentation": "opentelemetry-instrumentation-redis==0.24b0", + "instrumentation": "opentelemetry-instrumentation-redis==0.25b0", }, "requests": { "library": "requests ~= 2.0", - "instrumentation": "opentelemetry-instrumentation-requests==0.24b0", + "instrumentation": "opentelemetry-instrumentation-requests==0.25b0", }, "scikit-learn": { "library": "scikit-learn ~= 0.24.0", - "instrumentation": "opentelemetry-instrumentation-sklearn==0.24b0", + "instrumentation": "opentelemetry-instrumentation-sklearn==0.25b0", }, "sqlalchemy": { "library": "sqlalchemy", - "instrumentation": "opentelemetry-instrumentation-sqlalchemy==0.24b0", + "instrumentation": "opentelemetry-instrumentation-sqlalchemy==0.25b0", }, "starlette": { "library": "starlette ~= 0.13.0", - "instrumentation": "opentelemetry-instrumentation-starlette==0.24b0", + "instrumentation": "opentelemetry-instrumentation-starlette==0.25b0", }, "tornado": { "library": "tornado >= 6.0", - "instrumentation": "opentelemetry-instrumentation-tornado==0.24b0", + "instrumentation": "opentelemetry-instrumentation-tornado==0.25b0", }, "urllib3": { "library": "urllib3 >= 1.0.0, < 2.0.0", - "instrumentation": "opentelemetry-instrumentation-urllib3==0.24b0", + "instrumentation": "opentelemetry-instrumentation-urllib3==0.25b0", }, } default_instrumentations = [ - "opentelemetry-instrumentation-dbapi==0.24b0", - "opentelemetry-instrumentation-logging==0.24b0", - "opentelemetry-instrumentation-sqlite3==0.24b0", - "opentelemetry-instrumentation-urllib==0.24b0", - "opentelemetry-instrumentation-wsgi==0.24b0", + "opentelemetry-instrumentation-dbapi==0.25b0", + "opentelemetry-instrumentation-logging==0.25b0", + "opentelemetry-instrumentation-sqlite3==0.25b0", + "opentelemetry-instrumentation-urllib==0.25b0", + "opentelemetry-instrumentation-wsgi==0.25b0", ] diff --git a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/configurator.py b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/configurator.py deleted file mode 100644 index 3efa71e89e9..00000000000 --- a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/configurator.py +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright The OpenTelemetry Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# type: ignore - -""" -OpenTelemetry Base Configurator -""" - -from abc import ABC, abstractmethod -from logging import getLogger - -_LOG = getLogger(__name__) - - -class BaseConfigurator(ABC): - """An ABC for configurators - - Configurators are used to configure - SDKs (i.e. TracerProvider, MeterProvider, Processors...) - to reduce the amount of manual configuration required. - """ - - _instance = None - _is_instrumented = False - - def __new__(cls, *args, **kwargs): - - if cls._instance is None: - cls._instance = object.__new__(cls, *args, **kwargs) - - return cls._instance - - @abstractmethod - def _configure(self, **kwargs): - """Configure the SDK""" - - def configure(self, **kwargs): - """Configure the SDK""" - self._configure(**kwargs) - - -__all__ = ["BaseConfigurator"] diff --git a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/utils.py b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/utils.py index 16f75aae6c8..5f63b4af5e3 100644 --- a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/utils.py +++ b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/utils.py @@ -16,14 +16,10 @@ from wrapt import ObjectProxy -from opentelemetry.context import create_key +# pylint: disable=unused-import +from opentelemetry.context import _SUPPRESS_INSTRUMENTATION_KEY # noqa: F401 from opentelemetry.trace import StatusCode -# FIXME This is a temporary location for the suppress instrumentation key. -# Once the decision around how to suppress instrumentation is made in the -# spec, this key should be moved accordingly. -_SUPPRESS_INSTRUMENTATION_KEY = create_key("suppress_instrumentation") - def extract_attributes_from_object( obj: any, attributes: Sequence[str], existing: Dict[str, str] = None diff --git a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/version.py b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/version.py index d33bd87ce4b..2a05c9b3611 100644 --- a/opentelemetry-instrumentation/src/opentelemetry/instrumentation/version.py +++ b/opentelemetry-instrumentation/src/opentelemetry/instrumentation/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.24b0" +__version__ = "0.25b0" diff --git a/opentelemetry-proto/src/opentelemetry/proto/version.py b/opentelemetry-proto/src/opentelemetry/proto/version.py index c8902adc49b..e97f1318ecd 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.5.0" +__version__ = "1.6.0" diff --git a/opentelemetry-sdk/setup.cfg b/opentelemetry-sdk/setup.cfg index 56390868ed1..bf063a237f7 100644 --- a/opentelemetry-sdk/setup.cfg +++ b/opentelemetry-sdk/setup.cfg @@ -42,9 +42,8 @@ packages=find_namespace: zip_safe = False include_package_data = True install_requires = - opentelemetry-api == 1.5.0 - opentelemetry-semantic-conventions == 0.24b0 - opentelemetry-instrumentation == 0.24b0 + opentelemetry-api == 1.6.0 + opentelemetry-semantic-conventions == 0.25b0 [options.packages.find] where = src diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py index 79445a7a357..f2ebd317493 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py @@ -17,6 +17,7 @@ OpenTelemetry SDK Configurator for Easy Instrumentation with Distros """ +from abc import ABC, abstractmethod from os import environ from typing import Sequence, Tuple @@ -27,7 +28,6 @@ OTEL_PYTHON_ID_GENERATOR, OTEL_TRACES_EXPORTER, ) -from opentelemetry.instrumentation.configurator import BaseConfigurator from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor, SpanExporter from opentelemetry.sdk.trace.id_generator import IdGenerator @@ -140,7 +140,34 @@ def _initialize_components(): _init_tracing(trace_exporters, id_generator) -class _OTelSDKConfigurator(BaseConfigurator): +class _BaseConfigurator(ABC): + """An ABC for configurators + + Configurators are used to configure + SDKs (i.e. TracerProvider, MeterProvider, Processors...) + to reduce the amount of manual configuration required. + """ + + _instance = None + _is_instrumented = False + + def __new__(cls, *args, **kwargs): + + if cls._instance is None: + cls._instance = object.__new__(cls, *args, **kwargs) + + return cls._instance + + @abstractmethod + def _configure(self, **kwargs): + """Configure the SDK""" + + def configure(self, **kwargs): + """Configure the SDK""" + self._configure(**kwargs) + + +class _OTelSDKConfigurator(_BaseConfigurator): """A basic Configurator by OTel Python for initalizing OTel SDK components Initializes several crucial OTel SDK components (i.e. TracerProvider, diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py index d5d84df045a..4f0cc817c9f 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py @@ -21,8 +21,13 @@ from os import environ, linesep from typing import Optional -from opentelemetry.context import Context, attach, detach, set_value -from opentelemetry.instrumentation.utils import _SUPPRESS_INSTRUMENTATION_KEY +from opentelemetry.context import ( + _SUPPRESS_INSTRUMENTATION_KEY, + Context, + attach, + detach, + set_value, +) from opentelemetry.sdk.environment_variables import ( OTEL_BSP_EXPORT_TIMEOUT, OTEL_BSP_MAX_EXPORT_BATCH_SIZE, @@ -175,7 +180,9 @@ def __init__( self.queue = collections.deque( [], max_queue_size ) # type: typing.Deque[Span] - self.worker_thread = threading.Thread(target=self.worker, daemon=True) + self.worker_thread = threading.Thread( + name="OtelBatchSpanProcessor", target=self.worker, daemon=True + ) self.condition = threading.Condition(threading.Lock()) self._flush_request = None # type: typing.Optional[_FlushRequest] self.schedule_delay_millis = schedule_delay_millis diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/version.py b/opentelemetry-sdk/src/opentelemetry/sdk/version.py index c8902adc49b..e97f1318ecd 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.5.0" +__version__ = "1.6.0" diff --git a/opentelemetry-semantic-conventions/src/opentelemetry/semconv/version.py b/opentelemetry-semantic-conventions/src/opentelemetry/semconv/version.py index d33bd87ce4b..2a05c9b3611 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.24b0" +__version__ = "0.25b0" 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 c8902adc49b..e97f1318ecd 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.5.0" +__version__ = "1.6.0" 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 c8902adc49b..e97f1318ecd 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.5.0" +__version__ = "1.6.0" diff --git a/shim/opentelemetry-opentracing-shim/setup.cfg b/shim/opentelemetry-opentracing-shim/setup.cfg index 41f96654a03..3e7277782d7 100644 --- a/shim/opentelemetry-opentracing-shim/setup.cfg +++ b/shim/opentelemetry-opentracing-shim/setup.cfg @@ -46,7 +46,7 @@ install_requires = [options.extras_require] test = - opentelemetry-test == 0.24b0 + opentelemetry-test == 0.25b0 opentracing ~= 2.2.0 [options.packages.find] 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 d33bd87ce4b..2a05c9b3611 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.24b0" +__version__ = "0.25b0" diff --git a/tests/util/src/opentelemetry/test/version.py b/tests/util/src/opentelemetry/test/version.py index 536b2ec8534..0d5c9e97857 100644 --- a/tests/util/src/opentelemetry/test/version.py +++ b/tests/util/src/opentelemetry/test/version.py @@ -1 +1 @@ -__version__ = "0.24b0" +__version__ = "0.25b0" diff --git a/tox.ini b/tox.ini index e78f0226837..92a6db3569f 100644 --- a/tox.ini +++ b/tox.ini @@ -126,9 +126,9 @@ commands_pre = instrumentation: pip install {toxinidir}/opentelemetry-instrumentation getting-started: pip install requests==2.26.0 flask==2.0.1 -e {toxinidir}/opentelemetry-instrumentation + getting-started: pip install -e "{env:CONTRIB_REPO}#egg=opentelemetry-util-http&subdirectory=util/opentelemetry-util-http" getting-started: pip install -e "{env:CONTRIB_REPO}#egg=opentelemetry-instrumentation-requests&subdirectory=instrumentation/opentelemetry-instrumentation-requests" 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-util-http&subdirectory=util/opentelemetry-util-http" 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 @@ -254,9 +254,9 @@ commands_pre = -e {toxinidir}/opentelemetry-semantic-conventions \ -e {toxinidir}/opentelemetry-instrumentation \ -e {toxinidir}/opentelemetry-sdk \ + -e "{env:CONTRIB_REPO}#egg=opentelemetry-util-http&subdirectory=util/opentelemetry-util-http" \ -e "{env:CONTRIB_REPO}#egg=opentelemetry-instrumentation-requests&subdirectory=instrumentation/opentelemetry-instrumentation-requests" \ - -e "{env:CONTRIB_REPO}#egg=opentelemetry-instrumentation-wsgi&subdirectory=instrumentation/opentelemetry-instrumentation-wsgi" \ - -e "{env:CONTRIB_REPO}#egg=opentelemetry-util-http&subdirectory=util/opentelemetry-util-http" + -e "{env:CONTRIB_REPO}#egg=opentelemetry-instrumentation-wsgi&subdirectory=instrumentation/opentelemetry-instrumentation-wsgi" commands = {toxinidir}/scripts/tracecontext-integration-test.sh