Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-opentelemetry-api for openSUSE:Factory checked in at 2021-12-24 20:23:12 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-opentelemetry-api (Old) and /work/SRC/openSUSE:Factory/.python-opentelemetry-api.new.2520 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-opentelemetry-api" Fri Dec 24 20:23:12 2021 rev:6 rq:929161 version:1.5.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-opentelemetry-api/python-opentelemetry-api.changes 2021-05-07 17:15:44.736926734 +0200 +++ /work/SRC/openSUSE:Factory/.python-opentelemetry-api.new.2520/python-opentelemetry-api.changes 2021-12-24 20:23:33.122031112 +0100 @@ -1,0 +2,90 @@ +Thu Nov 4 10:15:19 UTC 2021 - John Paul Adrian Glaubitz <adrian.glaub...@suse.com> + +- Version update to 1.5.0 + - Add pre and post instrumentation entry points (#1983) + - Fix documentation on well known exporters and variable OTEL_TRACES_EXPORTER + which were misnamed (#2023) + - `opentelemetry-sdk` `get_aggregated_resource()` returns default resource and + service name whenever called (#2013) + - `opentelemetry-distro` & `opentelemetry-sdk` Moved Auto Instrumentation Configurator + code to SDK to let distros use its default implementation (#1937) + - Add Trace ID validation to meet TraceID spec (#1992) + - Fixed Python 3.10 incompatibility in `opentelemetry-opentracing-shim` tests (#2018) + - `opentelemetry-sdk` added support for `OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT` (#2044) + - `opentelemetry-sdk` Fixed bugs (#2041, #2042 & #2045) in Span Limits (#2044) + - `opentelemetry-sdk` Add support for `OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT` env var (#2056) + - `opentelemetry-sdk` Treat limit even vars set to empty values as unset/unlimited. (#2054) + - `opentelemetry-api` Attribute keys must be non-empty strings. (#2057) +- from version 1.4.0 + + Added + - Moved `opentelemetry-instrumentation` to core repository. (#1959) + - Add support for OTLP Exporter Protobuf over HTTP (#1868) + - Dropped attributes/events/links count available exposed on ReadableSpans. (#1893) + - Added dropped count to otlp, jaeger and zipkin exporters. (#1893) + - Give OTLPHandler the ability to process attributes (#1952) + - Add global LogEmitterProvider and convenience function get_log_emitter (#1901) + - Add OTLPHandler for standard library logging module (#1903) + + Changed + - Updated `opentelemetry-opencensus-exporter` to use `service_name` of spans + instead of resource (#1897) + - Added descriptions to the env variables mentioned in the opentelemetry-specification + (#1898) + - Ignore calls to `Span.set_status` with `StatusCode.UNSET` and also if previous + status already had `StatusCode.OK`. (#1902) + - Attributes for `Link` and `Resource` are immutable as they are for `Event`, which + means any attempt to modify attributes directly will result in a `TypeError` exception. + (#1909) + - Added `BoundedAttributes` to the API to make it available for `Link` which is defined + in the API. Marked `BoundedDict` in the SDK as deprecated as a result. (#1915) + - Fix OTLP SpanExporter to distinguish spans based off Resource and InstrumentationInfo + (#1927) + - Updating dependency for opentelemetry api/sdk packages to support major version + instead of pinning to specific versions. (#1933) + - `opentelemetry-semantic-conventions` Generate semconv constants update for OTel + Spec 1.5.0 (#1946) + + Fixed + - Updated `opentelementry-opentracing-shim` `ScopeShim` to report exceptions in + opentelemetry specification format, rather than opentracing spec format. (#1878) +- from version 1.3.0 + + Added + - Allow span limits to be set programatically via TracerProvider. (#1877) + - Added support for CreateKey functionality. (#1853) + + Changed + - Updated get_tracer to return an empty string when passed an invalid name (#1854) + - Changed AttributeValue sequences to warn mypy users on adding None values to array + (#1855) + - Fixed exporter OTLP header parsing to match baggage header formatting. (#1869) + - Added optional `schema_url` field to `Resource` class (#1871) + - Update protos to latest version release 0.9.0 (#1873) +- from version 1.2.0 + + Added + - Added example for running Django with auto instrumentation. (#1803) + - Added `B3SingleFormat` and `B3MultiFormat` propagators to the + `opentelemetry-propagator-b3` package. (#1823) + - Added support for OTEL_SERVICE_NAME. (#1829) + - Lazily read/configure limits and allow limits to be unset. (#1839) + - Added support for OTEL_EXPORTER_JAEGER_TIMEOUT (#1863) + + Changed + - Fixed OTLP gRPC exporter silently failing if scheme is not specified + in endpoint. (#1806) + - Rename CompositeHTTPPropagator to CompositePropagator as per specification. + (#1807) + - Propagators use the root context as default for `extract` and do not modify + the context if extracting from carrier does not work. (#1811) + - Fixed `b3` propagator entrypoint to point to `B3SingleFormat` propagator. + (#1823) + - Added `b3multi` propagator entrypoint to point to `B3MultiFormat` propagator. + (#1823) + - Improve warning when failing to decode byte attribute (#1810) + - Fixed inconsistency in parent_id formatting from the ConsoleSpanExporter + (#1833) + - Include span parent in Jaeger gRPC export as `CHILD_OF` reference (#1809) + - Fixed sequence values in OTLP exporter not translating (#1818) + - Update transient errors retry timeout and retryable status codes (#1842) + - Apply validation of attributes to `Resource`, move attribute related logic + to separate package. (#1834) + - Fix start span behavior when excess links and attributes are included (#1856) + + Removed + - Moved `opentelemetry-instrumentation` to contrib repository. (#1797) + +------------------------------------------------------------------- Old: ---- opentelemetry-api-1.1.0.tar.gz New: ---- opentelemetry-api-1.5.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-opentelemetry-api.spec ++++++ --- /var/tmp/diff_new_pack.x9yl0G/_old 2021-12-24 20:23:33.566031345 +0100 +++ /var/tmp/diff_new_pack.x9yl0G/_new 2021-12-24 20:23:33.570031346 +0100 @@ -19,7 +19,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} %define skip_python2 1 Name: python-opentelemetry-api -Version: 1.1.0 +Version: 1.5.0 Release: 0 Summary: OpenTelemetry Python API License: Apache-2.0 @@ -35,6 +35,7 @@ Requires: python-aiocontextvars %endif # SECTION test requirements +BuildRequires: %{python_module Deprecated} BuildRequires: %{python_module pytest} # /SECTION %python_subpackages ++++++ opentelemetry-api-1.1.0.tar.gz -> opentelemetry-api-1.5.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/LICENSE new/opentelemetry-api-1.5.0/LICENSE --- old/opentelemetry-api-1.1.0/LICENSE 2021-04-20 23:27:16.000000000 +0200 +++ new/opentelemetry-api-1.5.0/LICENSE 2021-08-26 11:27:39.000000000 +0200 @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + 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. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/PKG-INFO new/opentelemetry-api-1.5.0/PKG-INFO --- old/opentelemetry-api-1.1.0/PKG-INFO 2021-04-20 23:27:19.000000000 +0200 +++ new/opentelemetry-api-1.5.0/PKG-INFO 2021-08-26 11:27:42.000000000 +0200 @@ -1,31 +1,11 @@ Metadata-Version: 2.1 Name: opentelemetry-api -Version: 1.1.0 +Version: 1.5.0 Summary: OpenTelemetry Python API Home-page: https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-api Author: OpenTelemetry Authors Author-email: cncf-opentelemetry-contribut...@lists.cncf.io License: Apache-2.0 -Description: OpenTelemetry Python API - ============================================================================ - - |pypi| - - .. |pypi| image:: https://badge.fury.io/py/opentelemetry-api.svg - :target: https://pypi.org/project/opentelemetry-api/ - - Installation - ------------ - - :: - - pip install opentelemetry-api - - References - ---------- - - * `OpenTelemetry Project <https://opentelemetry.io/>`_ - Platform: any Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers @@ -36,6 +16,30 @@ Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 +Classifier: Typing :: Typed Requires-Python: >=3.6 Description-Content-Type: text/x-rst Provides-Extra: test +License-File: LICENSE + +OpenTelemetry Python API +============================================================================ + +|pypi| + +.. |pypi| image:: https://badge.fury.io/py/opentelemetry-api.svg + :target: https://pypi.org/project/opentelemetry-api/ + +Installation +------------ + +:: + + pip install opentelemetry-api + +References +---------- + +* `OpenTelemetry Project <https://opentelemetry.io/>`_ + + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/setup.cfg new/opentelemetry-api-1.5.0/setup.cfg --- old/opentelemetry-api-1.1.0/setup.cfg 2021-04-20 23:27:19.000000000 +0200 +++ new/opentelemetry-api-1.5.0/setup.cfg 2021-08-26 11:27:42.000000000 +0200 @@ -18,6 +18,7 @@ Programming Language :: Python :: 3.7 Programming Language :: Python :: 3.8 Programming Language :: Python :: 3.9 + Typing :: Typed [options] python_requires = >=3.6 @@ -27,6 +28,7 @@ zip_safe = False include_package_data = True install_requires = + Deprecated >= 1.2.6 aiocontextvars; python_version<'3.7' [options.packages.find] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/src/opentelemetry/attributes/__init__.py new/opentelemetry-api-1.5.0/src/opentelemetry/attributes/__init__.py --- old/opentelemetry-api-1.1.0/src/opentelemetry/attributes/__init__.py 1970-01-01 01:00:00.000000000 +0100 +++ new/opentelemetry-api-1.5.0/src/opentelemetry/attributes/__init__.py 2021-08-26 11:27:39.000000000 +0200 @@ -0,0 +1,199 @@ +# 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 + +import logging +import threading +from collections import OrderedDict +from collections.abc import MutableMapping +from typing import Optional, Sequence, Union + +from opentelemetry.util import types + +# bytes are accepted as a user supplied value for attributes but +# decoded to strings internally. +_VALID_ATTR_VALUE_TYPES = (bool, str, bytes, int, float) + + +_logger = logging.getLogger(__name__) + + +def _clean_attribute( + key: str, value: types.AttributeValue, max_len: Optional[int] +) -> Optional[types.AttributeValue]: + """Checks if attribute value is valid and cleans it if required. + + The function returns the cleaned value or None if the value is not valid. + + An attribute value is valid if it is either: + - A primitive type: string, boolean, double precision floating + point (IEEE 754-1985) or integer. + - An array of primitive type values. The array MUST be homogeneous, + i.e. it MUST NOT contain values of different types. + + An attribute needs cleansing if: + - Its length is greater than the maximum allowed length. + - It needs to be encoded/decoded e.g, bytes to strings. + """ + + if not (key and isinstance(key, str)): + _logger.warning("invalid key `%s`. must be non-empty string.", key) + return None + + if isinstance(value, _VALID_ATTR_VALUE_TYPES): + return _clean_attribute_value(value, max_len) + + if isinstance(value, Sequence): + sequence_first_valid_type = None + cleaned_seq = [] + + for element in value: + # None is considered valid in any sequence + if element is None: + cleaned_seq.append(element) + + element = _clean_attribute_value(element, max_len) + # reject invalid elements + if element is None: + continue + + element_type = type(element) + # Reject attribute value if sequence contains a value with an incompatible type. + if element_type not in _VALID_ATTR_VALUE_TYPES: + _logger.warning( + "Invalid type %s in attribute value sequence. Expected one of " + "%s or None", + element_type.__name__, + [ + valid_type.__name__ + for valid_type in _VALID_ATTR_VALUE_TYPES + ], + ) + return None + + # The type of the sequence must be homogeneous. The first non-None + # element determines the type of the sequence + if sequence_first_valid_type is None: + sequence_first_valid_type = element_type + # use equality instead of isinstance as isinstance(True, int) evaluates to True + elif element_type != sequence_first_valid_type: + _logger.warning( + "Mixed types %s and %s in attribute value sequence", + sequence_first_valid_type.__name__, + type(element).__name__, + ) + return None + + cleaned_seq.append(element) + + # Freeze mutable sequences defensively + return tuple(cleaned_seq) + + _logger.warning( + "Invalid type %s for attribute value. Expected one of %s or a " + "sequence of those types", + type(value).__name__, + [valid_type.__name__ for valid_type in _VALID_ATTR_VALUE_TYPES], + ) + return None + + +def _clean_attribute_value( + value: types.AttributeValue, limit: Optional[int] +) -> Union[types.AttributeValue, None]: + if value is None: + return None + + if isinstance(value, bytes): + try: + value = value.decode() + except UnicodeDecodeError: + _logger.warning("Byte attribute could not be decoded.") + return None + + if limit is not None and isinstance(value, str): + value = value[:limit] + return value + + +class BoundedAttributes(MutableMapping): + """An ordered dict with a fixed max capacity. + + Oldest elements are dropped when the dict is full and a new element is + added. + """ + + def __init__( + self, + maxlen: Optional[int] = None, + attributes: types.Attributes = None, + immutable: bool = True, + max_value_len: Optional[int] = None, + ): + if maxlen is not None: + if not isinstance(maxlen, int) or maxlen < 0: + raise ValueError( + "maxlen must be valid int greater or equal to 0" + ) + self.maxlen = maxlen + self.dropped = 0 + self.max_value_len = max_value_len + self._dict = OrderedDict() # type: OrderedDict + self._lock = threading.Lock() # type: threading.Lock + if attributes: + for key, value in attributes.items(): + self[key] = value + self._immutable = immutable + + def __repr__(self): + return "{}({}, maxlen={})".format( + type(self).__name__, dict(self._dict), self.maxlen + ) + + def __getitem__(self, key): + return self._dict[key] + + def __setitem__(self, key, value): + if getattr(self, "_immutable", False): + raise TypeError + with self._lock: + if self.maxlen is not None and self.maxlen == 0: + self.dropped += 1 + return + + if key in self._dict: + del self._dict[key] + elif self.maxlen is not None and len(self._dict) == self.maxlen: + del self._dict[next(iter(self._dict.keys()))] + self.dropped += 1 + + value = _clean_attribute(key, value, self.max_value_len) + if value is not None: + self._dict[key] = value + + def __delitem__(self, key): + if getattr(self, "_immutable", False): + raise TypeError + with self._lock: + del self._dict[key] + + def __iter__(self): + with self._lock: + return iter(self._dict.copy()) + + def __len__(self): + return len(self._dict) + + def copy(self): + return self._dict.copy() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/src/opentelemetry/baggage/__init__.py new/opentelemetry-api-1.5.0/src/opentelemetry/baggage/__init__.py --- old/opentelemetry-api-1.1.0/src/opentelemetry/baggage/__init__.py 2021-04-20 23:27:16.000000000 +0200 +++ new/opentelemetry-api-1.5.0/src/opentelemetry/baggage/__init__.py 2021-08-26 11:27:39.000000000 +0200 @@ -15,10 +15,10 @@ import typing from types import MappingProxyType -from opentelemetry.context import get_value, set_value +from opentelemetry.context import create_key, get_value, set_value from opentelemetry.context.context import Context -_BAGGAGE_KEY = "baggage" +_BAGGAGE_KEY = create_key("baggage") def get_all( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/src/opentelemetry/context/__init__.py new/opentelemetry-api-1.5.0/src/opentelemetry/context/__init__.py --- old/opentelemetry-api-1.1.0/src/opentelemetry/context/__init__.py 2021-04-20 23:27:16.000000000 +0200 +++ new/opentelemetry-api-1.5.0/src/opentelemetry/context/__init__.py 2021-08-26 11:27:39.000000000 +0200 @@ -15,6 +15,7 @@ import logging import threading import typing +import uuid from functools import wraps from os import environ @@ -68,6 +69,18 @@ return typing.cast(_F, wrapper) # type: ignore[misc] +def create_key(keyname: str) -> str: + """To allow cross-cutting concern to control access to their local state, + the RuntimeContext API provides a function which takes a keyname as input, + and returns a unique key. + Args: + keyname: The key name is for debugging purposes and is not required to be unique. + Returns: + A unique string representing the newly created key. + """ + return keyname + "-" + str(uuid.uuid4()) + + def get_value(key: str, context: typing.Optional[Context] = None) -> "object": """To access the local state of a concern, the RuntimeContext API provides a function which takes a context and a key as input, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/src/opentelemetry/context/aiocontextvarsfix.py new/opentelemetry-api-1.5.0/src/opentelemetry/context/aiocontextvarsfix.py --- old/opentelemetry-api-1.1.0/src/opentelemetry/context/aiocontextvarsfix.py 2021-04-20 23:27:16.000000000 +0200 +++ new/opentelemetry-api-1.5.0/src/opentelemetry/context/aiocontextvarsfix.py 1970-01-01 01:00:00.000000000 +0100 @@ -1,86 +0,0 @@ -# type: ignore -# 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. -# -# This module is a patch to allow aiocontextvars to work for older versions -# of Python 3.5. It is copied and pasted from: -# https://github.com/fantix/aiocontextvars/issues/88#issuecomment-522276290 - -import asyncio -import asyncio.coroutines -import asyncio.futures -import concurrent.futures - -if not hasattr(asyncio, "_get_running_loop"): - # noinspection PyCompatibility - # pylint:disable=protected-access - import asyncio.events - from threading import local as threading_local - - if not hasattr(asyncio.events, "_get_running_loop"): - - class _RunningLoop(threading_local): - _loop = None - - _running_loop = _RunningLoop() - - def _get_running_loop(): - return _running_loop._loop - - def set_running_loop(loop): # noqa: F811 - _running_loop._loop = loop - - def _get_event_loop(): - current_loop = _get_running_loop() - if current_loop is not None: - return current_loop - return asyncio.events.get_event_loop_policy().get_event_loop() - - asyncio.events.get_event_loop = _get_event_loop - asyncio.events._get_running_loop = _get_running_loop - asyncio.events._set_running_loop = set_running_loop - - asyncio._get_running_loop = asyncio.events._get_running_loop - asyncio._set_running_loop = asyncio.events._set_running_loop - -# noinspection PyUnresolvedReferences -import aiocontextvars # pylint: disable=import-error,unused-import,wrong-import-position # noqa # isort:skip - - -def _run_coroutine_threadsafe(coro, loop): - """ - Patch to create task in the same thread instead of in the callback. - This ensures that contextvars get copied. Python 3.7 copies contextvars - without this. - """ - if not asyncio.coroutines.iscoroutine(coro): - raise TypeError("A coroutine object is required") - future = concurrent.futures.Future() - task = asyncio.ensure_future(coro, loop=loop) - - def callback() -> None: - try: - # noinspection PyProtectedMember,PyUnresolvedReferences - # pylint:disable=protected-access - asyncio.futures._chain_future(task, future) - except Exception as exc: - if future.set_running_or_notify_cancel(): - future.set_exception(exc) - raise - - loop.call_soon_threadsafe(callback) - return future - - -asyncio.run_coroutine_threadsafe = _run_coroutine_threadsafe diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/src/opentelemetry/context/contextvars_context.py new/opentelemetry-api-1.5.0/src/opentelemetry/context/contextvars_context.py --- old/opentelemetry-api-1.1.0/src/opentelemetry/context/contextvars_context.py 2021-04-20 23:27:16.000000000 +0200 +++ new/opentelemetry-api-1.5.0/src/opentelemetry/context/contextvars_context.py 2021-08-26 11:27:39.000000000 +0200 @@ -16,11 +16,10 @@ from opentelemetry.context.context import Context, _RuntimeContext -if (3, 5, 3) <= version_info < (3, 7): - import aiocontextvars # type: ignore # pylint:disable=unused-import,import-error +if version_info < (3, 7): + import aiocontextvars # type: ignore # pylint: disable=import-error -elif (3, 4) < version_info <= (3, 5, 2): - import opentelemetry.context.aiocontextvarsfix # pylint:disable=unused-import + aiocontextvars # pylint: disable=pointless-statement class ContextVarsRuntimeContext(_RuntimeContext): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/src/opentelemetry/propagate/__init__.py new/opentelemetry-api-1.5.0/src/opentelemetry/propagate/__init__.py --- old/opentelemetry-api-1.1.0/src/opentelemetry/propagate/__init__.py 2021-04-20 23:27:16.000000000 +0200 +++ new/opentelemetry-api-1.5.0/src/opentelemetry/propagate/__init__.py 2021-08-26 11:27:39.000000000 +0200 @@ -16,13 +16,13 @@ API for propagation of context. The propagators for the -``opentelemetry.propagators.composite.CompositeHTTPPropagator`` can be defined +``opentelemetry.propagators.composite.CompositePropagator`` can be defined via configuration in the ``OTEL_PROPAGATORS`` environment variable. This variable should be set to a comma-separated string of names of values for the ``opentelemetry_propagator`` entry point. For example, setting ``OTEL_PROPAGATORS`` to ``tracecontext,baggage`` (which is the default value) would instantiate -``opentelemetry.propagators.composite.CompositeHTTPPropagator`` with 2 +``opentelemetry.propagators.composite.CompositePropagator`` with 2 propagators, one of type ``opentelemetry.trace.propagation.tracecontext.TraceContextTextMapPropagator`` and other of type ``opentelemetry.baggage.propagation.W3CBaggagePropagator``. @@ -96,7 +96,7 @@ used to construct a Context. This object must be paired with an appropriate getter which understands how to extract a value from it. - context: an optional Context to use. Defaults to current + context: an optional Context to use. Defaults to root context if not set. """ return get_global_textmap().extract(carrier, context, getter=getter) @@ -142,7 +142,7 @@ logger.exception("Failed to load configured propagators") raise -_HTTP_TEXT_FORMAT = composite.CompositeHTTPPropagator(propagators) # type: ignore +_HTTP_TEXT_FORMAT = composite.CompositePropagator(propagators) # type: ignore def get_global_textmap() -> textmap.TextMapPropagator: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/src/opentelemetry/propagators/composite.py new/opentelemetry-api-1.5.0/src/opentelemetry/propagators/composite.py --- old/opentelemetry-api-1.1.0/src/opentelemetry/propagators/composite.py 2021-04-20 23:27:16.000000000 +0200 +++ new/opentelemetry-api-1.5.0/src/opentelemetry/propagators/composite.py 2021-08-26 11:27:39.000000000 +0200 @@ -14,14 +14,16 @@ import logging import typing +from deprecated import deprecated + from opentelemetry.context.context import Context from opentelemetry.propagators import textmap logger = logging.getLogger(__name__) -class CompositeHTTPPropagator(textmap.TextMapPropagator): - """CompositeHTTPPropagator provides a mechanism for combining multiple +class CompositePropagator(textmap.TextMapPropagator): + """CompositePropagator provides a mechanism for combining multiple propagators into a single one. Args: @@ -80,3 +82,10 @@ composite_fields.add(field) return composite_fields + + +@deprecated(version="1.2.0", reason="You should use CompositePropagator") # type: ignore +class CompositeHTTPPropagator(CompositePropagator): + """CompositeHTTPPropagator provides a mechanism for combining multiple + propagators into a single one. + """ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/src/opentelemetry/propagators/textmap.py new/opentelemetry-api-1.5.0/src/opentelemetry/propagators/textmap.py --- old/opentelemetry-api-1.1.0/src/opentelemetry/propagators/textmap.py 2021-04-20 23:27:16.000000000 +0200 +++ new/opentelemetry-api-1.5.0/src/opentelemetry/propagators/textmap.py 2021-08-26 11:27:39.000000000 +0200 @@ -150,7 +150,7 @@ used to construct a Context. This object must be paired with an appropriate getter which understands how to extract a value from it. - context: an optional Context to use. Defaults to current + context: an optional Context to use. Defaults to root context if not set. Returns: A Context with configuration found in the carrier. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/src/opentelemetry/trace/__init__.py new/opentelemetry-api-1.5.0/src/opentelemetry/trace/__init__.py --- old/opentelemetry-api-1.1.0/src/opentelemetry/trace/__init__.py 2021-04-20 23:27:16.000000000 +0200 +++ new/opentelemetry-api-1.5.0/src/opentelemetry/trace/__init__.py 2021-08-26 11:27:39.000000000 +0200 @@ -82,10 +82,11 @@ from typing import Iterator, Optional, Sequence, cast from opentelemetry import context as context_api +from opentelemetry.attributes import BoundedAttributes # type: ignore from opentelemetry.context.context import Context from opentelemetry.environment_variables import OTEL_PYTHON_TRACER_PROVIDER from opentelemetry.trace.propagation import ( - SPAN_KEY, + _SPAN_KEY, get_current_span, set_span_in_context, ) @@ -126,7 +127,7 @@ class Link(_LinkBase): - """A link to a `Span`. + """A link to a `Span`. The attributes of a Link are immutable. Args: context: `SpanContext` of the `Span` to link to. @@ -139,7 +140,9 @@ attributes: types.Attributes = None, ) -> None: super().__init__(context) - self._attributes = attributes + self._attributes = BoundedAttributes( + attributes=attributes + ) # type: types.Attributes @property def attributes(self) -> types.Attributes: @@ -317,7 +320,7 @@ as the current span in this tracer's context. Exiting the context manager will call the span's end method, - as well as return the current span to it's previous value by + as well as return the current span to its previous value by returning to the previous context. Example:: @@ -517,7 +520,7 @@ this mechanism if it was previously set manually. """ try: - token = context_api.attach(context_api.set_value(SPAN_KEY, span)) + token = context_api.attach(context_api.set_value(_SPAN_KEY, span)) try: yield span finally: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/src/opentelemetry/trace/propagation/__init__.py new/opentelemetry-api-1.5.0/src/opentelemetry/trace/propagation/__init__.py --- old/opentelemetry-api-1.1.0/src/opentelemetry/trace/propagation/__init__.py 2021-04-20 23:27:16.000000000 +0200 +++ new/opentelemetry-api-1.5.0/src/opentelemetry/trace/propagation/__init__.py 2021-08-26 11:27:39.000000000 +0200 @@ -13,11 +13,12 @@ # limitations under the License. from typing import Optional -from opentelemetry.context import get_value, set_value +from opentelemetry.context import create_key, get_value, set_value from opentelemetry.context.context import Context from opentelemetry.trace.span import INVALID_SPAN, Span SPAN_KEY = "current-span" +_SPAN_KEY = create_key("current-span") def set_span_in_context( @@ -30,7 +31,7 @@ context: a Context object. if one is not passed, the default current context is used instead. """ - ctx = set_value(SPAN_KEY, span, context=context) + ctx = set_value(_SPAN_KEY, span, context=context) return ctx @@ -44,7 +45,7 @@ Returns: The Span set in the context if it exists. INVALID_SPAN otherwise. """ - span = get_value(SPAN_KEY, context=context) + span = get_value(_SPAN_KEY, context=context) if span is None or not isinstance(span, Span): return INVALID_SPAN return span diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/src/opentelemetry/trace/propagation/tracecontext.py new/opentelemetry-api-1.5.0/src/opentelemetry/trace/propagation/tracecontext.py --- old/opentelemetry-api-1.1.0/src/opentelemetry/trace/propagation/tracecontext.py 2021-04-20 23:27:16.000000000 +0200 +++ new/opentelemetry-api-1.5.0/src/opentelemetry/trace/propagation/tracecontext.py 2021-08-26 11:27:39.000000000 +0200 @@ -43,14 +43,17 @@ See `opentelemetry.propagators.textmap.TextMapPropagator.extract` """ + if context is None: + context = Context() + header = getter.get(carrier, self._TRACEPARENT_HEADER_NAME) if not header: - return trace.set_span_in_context(trace.INVALID_SPAN, context) + return context match = re.search(self._TRACEPARENT_HEADER_FORMAT_RE, header[0]) if not match: - return trace.set_span_in_context(trace.INVALID_SPAN, context) + return context version = match.group(1) trace_id = match.group(2) @@ -58,13 +61,13 @@ trace_flags = match.group(4) if trace_id == "0" * 32 or span_id == "0" * 16: - return trace.set_span_in_context(trace.INVALID_SPAN, context) + return context if version == "00": if match.group(5): - return trace.set_span_in_context(trace.INVALID_SPAN, context) + return context if version == "ff": - return trace.set_span_in_context(trace.INVALID_SPAN, context) + return context tracestate_headers = getter.get(carrier, self._TRACESTATE_HEADER_NAME) if tracestate_headers is None: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/src/opentelemetry/trace/span.py new/opentelemetry-api-1.5.0/src/opentelemetry/trace/span.py --- old/opentelemetry-api-1.1.0/src/opentelemetry/trace/span.py 2021-04-20 23:27:16.000000000 +0200 +++ new/opentelemetry-api-1.5.0/src/opentelemetry/trace/span.py 2021-08-26 11:27:39.000000000 +0200 @@ -389,6 +389,7 @@ DEFAULT_TRACE_STATE = TraceState.get_default() +_TRACE_ID_HEX_LENGTH = 2 ** 128 - 1 class SpanContext( @@ -420,7 +421,11 @@ if trace_state is None: trace_state = DEFAULT_TRACE_STATE - is_valid = trace_id != INVALID_TRACE_ID and span_id != INVALID_SPAN_ID + is_valid = ( + trace_id != INVALID_TRACE_ID + and span_id != INVALID_SPAN_ID + and trace_id < _TRACE_ID_HEX_LENGTH + ) return tuple.__new__( cls, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/src/opentelemetry/util/_time.py new/opentelemetry-api-1.5.0/src/opentelemetry/util/_time.py --- old/opentelemetry-api-1.1.0/src/opentelemetry/util/_time.py 2021-04-20 23:27:16.000000000 +0200 +++ new/opentelemetry-api-1.5.0/src/opentelemetry/util/_time.py 2021-08-26 11:27:39.000000000 +0200 @@ -18,8 +18,8 @@ if version_info.minor < 7: getLogger(__name__).warning( # pylint: disable=logging-not-lazy "You are using Python 3.%s. This version does not support timestamps " - "with nanosecond precision and the Opentelemetry SDK will use " - "millisecond precision instead. Please refer to PEP 546 for more " + "with nanosecond precision and the OpenTelemetry SDK will use " + "millisecond precision instead. Please refer to PEP 564 for more " "information. Please upgrade to Python 3.7 or newer to use nanosecond " "precision." % version_info.minor ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/src/opentelemetry/util/types.py new/opentelemetry-api-1.5.0/src/opentelemetry/util/types.py --- old/opentelemetry-api-1.1.0/src/opentelemetry/util/types.py 2021-04-20 23:27:16.000000000 +0200 +++ new/opentelemetry-api-1.5.0/src/opentelemetry/util/types.py 2021-08-26 11:27:39.000000000 +0200 @@ -20,10 +20,10 @@ bool, int, float, - Sequence[Optional[str]], - Sequence[Optional[bool]], - Sequence[Optional[int]], - Sequence[Optional[float]], + Sequence[str], + Sequence[bool], + Sequence[int], + Sequence[float], ] Attributes = Optional[Mapping[str, AttributeValue]] AttributesAsKey = Tuple[ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/src/opentelemetry/version.py new/opentelemetry-api-1.5.0/src/opentelemetry/version.py --- old/opentelemetry-api-1.1.0/src/opentelemetry/version.py 2021-04-20 23:27:16.000000000 +0200 +++ new/opentelemetry-api-1.5.0/src/opentelemetry/version.py 2021-08-26 11:27:39.000000000 +0200 @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "1.1.0" +__version__ = "1.5.0" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/src/opentelemetry_api.egg-info/PKG-INFO new/opentelemetry-api-1.5.0/src/opentelemetry_api.egg-info/PKG-INFO --- old/opentelemetry-api-1.1.0/src/opentelemetry_api.egg-info/PKG-INFO 2021-04-20 23:27:19.000000000 +0200 +++ new/opentelemetry-api-1.5.0/src/opentelemetry_api.egg-info/PKG-INFO 2021-08-26 11:27:42.000000000 +0200 @@ -1,31 +1,11 @@ Metadata-Version: 2.1 Name: opentelemetry-api -Version: 1.1.0 +Version: 1.5.0 Summary: OpenTelemetry Python API Home-page: https://github.com/open-telemetry/opentelemetry-python/tree/main/opentelemetry-api Author: OpenTelemetry Authors Author-email: cncf-opentelemetry-contribut...@lists.cncf.io License: Apache-2.0 -Description: OpenTelemetry Python API - ============================================================================ - - |pypi| - - .. |pypi| image:: https://badge.fury.io/py/opentelemetry-api.svg - :target: https://pypi.org/project/opentelemetry-api/ - - Installation - ------------ - - :: - - pip install opentelemetry-api - - References - ---------- - - * `OpenTelemetry Project <https://opentelemetry.io/>`_ - Platform: any Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers @@ -36,6 +16,30 @@ Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 +Classifier: Typing :: Typed Requires-Python: >=3.6 Description-Content-Type: text/x-rst Provides-Extra: test +License-File: LICENSE + +OpenTelemetry Python API +============================================================================ + +|pypi| + +.. |pypi| image:: https://badge.fury.io/py/opentelemetry-api.svg + :target: https://pypi.org/project/opentelemetry-api/ + +Installation +------------ + +:: + + pip install opentelemetry-api + +References +---------- + +* `OpenTelemetry Project <https://opentelemetry.io/>`_ + + diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/src/opentelemetry_api.egg-info/SOURCES.txt new/opentelemetry-api-1.5.0/src/opentelemetry_api.egg-info/SOURCES.txt --- old/opentelemetry-api-1.1.0/src/opentelemetry_api.egg-info/SOURCES.txt 2021-04-20 23:27:19.000000000 +0200 +++ new/opentelemetry-api-1.5.0/src/opentelemetry_api.egg-info/SOURCES.txt 2021-08-26 11:27:42.000000000 +0200 @@ -5,10 +5,10 @@ setup.py src/opentelemetry/py.typed src/opentelemetry/version.py +src/opentelemetry/attributes/__init__.py src/opentelemetry/baggage/__init__.py src/opentelemetry/baggage/propagation/__init__.py src/opentelemetry/context/__init__.py -src/opentelemetry/context/aiocontextvarsfix.py src/opentelemetry/context/context.py src/opentelemetry/context/contextvars_context.py src/opentelemetry/environment_variables/__init__.py @@ -33,6 +33,7 @@ tests/__init__.py tests/mypysmoke.py tests/test_implementation.py +tests/attributes/test_attributes.py tests/baggage/test_baggage.py tests/baggage/test_baggage_propagation.py tests/context/__init__.py diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/src/opentelemetry_api.egg-info/requires.txt new/opentelemetry-api-1.5.0/src/opentelemetry_api.egg-info/requires.txt --- old/opentelemetry-api-1.1.0/src/opentelemetry_api.egg-info/requires.txt 2021-04-20 23:27:19.000000000 +0200 +++ new/opentelemetry-api-1.5.0/src/opentelemetry_api.egg-info/requires.txt 2021-08-26 11:27:42.000000000 +0200 @@ -1,3 +1,4 @@ +Deprecated>=1.2.6 [:python_version < "3.7"] aiocontextvars diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/tests/attributes/test_attributes.py new/opentelemetry-api-1.5.0/tests/attributes/test_attributes.py --- old/opentelemetry-api-1.1.0/tests/attributes/test_attributes.py 1970-01-01 01:00:00.000000000 +0100 +++ new/opentelemetry-api-1.5.0/tests/attributes/test_attributes.py 2021-08-26 11:27:39.000000000 +0200 @@ -0,0 +1,163 @@ +# 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 + +import collections +import unittest +from typing import MutableSequence + +from opentelemetry.attributes import BoundedAttributes, _clean_attribute + + +class TestAttributes(unittest.TestCase): + def assertValid(self, value, key="k"): + expected = value + if isinstance(value, MutableSequence): + expected = tuple(value) + self.assertEqual(_clean_attribute(key, value, None), expected) + + def assertInvalid(self, value, key="k"): + self.assertIsNone(_clean_attribute(key, value, None)) + + def test_attribute_key_validation(self): + # only non-empty strings are valid keys + self.assertInvalid(1, "") + self.assertInvalid(1, 1) + self.assertInvalid(1, {}) + self.assertInvalid(1, []) + self.assertInvalid(1, b"1") + self.assertValid(1, "k") + self.assertValid(1, "1") + + def test_clean_attribute(self): + self.assertInvalid([1, 2, 3.4, "ss", 4]) + self.assertInvalid([dict(), 1, 2, 3.4, 4]) + self.assertInvalid(["sw", "lf", 3.4, "ss"]) + self.assertInvalid([1, 2, 3.4, 5]) + self.assertInvalid(dict()) + self.assertInvalid([1, True]) + self.assertValid(True) + self.assertValid("hi") + self.assertValid(3.4) + self.assertValid(15) + self.assertValid([1, 2, 3, 5]) + self.assertValid([1.2, 2.3, 3.4, 4.5]) + self.assertValid([True, False]) + self.assertValid(["ss", "dw", "fw"]) + self.assertValid([]) + # None in sequences are valid + self.assertValid(["A", None, None]) + self.assertValid(["A", None, None, "B"]) + self.assertValid([None, None]) + self.assertInvalid(["A", None, 1]) + self.assertInvalid([None, "A", None, 1]) + + # test keys + self.assertValid("value", "key") + self.assertInvalid("value", "") + self.assertInvalid("value", None) + + +class TestBoundedAttributes(unittest.TestCase): + base = collections.OrderedDict( + [ + ("name", "Firulais"), + ("age", 7), + ("weight", 13), + ("vaccinated", True), + ] + ) + + def test_negative_maxlen(self): + with self.assertRaises(ValueError): + BoundedAttributes(-1) + + def test_from_map(self): + dic_len = len(self.base) + base_copy = collections.OrderedDict(self.base) + bdict = BoundedAttributes(dic_len, base_copy) + + self.assertEqual(len(bdict), dic_len) + + # modify base_copy and test that bdict is not changed + base_copy["name"] = "Bruno" + base_copy["age"] = 3 + + for key in self.base: + self.assertEqual(bdict[key], self.base[key]) + + # test that iter yields the correct number of elements + self.assertEqual(len(tuple(bdict)), dic_len) + + # map too big + half_len = dic_len // 2 + bdict = BoundedAttributes(half_len, self.base) + self.assertEqual(len(tuple(bdict)), half_len) + self.assertEqual(bdict.dropped, dic_len - half_len) + + def test_bounded_dict(self): + # create empty dict + dic_len = len(self.base) + bdict = BoundedAttributes(dic_len, immutable=False) + self.assertEqual(len(bdict), 0) + + # fill dict + for key in self.base: + bdict[key] = self.base[key] + + self.assertEqual(len(bdict), dic_len) + self.assertEqual(bdict.dropped, 0) + + for key in self.base: + self.assertEqual(bdict[key], self.base[key]) + + # test __iter__ in BoundedAttributes + for key in bdict: + self.assertEqual(bdict[key], self.base[key]) + + # updating an existing element should not drop + bdict["name"] = "Bruno" + self.assertEqual(bdict.dropped, 0) + + # try to append more elements + for key in self.base: + bdict["new-" + key] = self.base[key] + + self.assertEqual(len(bdict), dic_len) + self.assertEqual(bdict.dropped, dic_len) + + # test that elements in the dict are the new ones + for key in self.base: + self.assertEqual(bdict["new-" + key], self.base[key]) + + # delete an element + del bdict["new-name"] + self.assertEqual(len(bdict), dic_len - 1) + + with self.assertRaises(KeyError): + _ = bdict["new-name"] + + def test_no_limit_code(self): + bdict = BoundedAttributes(maxlen=None, immutable=False) + for num in range(100): + bdict[str(num)] = num + + for num in range(100): + self.assertEqual(bdict[str(num)], num) + + def test_immutable(self): + bdict = BoundedAttributes() + with self.assertRaises(TypeError): + bdict["should-not-work"] = "dict immutable" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/tests/context/test_context.py new/opentelemetry-api-1.5.0/tests/context/test_context.py --- old/opentelemetry-api-1.1.0/tests/context/test_context.py 2021-04-20 23:27:16.000000000 +0200 +++ new/opentelemetry-api-1.5.0/tests/context/test_context.py 2021-08-26 11:27:39.000000000 +0200 @@ -18,27 +18,39 @@ from opentelemetry.context.context import Context -def do_work() -> None: - context.attach(context.set_value("say", "bar")) +def _do_work() -> str: + key = context.create_key("say") + context.attach(context.set_value(key, "bar")) + return key class TestContext(unittest.TestCase): def setUp(self): context.attach(Context()) + def test_context_key(self): + key1 = context.create_key("say") + key2 = context.create_key("say") + self.assertNotEqual(key1, key2) + first = context.set_value(key1, "foo") + second = context.set_value(key2, "bar") + self.assertEqual(context.get_value(key1, context=first), "foo") + self.assertEqual(context.get_value(key2, context=second), "bar") + def test_context(self): - self.assertIsNone(context.get_value("say")) + key1 = context.create_key("say") + self.assertIsNone(context.get_value(key1)) empty = context.get_current() - second = context.set_value("say", "foo") - self.assertEqual(context.get_value("say", context=second), "foo") + second = context.set_value(key1, "foo") + self.assertEqual(context.get_value(key1, context=second), "foo") - do_work() - self.assertEqual(context.get_value("say"), "bar") + key2 = _do_work() + self.assertEqual(context.get_value(key2), "bar") third = context.get_current() - self.assertIsNone(context.get_value("say", context=empty)) - self.assertEqual(context.get_value("say", context=second), "foo") - self.assertEqual(context.get_value("say", context=third), "bar") + self.assertIsNone(context.get_value(key1, context=empty)) + self.assertEqual(context.get_value(key1, context=second), "foo") + self.assertEqual(context.get_value(key2, context=third), "bar") def test_set_value(self): first = context.set_value("a", "yyy") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/tests/context/test_contextvars_context.py new/opentelemetry-api-1.5.0/tests/context/test_contextvars_context.py --- old/opentelemetry-api-1.1.0/tests/context/test_contextvars_context.py 2021-04-20 23:27:16.000000000 +0200 +++ new/opentelemetry-api-1.5.0/tests/context/test_contextvars_context.py 2021-08-26 11:27:39.000000000 +0200 @@ -12,22 +12,13 @@ # See the License for the specific language governing permissions and # limitations under the License. -import unittest from unittest.mock import patch from opentelemetry import context +from opentelemetry.context.contextvars_context import ContextVarsRuntimeContext from .base_context import ContextTestCases -try: - import contextvars # pylint: disable=unused-import - - from opentelemetry.context.contextvars_context import ( - ContextVarsRuntimeContext, - ) -except ImportError: - raise unittest.SkipTest("contextvars not available") - class TestContextVarsContext(ContextTestCases.BaseTest): def setUp(self) -> None: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/tests/propagators/test_composite.py new/opentelemetry-api-1.5.0/tests/propagators/test_composite.py --- old/opentelemetry-api-1.1.0/tests/propagators/test_composite.py 2021-04-20 23:27:16.000000000 +0200 +++ new/opentelemetry-api-1.5.0/tests/propagators/test_composite.py 2021-08-26 11:27:39.000000000 +0200 @@ -17,7 +17,7 @@ import unittest from unittest.mock import Mock -from opentelemetry.propagators.composite import CompositeHTTPPropagator +from opentelemetry.propagators.composite import CompositePropagator def get_as_list(dict_object, key): @@ -67,7 +67,7 @@ ) def test_no_propagators(self): - propagator = CompositeHTTPPropagator([]) + propagator = CompositePropagator([]) new_carrier = {} propagator.inject(new_carrier) self.assertEqual(new_carrier, {}) @@ -78,7 +78,7 @@ self.assertEqual(context, {}) def test_single_propagator(self): - propagator = CompositeHTTPPropagator([self.mock_propagator_0]) + propagator = CompositePropagator([self.mock_propagator_0]) new_carrier = {} propagator.inject(new_carrier) @@ -90,7 +90,7 @@ self.assertEqual(context, {"mock-0": "context"}) def test_multiple_propagators(self): - propagator = CompositeHTTPPropagator( + propagator = CompositePropagator( [self.mock_propagator_0, self.mock_propagator_1] ) @@ -106,7 +106,7 @@ def test_multiple_propagators_same_key(self): # test that when multiple propagators extract/inject the same # key, the later propagator values are extracted/injected - propagator = CompositeHTTPPropagator( + propagator = CompositePropagator( [self.mock_propagator_0, self.mock_propagator_2] ) @@ -120,7 +120,7 @@ self.assertEqual(context, {"mock-0": "context2"}) def test_fields(self): - propagator = CompositeHTTPPropagator( + propagator = CompositePropagator( [ self.mock_propagator_0, self.mock_propagator_1, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/tests/propagators/test_propagators.py new/opentelemetry-api-1.5.0/tests/propagators/test_propagators.py --- old/opentelemetry-api-1.1.0/tests/propagators/test_propagators.py 2021-04-20 23:27:16.000000000 +0200 +++ new/opentelemetry-api-1.5.0/tests/propagators/test_propagators.py 2021-08-26 11:27:39.000000000 +0200 @@ -27,7 +27,7 @@ class TestPropagators(TestCase): - @patch("opentelemetry.propagators.composite.CompositeHTTPPropagator") + @patch("opentelemetry.propagators.composite.CompositePropagator") def test_default_composite_propagators(self, mock_compositehttppropagator): def test_propagators(propagators): @@ -48,7 +48,7 @@ reload(opentelemetry.propagate) @patch.dict(environ, {OTEL_PROPAGATORS: "a,b,c"}) - @patch("opentelemetry.propagators.composite.CompositeHTTPPropagator") + @patch("opentelemetry.propagators.composite.CompositePropagator") @patch("pkg_resources.iter_entry_points") def test_non_default_propagators( self, mock_iter_entry_points, mock_compositehttppropagator diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/tests/trace/propagation/test_tracecontexthttptextformat.py new/opentelemetry-api-1.5.0/tests/trace/propagation/test_tracecontexthttptextformat.py --- old/opentelemetry-api-1.1.0/tests/trace/propagation/test_tracecontexthttptextformat.py 2021-04-20 23:27:16.000000000 +0200 +++ new/opentelemetry-api-1.5.0/tests/trace/propagation/test_tracecontexthttptextformat.py 2021-08-26 11:27:39.000000000 +0200 @@ -19,6 +19,7 @@ from unittest.mock import Mock, patch from opentelemetry import trace +from opentelemetry.context import Context from opentelemetry.trace.propagation import tracecontext from opentelemetry.trace.span import TraceState @@ -270,3 +271,51 @@ inject_fields.add(mock_call[1][1]) self.assertEqual(inject_fields, FORMAT.fields) + + def test_extract_no_trace_parent_to_explicit_ctx(self): + carrier = {"tracestate": ["foo=1"]} + orig_ctx = Context({"k1": "v1"}) + + ctx = FORMAT.extract(carrier, orig_ctx) + self.assertDictEqual(orig_ctx, ctx) + + def test_extract_no_trace_parent_to_implicit_ctx(self): + carrier = {"tracestate": ["foo=1"]} + + ctx = FORMAT.extract(carrier) + self.assertDictEqual(Context(), ctx) + + def test_extract_invalid_trace_parent_to_explicit_ctx(self): + trace_parent_headers = [ + "invalid", + "00-00000000000000000000000000000000-1234567890123456-00", + "00-12345678901234567890123456789012-0000000000000000-00", + "00-12345678901234567890123456789012-1234567890123456-00-residue", + ] + for trace_parent in trace_parent_headers: + with self.subTest(trace_parent=trace_parent): + carrier = { + "traceparent": [trace_parent], + "tracestate": ["foo=1"], + } + orig_ctx = Context({"k1": "v1"}) + + ctx = FORMAT.extract(carrier, orig_ctx) + self.assertDictEqual(orig_ctx, ctx) + + def test_extract_invalid_trace_parent_to_implicit_ctx(self): + trace_parent_headers = [ + "invalid", + "00-00000000000000000000000000000000-1234567890123456-00", + "00-12345678901234567890123456789012-0000000000000000-00", + "00-12345678901234567890123456789012-1234567890123456-00-residue", + ] + for trace_parent in trace_parent_headers: + with self.subTest(trace_parent=trace_parent): + carrier = { + "traceparent": [trace_parent], + "tracestate": ["foo=1"], + } + + ctx = FORMAT.extract(carrier) + self.assertDictEqual(Context(), ctx) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opentelemetry-api-1.1.0/tests/trace/test_span_context.py new/opentelemetry-api-1.5.0/tests/trace/test_span_context.py --- old/opentelemetry-api-1.1.0/tests/trace/test_span_context.py 2021-04-20 23:27:16.000000000 +0200 +++ new/opentelemetry-api-1.5.0/tests/trace/test_span_context.py 2021-08-26 11:27:39.000000000 +0200 @@ -34,3 +34,12 @@ pickle_sc = pickle.loads(pickle.dumps(sc)) self.assertEqual(sc.trace_id, pickle_sc.trace_id) self.assertEqual(sc.span_id, pickle_sc.span_id) + + invalid_sc = trace.SpanContext( + 9999999999999999999999999999999999999999999999999999999999999999999999999999, + 9, + is_remote=False, + trace_flags=trace.DEFAULT_TRACE_OPTIONS, + trace_state=trace.DEFAULT_TRACE_STATE, + ) + self.assertFalse(invalid_sc.is_valid)