diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c727a3abce..fffd6e238f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +- Apply fixes for `UP` ruff rule + ([#5132](https://github.com/open-telemetry/opentelemetry-python/pull/5132)) - Fix incorrect code example in `create_tracer()` docstring ([#5072](https://github.com/open-telemetry/opentelemetry-python/issues/5072)) - `opentelemetry-sdk`: add `load_entry_point` shared utility to declarative file configuration for loading plugins via entry points; refactor propagator loading to use it diff --git a/codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/generator.py b/codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/generator.py index acceb503ff8..74ee47c28bf 100644 --- a/codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/generator.py +++ b/codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/generator.py @@ -18,9 +18,9 @@ import logging from collections import defaultdict -from collections.abc import Iterable +from collections.abc import Callable, Iterable from pathlib import Path -from typing import Callable, Final, Optional, Set +from typing import Final from google.protobuf import descriptor_pb2 as descriptor from google.protobuf.compiler import plugin_pb2 as plugin @@ -136,7 +136,7 @@ def _index_message( msg_desc: descriptor.DescriptorProto, package: str, file_name: str, - parent_path: Optional[str], + parent_path: str | None, ) -> None: """ Recursively index a message and its nested types. @@ -376,7 +376,7 @@ def _generate_imports( writer.blank_line() writer.blank_line() - def _collect_imports(self, proto_file: str) -> Set[str]: + def _collect_imports(self, proto_file: str) -> set[str]: """ Collect all import statements needed for cross file references. @@ -432,7 +432,7 @@ def _generate_message_class( writer: CodeWriter, proto_file: str, msg_desc: descriptor.DescriptorProto, - parent_path: Optional[str] = None, + parent_path: str | None = None, ) -> None: """ Generate a complete dataclass for a protobuf message. @@ -962,7 +962,7 @@ def _resolve_enum_type(self, type_name: str, proto_file: str) -> str: @classmethod def _get_field_default( cls, field_desc: descriptor.FieldDescriptorProto - ) -> Optional[str]: + ) -> str | None: """ Get the default value for a field. diff --git a/codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/runtime/json_codec.py b/codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/runtime/json_codec.py index da1f40b0484..318a3ee9479 100644 --- a/codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/runtime/json_codec.py +++ b/codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/runtime/json_codec.py @@ -49,14 +49,14 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls: type[M], data: typing.Union[str, bytes]) -> M: + def from_json(cls: type[M], data: str | bytes) -> M: """ Deserialize from a JSON string or bytes. """ return cls.from_dict(json.loads(data)) -def encode_hex(value: typing.Optional[bytes]) -> str: +def encode_hex(value: bytes | None) -> str: """ Encode bytes as hex string. @@ -68,7 +68,7 @@ def encode_hex(value: typing.Optional[bytes]) -> str: return value.hex() if value else "" -def encode_base64(value: typing.Optional[bytes]) -> str: +def encode_base64(value: bytes | None) -> str: """ Encode bytes as base64 string. Standard Proto3 JSON mapping for bytes. @@ -94,7 +94,7 @@ def encode_int64(value: int) -> str: return str(value) -def encode_float(value: float) -> typing.Union[float, str]: +def encode_float(value: float) -> float | str: """ Encode float/double values. @@ -111,7 +111,7 @@ def encode_float(value: float) -> typing.Union[float, str]: def encode_repeated( - values: typing.Optional[list[T]], + values: list[T] | None, map_fn: typing.Callable[[T], typing.Any], ) -> list[typing.Any]: """ @@ -126,7 +126,7 @@ def encode_repeated( return [map_fn(v) for v in values] if values else [] -def decode_hex(value: typing.Optional[str], field_name: str) -> bytes: +def decode_hex(value: str | None, field_name: str) -> bytes: """ Decode hex string to bytes. @@ -147,7 +147,7 @@ def decode_hex(value: typing.Optional[str], field_name: str) -> bytes: ) from None -def decode_base64(value: typing.Optional[str], field_name: str) -> bytes: +def decode_base64(value: str | None, field_name: str) -> bytes: """ Decode base64 string to bytes. @@ -168,9 +168,7 @@ def decode_base64(value: typing.Optional[str], field_name: str) -> bytes: ) from None -def decode_int64( - value: typing.Optional[typing.Union[int, str]], field_name: str -) -> int: +def decode_int64(value: int | str | None, field_name: str) -> int: """ Parse int64 from number or string. @@ -191,9 +189,7 @@ def decode_int64( ) from None -def decode_float( - value: typing.Optional[typing.Union[float, int, str]], field_name: str -) -> float: +def decode_float(value: float | int | str | None, field_name: str) -> float: """ Parse float/double from number or string, handling special values. @@ -221,7 +217,7 @@ def decode_float( def decode_repeated( - values: typing.Optional[list[typing.Any]], + values: list[typing.Any] | None, item_parser: typing.Callable[[typing.Any], T], field_name: str, ) -> list[T]: @@ -243,7 +239,7 @@ def decode_repeated( def validate_type( value: typing.Any, - expected_types: typing.Union[type, tuple[type, ...]], + expected_types: type | tuple[type, ...], field_name: str, ) -> None: """ diff --git a/codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/writer.py b/codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/writer.py index 687de172d5b..12c13f1fbd9 100644 --- a/codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/writer.py +++ b/codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/writer.py @@ -14,9 +14,9 @@ from __future__ import annotations -from collections.abc import Iterable +from collections.abc import Generator, Iterable from contextlib import contextmanager -from typing import Any, Generator, Optional, Union +from typing import Any # pylint: disable-next=too-many-public-methods @@ -72,7 +72,7 @@ def writemany(self, *lines: str) -> CodeWriter: self.writeln(line) return self - def comment(self, content: Union[str, Iterable[str]]) -> CodeWriter: + def comment(self, content: str | Iterable[str]) -> CodeWriter: """ Writes a comment line or block. If content is a string, it writes a single comment line. @@ -88,7 +88,7 @@ def comment(self, content: Union[str, Iterable[str]]) -> CodeWriter: self.writeln(f"# {line}" if line else "#") return self - def docstring(self, content: Union[str, Iterable[str]]) -> CodeWriter: + def docstring(self, content: str | Iterable[str]) -> CodeWriter: """ Writes a docstring. If content is a string, it writes a single-line docstring. If content is an iterable of strings, it writes a multi-line docstring. @@ -139,8 +139,8 @@ def block(self, header: str) -> Generator[CodeWriter, None, None]: def class_( self, name: str, - bases: Optional[Iterable[str]] = None, - decorators: Optional[Iterable[str]] = None, + bases: Iterable[str] | None = None, + decorators: Iterable[str] | None = None, ) -> Generator[CodeWriter, None, None]: """ Generate a class definition with optional base classes and decorators. @@ -164,8 +164,8 @@ def class_( def dataclass( self, name: str, - bases: Optional[Iterable[str]] = None, - decorators: Optional[Iterable[str]] = None, + bases: Iterable[str] | None = None, + decorators: Iterable[str] | None = None, frozen: bool = False, slots: bool = False, decorator_name: str = "dataclasses.dataclass", @@ -212,8 +212,8 @@ def enum( self, name: str, enum_type: str = "enum.Enum", - bases: Optional[Iterable[str]] = None, - decorators: Optional[Iterable[str]] = None, + bases: Iterable[str] | None = None, + decorators: Iterable[str] | None = None, ) -> Generator[CodeWriter, None, None]: """ Generate an enum definition with optional base classes and decorators. @@ -243,7 +243,7 @@ def field( name: str, type_hint: str, default: Any = None, - default_factory: Optional[str] = None, + default_factory: str | None = None, ) -> CodeWriter: """ Write a dataclass field with optional default value or default factory. @@ -279,9 +279,9 @@ def enum_member(self, name: str, value: Any) -> CodeWriter: def function( self, name: str, - params: Union[Iterable[str], str], - decorators: Optional[Iterable[str]] = None, - return_type: Optional[str] = None, + params: Iterable[str] | str, + decorators: Iterable[str] | None = None, + return_type: str | None = None, ) -> Generator[CodeWriter, None, None]: """ Create a function definition with optional decorators and return type. @@ -307,9 +307,9 @@ def function( def method( self, name: str, - params: Union[Iterable[str], str], - decorators: Optional[Iterable[str]] = None, - return_type: Optional[str] = None, + params: Iterable[str] | str, + decorators: Iterable[str] | None = None, + return_type: str | None = None, ) -> Generator[CodeWriter, None, None]: """ Create a method definition within a class with optional decorators and return type. @@ -386,7 +386,7 @@ def while_(self, condition: str) -> Generator[CodeWriter, None, None]: yield self def assignment( - self, var: str, value: str, type_hint: Optional[str] = None + self, var: str, value: str, type_hint: str | None = None ) -> CodeWriter: """ Write a variable assignment with optional type hint @@ -404,7 +404,7 @@ def assignment( self.writeln(f"{var} = {value}") return self - def return_(self, value: Optional[str] = None) -> CodeWriter: + def return_(self, value: str | None = None) -> CodeWriter: """ Write a return statement with an optional return value diff --git a/codegen/opentelemetry-codegen-json/tests/test_json_codec.py b/codegen/opentelemetry-codegen-json/tests/test_json_codec.py index 3cfa07b764d..c63b7259929 100644 --- a/codegen/opentelemetry-codegen-json/tests/test_json_codec.py +++ b/codegen/opentelemetry-codegen-json/tests/test_json_codec.py @@ -13,7 +13,6 @@ # limitations under the License. import math -from typing import Optional, Union import pytest # type: ignore @@ -40,7 +39,7 @@ (None, ""), ], ) -def test_encode_hex(value: Optional[bytes], expected: str) -> None: +def test_encode_hex(value: bytes | None, expected: str) -> None: assert encode_hex(value) == expected @@ -52,7 +51,7 @@ def test_encode_hex(value: Optional[bytes], expected: str) -> None: (None, b""), ], ) -def test_decode_hex(value: Optional[str], expected: bytes) -> None: +def test_decode_hex(value: str | None, expected: bytes) -> None: assert decode_hex(value, "field") == expected @@ -71,7 +70,7 @@ def test_decode_hex_errors() -> None: (None, ""), ], ) -def test_encode_base64(value: Optional[bytes], expected: str) -> None: +def test_encode_base64(value: bytes | None, expected: str) -> None: assert encode_base64(value) == expected @@ -83,7 +82,7 @@ def test_encode_base64(value: Optional[bytes], expected: str) -> None: (None, b""), ], ) -def test_decode_base64(value: Optional[str], expected: bytes) -> None: +def test_decode_base64(value: str | None, expected: bytes) -> None: assert decode_base64(value, "field") == expected @@ -112,7 +111,7 @@ def test_encode_int64(value: int, expected: str) -> None: (None, 0), ], ) -def test_decode_int64(value: Optional[Union[int, str]], expected: int) -> None: +def test_decode_int64(value: int | str | None, expected: int) -> None: assert decode_int64(value, "field") == expected @@ -132,7 +131,7 @@ def test_decode_int64_errors() -> None: (float("-inf"), "-Infinity"), ], ) -def test_encode_float(value: float, expected: Union[float, str]) -> None: +def test_encode_float(value: float, expected: float | str) -> None: result = encode_float(value) if isinstance(expected, float) and math.isnan(expected): assert math.isnan(result) # type: ignore @@ -153,7 +152,7 @@ def test_encode_float(value: float, expected: Union[float, str]) -> None: ], ) def test_decode_float( - value: Optional[Union[float, int, str]], expected: float + value: float | int | str | None, expected: float ) -> None: result = decode_float(value, "field") if math.isnan(expected): diff --git a/codegen/opentelemetry-codegen-json/tests/test_protobuf_compatibility.py b/codegen/opentelemetry-codegen-json/tests/test_protobuf_compatibility.py index 19f30be795e..2b76e3e81af 100644 --- a/codegen/opentelemetry-codegen-json/tests/test_protobuf_compatibility.py +++ b/codegen/opentelemetry-codegen-json/tests/test_protobuf_compatibility.py @@ -16,7 +16,7 @@ # ruff: noqa: PLC0415 import base64 -from typing import Any, Type +from typing import Any import pytest # type: ignore from google.protobuf import json_format @@ -39,7 +39,7 @@ def normalize_otlp_json(data: Any) -> Any: @pytest.fixture -def test_msg_classes() -> tuple[Type[Any], Type[Any], Type[Any]]: +def test_msg_classes() -> tuple[type[Any], type[Any], type[Any]]: from otel_test_json.test.v1.test import ( # type: ignore SubMessage as JSONSubMessage, # type: ignore ) @@ -54,7 +54,7 @@ def test_msg_classes() -> tuple[Type[Any], Type[Any], Type[Any]]: @pytest.fixture -def numeric_msg_classes() -> tuple[Type[Any], Type[Any]]: +def numeric_msg_classes() -> tuple[type[Any], type[Any]]: from otel_test_json.test.v1.complex import ( # type: ignore NumericTest as JSONNumericTest, # type: ignore ) @@ -66,7 +66,7 @@ def numeric_msg_classes() -> tuple[Type[Any], Type[Any]]: @pytest.fixture -def oneof_msg_classes() -> tuple[Type[Any], Type[Any], Type[Any]]: +def oneof_msg_classes() -> tuple[type[Any], type[Any], type[Any]]: from otel_test_json.common.v1.common import ( # type: ignore InstrumentationScope as JSONScope, ) @@ -81,7 +81,7 @@ def oneof_msg_classes() -> tuple[Type[Any], Type[Any], Type[Any]]: @pytest.fixture -def optional_msg_classes() -> tuple[Type[Any], Type[Any]]: +def optional_msg_classes() -> tuple[type[Any], type[Any]]: from otel_test_json.test.v1.complex import ( # type: ignore OptionalScalar as JSONOptionalScalar, ) @@ -93,7 +93,7 @@ def optional_msg_classes() -> tuple[Type[Any], Type[Any]]: def test_parity_test_message( - test_msg_classes: tuple[Type[Any], Type[Any], Type[Any]], + test_msg_classes: tuple[type[Any], type[Any], type[Any]], ) -> None: JSONTestMessage, JSONSubMessage, ProtoTestMessage = test_msg_classes @@ -147,7 +147,7 @@ def test_parity_test_message( ], ) def test_parity_numeric_test( - numeric_msg_classes: tuple[Type[Any], Type[Any]], values: dict[str, Any] + numeric_msg_classes: tuple[type[Any], type[Any]], values: dict[str, Any] ) -> None: JSONNumericTest, ProtoNumericTest = numeric_msg_classes @@ -171,7 +171,7 @@ def test_parity_numeric_test( ], ) def test_parity_oneof_suite( - oneof_msg_classes: tuple[Type[Any], Type[Any], Type[Any]], + oneof_msg_classes: tuple[type[Any], type[Any], type[Any]], branch_data: dict[str, Any], ) -> None: JSONOneofSuite, ProtoOneofSuite, JSONScope = oneof_msg_classes @@ -215,7 +215,7 @@ def test_parity_oneof_suite( ], ) def test_parity_optional_scalars( - optional_msg_classes: tuple[Type[Any], Type[Any]], kwargs: dict[str, Any] + optional_msg_classes: tuple[type[Any], type[Any]], kwargs: dict[str, Any] ) -> None: JSONOptionalScalar, ProtoOptionalScalar = optional_msg_classes diff --git a/codegen/opentelemetry-codegen-json/tests/test_serde.py b/codegen/opentelemetry-codegen-json/tests/test_serde.py index 67db5366196..2ef8e33c704 100644 --- a/codegen/opentelemetry-codegen-json/tests/test_serde.py +++ b/codegen/opentelemetry-codegen-json/tests/test_serde.py @@ -17,13 +17,13 @@ import json import math -from typing import Any, Type +from typing import Any import pytest # type: ignore @pytest.fixture -def test_v1_types() -> tuple[Type[Any], Type[Any]]: +def test_v1_types() -> tuple[type[Any], type[Any]]: from otel_test_json.test.v1.test import ( # type: ignore SubMessage, TestMessage, @@ -33,7 +33,7 @@ def test_v1_types() -> tuple[Type[Any], Type[Any]]: @pytest.fixture -def common_v1_types() -> Type[Any]: +def common_v1_types() -> type[Any]: from otel_test_json.common.v1.common import ( # type: ignore InstrumentationScope, # type: ignore ) @@ -42,7 +42,7 @@ def common_v1_types() -> Type[Any]: @pytest.fixture -def trace_v1_types() -> Type[Any]: +def trace_v1_types() -> type[Any]: from otel_test_json.trace.v1.trace import Span # type: ignore return Span @@ -50,7 +50,7 @@ def trace_v1_types() -> Type[Any]: @pytest.fixture def complex_v1_types() -> tuple[ - Type[Any], Type[Any], Type[Any], Type[Any], Type[Any] + type[Any], type[Any], type[Any], type[Any], type[Any] ]: from otel_test_json.test.v1.complex import ( # type: ignore DeeplyNested, @@ -70,7 +70,7 @@ def complex_v1_types() -> tuple[ def test_generated_message_roundtrip( - test_v1_types: tuple[Type[Any], Type[Any]], + test_v1_types: tuple[type[Any], type[Any]], ) -> None: TestMessage, SubMessage = test_v1_types diff --git a/codegen/opentelemetry-codegen-json/tests/test_writer.py b/codegen/opentelemetry-codegen-json/tests/test_writer.py index e9565e55dec..25a4d9fa8ff 100644 --- a/codegen/opentelemetry-codegen-json/tests/test_writer.py +++ b/codegen/opentelemetry-codegen-json/tests/test_writer.py @@ -11,7 +11,7 @@ # 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. -from typing import Any, Optional +from typing import Any import pytest # type: ignore @@ -106,8 +106,8 @@ def test_suite() -> None: ) def test_class( name: str, - bases: Optional[str], - decorators: Optional[list[str]], + bases: str | None, + decorators: list[str] | None, expected: list[str], ) -> None: writer = CodeWriter() @@ -175,8 +175,8 @@ def test_enum() -> None: def test_field( name: str, type_hint: str, - default: Optional[Any], - default_factory: Optional[Any], + default: Any | None, + default_factory: Any | None, expected: list[str], ) -> None: writer = CodeWriter() diff --git a/docs/api/context.context.rst b/docs/api/context.context.rst deleted file mode 100644 index 331557d2dde..00000000000 --- a/docs/api/context.context.rst +++ /dev/null @@ -1,7 +0,0 @@ -opentelemetry.context.base\_context module -========================================== - -.. automodule:: opentelemetry.context.context - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/api/context.rst b/docs/api/context.rst index 7aef5ffe7d7..e73d8f674b2 100644 --- a/docs/api/context.rst +++ b/docs/api/context.rst @@ -1,14 +1,10 @@ opentelemetry.context package ============================= -Submodules ----------- - -.. toctree:: - - context.context - Module contents --------------- .. automodule:: opentelemetry.context + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/api/trace.rst b/docs/api/trace.rst index 65d9b4d8c88..b59d9dce6f8 100644 --- a/docs/api/trace.rst +++ b/docs/api/trace.rst @@ -1,15 +1,10 @@ opentelemetry.trace package =========================== -Submodules ----------- - -.. toctree:: - - trace.status - trace.span - Module contents --------------- -.. automodule:: opentelemetry.trace \ No newline at end of file +.. automodule:: opentelemetry.trace + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/api/trace.span.rst b/docs/api/trace.span.rst deleted file mode 100644 index 94b36930dfb..00000000000 --- a/docs/api/trace.span.rst +++ /dev/null @@ -1,7 +0,0 @@ -opentelemetry.trace.span -======================== - -.. automodule:: opentelemetry.trace.span - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/api/trace.status.rst b/docs/api/trace.status.rst deleted file mode 100644 index 0205446c808..00000000000 --- a/docs/api/trace.status.rst +++ /dev/null @@ -1,7 +0,0 @@ -opentelemetry.trace.status -========================== - -.. automodule:: opentelemetry.trace.status - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/conf.py b/docs/conf.py index 8ca6a83b5b3..1aab434d716 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -174,6 +174,10 @@ "py:class", "AnyValue", ), + ( + "py:class", + "_ExtendedAttributes", + ), ] # Add any paths that contain templates here, relative to this directory. diff --git a/docs/examples/metrics/instruments/example.py b/docs/examples/metrics/instruments/example.py index 90a9f7fa234..4908515b1ea 100644 --- a/docs/examples/metrics/instruments/example.py +++ b/docs/examples/metrics/instruments/example.py @@ -1,4 +1,4 @@ -from typing import Iterable +from collections.abc import Iterable from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import ( OTLPMetricExporter, diff --git a/docs/examples/metrics/reader/synchronous_gauge_read.py b/docs/examples/metrics/reader/synchronous_gauge_read.py index d45f7ff00da..4032c07c56c 100644 --- a/docs/examples/metrics/reader/synchronous_gauge_read.py +++ b/docs/examples/metrics/reader/synchronous_gauge_read.py @@ -13,7 +13,7 @@ # limitations under the License. import math -from typing import Iterable +from collections.abc import Iterable from opentelemetry.metrics import ( CallbackOptions, diff --git a/docs/examples/metrics/views/change_reservoir_factory.py b/docs/examples/metrics/views/change_reservoir_factory.py index 8f8c676d036..ee70d0621d4 100644 --- a/docs/examples/metrics/views/change_reservoir_factory.py +++ b/docs/examples/metrics/views/change_reservoir_factory.py @@ -14,7 +14,6 @@ import random import time -from typing import Type from opentelemetry import trace from opentelemetry.metrics import get_meter_provider, set_meter_provider @@ -39,7 +38,7 @@ # Create a custom reservoir factory with specified parameters def custom_reservoir_factory( - aggregationType: Type[_Aggregation], + aggregationType: type[_Aggregation], ) -> ExemplarReservoirBuilder: if issubclass(aggregationType, _ExplicitBucketHistogramAggregation): return AlignedHistogramBucketExemplarReservoir diff --git a/docs/examples/metrics/views/limit_num_of_attrs.py b/docs/examples/metrics/views/limit_num_of_attrs.py index d9f0e9484c4..601e9c5cfed 100644 --- a/docs/examples/metrics/views/limit_num_of_attrs.py +++ b/docs/examples/metrics/views/limit_num_of_attrs.py @@ -14,7 +14,7 @@ import random import time -from typing import Iterable +from collections.abc import Iterable from opentelemetry.metrics import ( CallbackOptions, diff --git a/docs/getting_started/metrics_example.py b/docs/getting_started/metrics_example.py index 85df5cc14ed..591d43c559b 100644 --- a/docs/getting_started/metrics_example.py +++ b/docs/getting_started/metrics_example.py @@ -15,7 +15,7 @@ # metrics.py # This is still work in progress as the metrics SDK is being implemented -from typing import Iterable +from collections.abc import Iterable from opentelemetry.metrics import ( CallbackOptions, diff --git a/exporter/opentelemetry-exporter-opencensus/src/opentelemetry/exporter/opencensus/trace_exporter/__init__.py b/exporter/opentelemetry-exporter-opencensus/src/opentelemetry/exporter/opencensus/trace_exporter/__init__.py index 0b79bbb2073..720e46433a2 100644 --- a/exporter/opentelemetry-exporter-opencensus/src/opentelemetry/exporter/opencensus/trace_exporter/__init__.py +++ b/exporter/opentelemetry-exporter-opencensus/src/opentelemetry/exporter/opencensus/trace_exporter/__init__.py @@ -15,7 +15,7 @@ """OpenCensus Span Exporter.""" import logging -from typing import Sequence +from collections.abc import Sequence import grpc from opencensus.proto.agent.trace.v1 import ( diff --git a/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_exporter_metrics.py b/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_exporter_metrics.py index 96d12a8857d..9c3f9171d6d 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_exporter_metrics.py +++ b/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_exporter_metrics.py @@ -15,10 +15,11 @@ from __future__ import annotations from collections import Counter +from collections.abc import Iterator from contextlib import contextmanager from dataclasses import dataclass from time import perf_counter -from typing import TYPE_CHECKING, Iterator +from typing import TYPE_CHECKING from opentelemetry.metrics import MeterProvider, get_meter_provider from opentelemetry.semconv._incubating.attributes.otel_attributes import ( diff --git a/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_internal/__init__.py b/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_internal/__init__.py index f1abcfc80af..21edecbac09 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_internal/__init__.py +++ b/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_internal/__init__.py @@ -16,14 +16,9 @@ from __future__ import annotations import logging -from collections.abc import Sequence +from collections.abc import Callable, Mapping, Sequence from typing import ( Any, - Callable, - Dict, - List, - Mapping, - Optional, TypeVar, ) @@ -67,9 +62,7 @@ def _encode_resource(resource: Resource) -> PB2Resource: return PB2Resource(attributes=_encode_attributes(resource.attributes)) -def _encode_value( - value: Any, allow_null: bool = False -) -> Optional[PB2AnyValue]: +def _encode_value(value: Any, allow_null: bool = False) -> PB2AnyValue | None: if allow_null is True and value is None: return None if isinstance(value, bool): @@ -136,7 +129,7 @@ def _encode_trace_id(trace_id: int) -> bytes: def _encode_attributes( attributes: _ExtendedAttributes, allow_null: bool = False, -) -> Optional[List[PB2KeyValue]]: +) -> list[PB2KeyValue] | None: if attributes: pb2_attributes = [] for key, value in attributes.items(): @@ -153,10 +146,10 @@ def _encode_attributes( def _get_resource_data( - sdk_resource_scope_data: Dict[Resource, _ResourceDataT], + sdk_resource_scope_data: dict[Resource, _ResourceDataT], resource_class: Callable[..., _TypingResourceT], name: str, -) -> List[_TypingResourceT]: +) -> list[_TypingResourceT]: resource_data = [] for ( diff --git a/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_internal/_log_encoder/__init__.py b/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_internal/_log_encoder/__init__.py index e04ee95fd38..3b1d0befa3f 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_internal/_log_encoder/__init__.py +++ b/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_internal/_log_encoder/__init__.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. from collections import defaultdict -from typing import List, Sequence +from collections.abc import Sequence from opentelemetry.exporter.otlp.proto.common._internal import ( _encode_attributes, @@ -72,7 +72,7 @@ def _encode_log(readable_log_record: ReadableLogRecord) -> PB2LogRecord: def _encode_resource_logs( batch: Sequence[ReadableLogRecord], -) -> List[ResourceLogs]: +) -> list[ResourceLogs]: sdk_resource_logs = defaultdict(lambda: defaultdict(list)) for readable_log in batch: diff --git a/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_internal/metrics_encoder/__init__.py b/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_internal/metrics_encoder/__init__.py index 3ea2e26dcb9..ef48a6b0e22 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_internal/metrics_encoder/__init__.py +++ b/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_internal/metrics_encoder/__init__.py @@ -15,7 +15,6 @@ import logging from os import environ -from typing import Dict, List from opentelemetry.exporter.otlp.proto.common._internal import ( _encode_attributes, @@ -79,8 +78,8 @@ def _common_configuration( ) def _get_temporality( - self, preferred_temporality: Dict[type, AggregationTemporality] - ) -> Dict[type, AggregationTemporality]: + self, preferred_temporality: dict[type, AggregationTemporality] + ) -> dict[type, AggregationTemporality]: otel_exporter_otlp_metrics_temporality_preference = ( environ.get( OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE, @@ -136,8 +135,8 @@ def _get_temporality( def _get_aggregation( self, - preferred_aggregation: Dict[type, Aggregation], - ) -> Dict[type, Aggregation]: + preferred_aggregation: dict[type, Aggregation], + ) -> dict[type, Aggregation]: otel_exporter_otlp_metrics_default_histogram_aggregation = environ.get( OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION, "explicit_bucket_histogram", @@ -344,7 +343,7 @@ def _encode_metric(metric, pb2_metric): ) -def _encode_exemplars(sdk_exemplars: List[Exemplar]) -> List[pb2.Exemplar]: +def _encode_exemplars(sdk_exemplars: list[Exemplar]) -> list[pb2.Exemplar]: """ Converts a list of SDK Exemplars into a list of protobuf Exemplars. diff --git a/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_internal/trace_encoder/__init__.py b/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_internal/trace_encoder/__init__.py index 388d229bab6..a7dae206c97 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_internal/trace_encoder/__init__.py +++ b/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_internal/trace_encoder/__init__.py @@ -14,7 +14,7 @@ import logging from collections import defaultdict -from typing import List, Optional, Sequence +from collections.abc import Sequence from opentelemetry.exporter.otlp.proto.common._internal import ( _encode_attributes, @@ -59,7 +59,7 @@ def encode_spans( def _encode_resource_spans( sdk_spans: Sequence[ReadableSpan], -) -> List[PB2ResourceSpans]: +) -> list[PB2ResourceSpans]: # We need to inspect the spans and group + structure them as: # # Resource @@ -105,7 +105,7 @@ def _encode_resource_spans( return pb2_resource_spans -def _span_flags(parent_span_context: Optional[SpanContext]) -> int: +def _span_flags(parent_span_context: SpanContext | None) -> int: flags = PB2SpanFlags.SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK if parent_span_context and parent_span_context.is_remote: flags |= PB2SpanFlags.SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK @@ -136,7 +136,7 @@ def _encode_span(sdk_span: ReadableSpan) -> PB2SPan: def _encode_events( events: Sequence[Event], -) -> Optional[List[PB2SPan.Event]]: +) -> list[PB2SPan.Event] | None: pb2_events = None if events: pb2_events = [] @@ -167,7 +167,7 @@ def _encode_links(links: Sequence[Link]) -> Sequence[PB2SPan.Link]: return pb2_links -def _encode_status(status: Status) -> Optional[PB2Status]: +def _encode_status(status: Status) -> PB2Status | None: pb2_status = None if status is not None: pb2_status = PB2Status( @@ -177,7 +177,7 @@ def _encode_status(status: Status) -> Optional[PB2Status]: return pb2_status -def _encode_trace_state(trace_state: TraceState) -> Optional[str]: +def _encode_trace_state(trace_state: TraceState) -> str | None: pb2_trace_state = None if trace_state is not None: pb2_trace_state = ",".join( @@ -186,7 +186,7 @@ def _encode_trace_state(trace_state: TraceState) -> Optional[str]: return pb2_trace_state -def _encode_parent_id(context: Optional[SpanContext]) -> Optional[bytes]: +def _encode_parent_id(context: SpanContext | None) -> bytes | None: if context: return _encode_span_id(context.span_id) return None diff --git a/exporter/opentelemetry-exporter-otlp-proto-common/tests/test_log_encoder.py b/exporter/opentelemetry-exporter-otlp-proto-common/tests/test_log_encoder.py index ef147274418..82840adec74 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-common/tests/test_log_encoder.py +++ b/exporter/opentelemetry-exporter-otlp-proto-common/tests/test_log_encoder.py @@ -13,7 +13,6 @@ # limitations under the License. import unittest -from typing import List, Tuple from opentelemetry._logs import LogRecord, SeverityNumber from opentelemetry.exporter.otlp.proto.common._internal import ( @@ -87,7 +86,7 @@ def test_dropped_attributes_count(self): ) @staticmethod - def _get_sdk_log_data() -> List[ReadWriteLogRecord]: + def _get_sdk_log_data() -> list[ReadWriteLogRecord]: # pylint:disable=too-many-locals ctx_log1 = set_span_in_context( NonRecordingSpan( @@ -330,7 +329,7 @@ def _get_sdk_log_data() -> List[ReadWriteLogRecord]: def get_test_logs( self, - ) -> Tuple[List[ReadWriteLogRecord], ExportLogsServiceRequest]: + ) -> tuple[list[ReadWriteLogRecord], ExportLogsServiceRequest]: sdk_logs = self._get_sdk_log_data() pb2_service_request = ExportLogsServiceRequest( @@ -646,7 +645,7 @@ def get_test_logs( return sdk_logs, pb2_service_request @staticmethod - def _get_test_logs_dropped_attributes() -> List[ReadWriteLogRecord]: + def _get_test_logs_dropped_attributes() -> list[ReadWriteLogRecord]: ctx_log1 = set_span_in_context( NonRecordingSpan( SpanContext( diff --git a/exporter/opentelemetry-exporter-otlp-proto-common/tests/test_trace_encoder.py b/exporter/opentelemetry-exporter-otlp-proto-common/tests/test_trace_encoder.py index bf78526d7e4..49284162f9d 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-common/tests/test_trace_encoder.py +++ b/exporter/opentelemetry-exporter-otlp-proto-common/tests/test_trace_encoder.py @@ -15,7 +15,6 @@ # pylint: disable=protected-access import unittest -from typing import List, Tuple from opentelemetry.exporter.otlp.proto.common._internal import ( _encode_span_id, @@ -63,7 +62,7 @@ def test_encode_spans(self): self.assertEqual(encode_spans(otel_spans), expected_encoding) @staticmethod - def get_exhaustive_otel_span_list() -> List[SDKSpan]: + def get_exhaustive_otel_span_list() -> list[SDKSpan]: trace_id = 0x3E0C63257DE34C926F9EFCD03927272E base_time = 683647322 * 10**9 # in ns @@ -194,7 +193,7 @@ def get_exhaustive_otel_span_list() -> List[SDKSpan]: def get_exhaustive_test_spans( self, - ) -> Tuple[List[SDKSpan], PB2ExportTraceServiceRequest]: + ) -> tuple[list[SDKSpan], PB2ExportTraceServiceRequest]: otel_spans = self.get_exhaustive_otel_span_list() trace_id = _encode_trace_id(otel_spans[0].context.trace_id) span_kind = _SPAN_KIND_MAP[SDKSpanKind.INTERNAL] diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/_log_exporter/__init__.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/_log_exporter/__init__.py index da40e9e9d58..59f4631b463 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/_log_exporter/__init__.py +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/_log_exporter/__init__.py @@ -11,9 +11,10 @@ # See the License for the specific language governing permissions and # limitations under the License. +from collections.abc import Sequence +from collections.abc import Sequence as TypingSequence from os import environ -from typing import Dict, Literal, Optional, Sequence, Tuple, Union -from typing import Sequence as TypingSequence +from typing import Literal from grpc import ChannelCredentials, Compression from opentelemetry.exporter.otlp.proto.common._log_encoder import encode_logs @@ -61,17 +62,18 @@ class OTLPLogExporter( ): def __init__( self, - endpoint: Optional[str] = None, - insecure: Optional[bool] = None, - credentials: Optional[ChannelCredentials] = None, - headers: Optional[ - Union[TypingSequence[Tuple[str, str]], Dict[str, str], str] - ] = None, - timeout: Optional[float] = None, - compression: Optional[Compression] = None, - channel_options: Optional[Tuple[Tuple[str, str]]] = None, + endpoint: str | None = None, + insecure: bool | None = None, + credentials: ChannelCredentials | None = None, + headers: TypingSequence[tuple[str, str]] + | dict[str, str] + | str + | None = None, + timeout: float | None = None, + compression: Compression | None = None, + channel_options: tuple[tuple[str, str]] | None = None, *, - meter_provider: Optional[MeterProvider] = None, + meter_provider: MeterProvider | None = None, ): insecure_logs = environ.get(OTEL_EXPORTER_OTLP_LOGS_INSECURE) if insecure is None and insecure_logs is not None: diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/exporter.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/exporter.py index 3627db70581..24d917ae761 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/exporter.py +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/exporter.py @@ -23,25 +23,23 @@ import random import threading from abc import ABC, abstractmethod -from collections.abc import Sequence # noqa: F401 +from collections.abc import ( + Callable, + Sequence, # noqa: F401 +) +from collections.abc import Sequence as TypingSequence from logging import getLogger from os import environ from time import time from typing import ( # noqa: F401 Any, - Callable, - Dict, Generic, - List, Literal, NewType, Optional, - Tuple, - Type, TypeVar, Union, ) -from typing import Sequence as TypingSequence from urllib.parse import urlparse from google.rpc.error_details_pb2 import RetryInfo @@ -169,7 +167,7 @@ def __init__(self, environ_key: str, environ_value: str): ) -def environ_to_compression(environ_key: str) -> Optional[Compression]: +def environ_to_compression(environ_key: str) -> Compression | None: environ_value = ( environ[environ_key].lower().strip() if environ_key in environ @@ -187,14 +185,14 @@ def environ_to_compression(environ_key: str) -> Optional[Compression]: "Use one of the encoders from opentelemetry-exporter-otlp-proto-common instead. Deprecated since version 1.18.0.", ) def get_resource_data( - sdk_resource_scope_data: Dict[SDKResource, ResourceDataT], + sdk_resource_scope_data: dict[SDKResource, ResourceDataT], resource_class: Callable[..., TypingResourceT], name: str, -) -> List[TypingResourceT]: +) -> list[TypingResourceT]: return _get_resource_data(sdk_resource_scope_data, resource_class, name) -def _read_file(file_path: str) -> Optional[bytes]: +def _read_file(file_path: str) -> bytes | None: try: with open(file_path, "rb") as file: return file.read() @@ -207,9 +205,9 @@ def _read_file(file_path: str) -> Optional[bytes]: def _load_credentials( - certificate_file: Optional[str], - client_key_file: Optional[str], - client_certificate_file: Optional[str], + certificate_file: str | None, + client_key_file: str | None, + client_certificate_file: str | None, ) -> ChannelCredentials: root_certificates = ( _read_file(certificate_file) if certificate_file else None @@ -229,7 +227,7 @@ def _load_credentials( def _get_credentials( - creds: Optional[ChannelCredentials], + creds: ChannelCredentials | None, credential_entry_point_env_key: str, certificate_file_env_key: str, client_key_file_env_key: str, @@ -298,19 +296,20 @@ def __init__( self, stub: ExportStubT, result: ExportResultT, - endpoint: Optional[str] = None, - insecure: Optional[bool] = None, - credentials: Optional[ChannelCredentials] = None, - headers: Optional[ - Union[TypingSequence[Tuple[str, str]], Dict[str, str], str] - ] = None, - timeout: Optional[float] = None, - compression: Optional[Compression] = None, - channel_options: Optional[Tuple[Tuple[str, str]]] = None, + endpoint: str | None = None, + insecure: bool | None = None, + credentials: ChannelCredentials | None = None, + headers: TypingSequence[tuple[str, str]] + | dict[str, str] + | str + | None = None, + timeout: float | None = None, + compression: Compression | None = None, + channel_options: tuple[tuple[str, str]] | None = None, *, - component_type: Union[OtelComponentTypeValues, None] = None, + component_type: OtelComponentTypeValues | None = None, signal: Literal["traces", "metrics", "logs"] = "traces", - meter_provider: Optional[MeterProvider] = None, + meter_provider: MeterProvider | None = None, ): super().__init__() self._result = result diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/metric_exporter/__init__.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/metric_exporter/__init__.py index 1b2b1e5ae41..72f125e4dbb 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/metric_exporter/__init__.py +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/metric_exporter/__init__.py @@ -13,11 +13,11 @@ from __future__ import annotations +from collections.abc import Iterable +from collections.abc import Sequence as TypingSequence from dataclasses import replace from logging import getLogger from os import environ -from typing import Iterable, List, Optional, Tuple, Union -from typing import Sequence as TypingSequence from grpc import ChannelCredentials, Compression from opentelemetry.exporter.otlp.proto.common._internal.metrics_encoder import ( @@ -104,7 +104,9 @@ def __init__( endpoint: str | None = None, insecure: bool | None = None, credentials: ChannelCredentials | None = None, - headers: Union[TypingSequence[Tuple[str, str]], dict[str, str], str] + headers: TypingSequence[tuple[str, str]] + | dict[str, str] + | str | None = None, timeout: float | None = None, compression: Compression | None = None, @@ -112,9 +114,9 @@ def __init__( | None = None, preferred_aggregation: dict[type, Aggregation] | None = None, max_export_batch_size: int | None = None, - channel_options: Tuple[Tuple[str, str]] | None = None, + channel_options: tuple[tuple[str, str]] | None = None, *, - meter_provider: Optional[MeterProvider] = None, + meter_provider: MeterProvider | None = None, ): insecure_metrics = environ.get(OTEL_EXPORTER_OTLP_METRICS_INSECURE) if insecure is None and insecure_metrics is not None: @@ -206,10 +208,10 @@ def _split_metrics_data( ) -> Iterable[MetricsData]: assert self._max_export_batch_size is not None batch_size: int = 0 - split_resource_metrics: List[ResourceMetrics] = [] + split_resource_metrics: list[ResourceMetrics] = [] for resource_metrics in metrics_data.resource_metrics: - split_scope_metrics: List[ScopeMetrics] = [] + split_scope_metrics: list[ScopeMetrics] = [] split_resource_metrics.append( replace( resource_metrics, @@ -217,7 +219,7 @@ def _split_metrics_data( ) ) for scope_metrics in resource_metrics.scope_metrics: - split_metrics: List[Metric] = [] + split_metrics: list[Metric] = [] split_scope_metrics.append( replace( scope_metrics, @@ -225,7 +227,7 @@ def _split_metrics_data( ) ) for metric in scope_metrics.metrics: - split_data_points: List[DataPointT] = [] + split_data_points: list[DataPointT] = [] split_metrics.append( replace( metric, diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/trace_exporter/__init__.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/trace_exporter/__init__.py index 7d9dfd7625d..3b5301517c7 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/trace_exporter/__init__.py +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/trace_exporter/__init__.py @@ -14,9 +14,9 @@ """OTLP Span Exporter""" import logging +from collections.abc import Sequence +from collections.abc import Sequence as TypingSequence from os import environ -from typing import Dict, Optional, Sequence, Tuple, Union -from typing import Sequence as TypingSequence from grpc import ChannelCredentials, Compression from opentelemetry.exporter.otlp.proto.common.trace_encoder import ( @@ -90,17 +90,18 @@ class OTLPSpanExporter( def __init__( self, - endpoint: Optional[str] = None, - insecure: Optional[bool] = None, - credentials: Optional[ChannelCredentials] = None, - headers: Optional[ - Union[TypingSequence[Tuple[str, str]], Dict[str, str], str] - ] = None, - timeout: Optional[float] = None, - compression: Optional[Compression] = None, - channel_options: Optional[Tuple[Tuple[str, str]]] = None, + endpoint: str | None = None, + insecure: bool | None = None, + credentials: ChannelCredentials | None = None, + headers: TypingSequence[tuple[str, str]] + | dict[str, str] + | str + | None = None, + timeout: float | None = None, + compression: Compression | None = None, + channel_options: tuple[tuple[str, str]] | None = None, *, - meter_provider: Optional[MeterProvider] = None, + meter_provider: MeterProvider | None = None, ): insecure_spans = environ.get(OTEL_EXPORTER_OTLP_TRACES_INSECURE) if insecure is None and insecure_spans is not None: diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/test_otlp_exporter_mixin.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/test_otlp_exporter_mixin.py index 87bd72c5550..ea296059355 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/test_otlp_exporter_mixin.py +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/test_otlp_exporter_mixin.py @@ -15,12 +15,13 @@ import threading import time import unittest +from collections.abc import Sequence from concurrent.futures import ( # pylint: disable=no-name-in-module ThreadPoolExecutor, ) from logging import WARNING, getLogger from platform import system -from typing import Any, Optional, Sequence +from typing import Any from unittest import TestCase from unittest.mock import Mock, patch @@ -115,8 +116,8 @@ class TraceServiceServicerWithExportParams(TraceServiceServicer): def __init__( self, export_result: StatusCode, - optional_retry_nanos: Optional[int] = None, - optional_export_sleep: Optional[float] = None, + optional_retry_nanos: int | None = None, + optional_export_sleep: float | None = None, ): self.export_result = export_result self.optional_export_sleep = optional_export_sleep @@ -164,7 +165,7 @@ def run(self): # an argument that has a member that points to the thread. del self._target, self._args, self._kwargs # type: ignore - def join(self, timeout: Optional[float] = None) -> Any: + def join(self, timeout: float | None = None) -> Any: super().join(timeout=timeout) return self._return diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/test_otlp_metrics_exporter.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/test_otlp_metrics_exporter.py index 6799178b658..f09b4f26d36 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/test_otlp_metrics_exporter.py +++ b/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/test_otlp_metrics_exporter.py @@ -16,7 +16,6 @@ from logging import WARNING from os import environ from os.path import dirname -from typing import List from unittest import TestCase from unittest.mock import patch @@ -345,7 +344,7 @@ def test_split_metrics_data_many_data_points(self): ] ) # WHEN - split_metrics_data: List[MetricsData] = list( + split_metrics_data: list[MetricsData] = list( # pylint: disable=protected-access OTLPMetricExporter(max_export_batch_size=2)._split_metrics_data( metrics_data=metrics_data, @@ -424,7 +423,7 @@ def test_split_metrics_data_nb_data_points_equal_batch_size(self): ] ) # WHEN - split_metrics_data: List[MetricsData] = list( + split_metrics_data: list[MetricsData] = list( # pylint: disable=protected-access OTLPMetricExporter(max_export_batch_size=3)._split_metrics_data( metrics_data=metrics_data, @@ -515,7 +514,7 @@ def test_split_metrics_data_many_resources_scopes_metrics(self): ] ) # WHEN - split_metrics_data: List[MetricsData] = list( + split_metrics_data: list[MetricsData] = list( # pylint: disable=protected-access OTLPMetricExporter(max_export_batch_size=2)._split_metrics_data( metrics_data=metrics_data, @@ -829,7 +828,7 @@ def test_preferred_aggregation_override(self): def _resource_metrics( - index: int, scope_metrics: List[ScopeMetrics] + index: int, scope_metrics: list[ScopeMetrics] ) -> ResourceMetrics: return ResourceMetrics( resource=Resource( @@ -841,7 +840,7 @@ def _resource_metrics( ) -def _scope_metrics(index: int, metrics: List[Metric]) -> ScopeMetrics: +def _scope_metrics(index: int, metrics: list[Metric]) -> ScopeMetrics: return ScopeMetrics( scope=InstrumentationScope(name=f"scope_{index}"), schema_url=f"scope_url_{index}", @@ -849,7 +848,7 @@ def _scope_metrics(index: int, metrics: List[Metric]) -> ScopeMetrics: ) -def _gauge(index: int, data_points: List[NumberDataPoint]) -> Metric: +def _gauge(index: int, data_points: list[NumberDataPoint]) -> Metric: return Metric( name=f"gauge_{index}", description="description", diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/_common/__init__.py b/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/_common/__init__.py index 1bdb7d228c2..7d1681486dd 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/_common/__init__.py +++ b/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/_common/__init__.py @@ -13,7 +13,7 @@ # limitations under the License. from os import environ -from typing import Literal, Optional +from typing import Literal import requests @@ -37,7 +37,7 @@ def _load_session_from_envvar( "OTEL_PYTHON_EXPORTER_OTLP_HTTP_TRACES_CREDENTIAL_PROVIDER", "OTEL_PYTHON_EXPORTER_OTLP_HTTP_METRICS_CREDENTIAL_PROVIDER", ], -) -> Optional[requests.Session]: +) -> requests.Session | None: _credential_env = environ.get( _OTEL_PYTHON_EXPORTER_OTLP_HTTP_CREDENTIAL_PROVIDER ) or environ.get(cred_envvar) diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/_log_exporter/__init__.py b/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/_log_exporter/__init__.py index 6032433dd12..ed331952778 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/_log_exporter/__init__.py +++ b/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/_log_exporter/__init__.py @@ -17,10 +17,10 @@ import random import threading import zlib +from collections.abc import Sequence from io import BytesIO from os import environ from time import time -from typing import Dict, Optional, Sequence from urllib.parse import urlparse import requests @@ -85,16 +85,16 @@ class OTLPLogExporter(LogRecordExporter): def __init__( self, - endpoint: Optional[str] = None, - certificate_file: Optional[str] = None, - client_key_file: Optional[str] = None, - client_certificate_file: Optional[str] = None, - headers: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - compression: Optional[Compression] = None, - session: Optional[requests.Session] = None, + endpoint: str | None = None, + certificate_file: str | None = None, + client_key_file: str | None = None, + client_certificate_file: str | None = None, + headers: dict[str, str] | None = None, + timeout: float | None = None, + compression: Compression | None = None, + session: requests.Session | None = None, *, - meter_provider: Optional[MeterProvider] = None, + meter_provider: MeterProvider | None = None, ): self._shutdown_is_occuring = threading.Event() self._endpoint = endpoint or environ.get( @@ -160,7 +160,7 @@ def __init__( ) def _export( - self, serialized_data: bytes, timeout_sec: Optional[float] = None + self, serialized_data: bytes, timeout_sec: float | None = None ): data = serialized_data if self._compression == Compression.Gzip: @@ -209,7 +209,7 @@ def export( for retry_num in range(_MAX_RETRYS): # multiplying by a random number between .8 and 1.2 introduces a +/20% jitter to each backoff. backoff_seconds = 2**retry_num * random.uniform(0.8, 1.2) - export_error: Optional[Exception] = None + export_error: Exception | None = None try: resp = self._export(serialized_data, deadline_sec - time()) if resp.ok: diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/metric_exporter/__init__.py b/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/metric_exporter/__init__.py index efd63b45438..daf3aae9c98 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/metric_exporter/__init__.py +++ b/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/metric_exporter/__init__.py @@ -17,15 +17,12 @@ import random import threading import zlib +from collections.abc import Callable, Iterable from io import BytesIO from os import environ from time import time from typing import ( # noqa: F401 Any, - Callable, - Dict, - Iterable, - List, Optional, ) from urllib.parse import urlparse @@ -134,7 +131,7 @@ def __init__( preferred_aggregation: dict[type, Aggregation] | None = None, max_export_batch_size: int | None = None, *, - meter_provider: Optional[MeterProvider] = None, + meter_provider: MeterProvider | None = None, ): """OTLP HTTP metrics exporter @@ -225,7 +222,7 @@ def __init__( ) def _export( - self, serialized_data: bytes, timeout_sec: Optional[float] = None + self, serialized_data: bytes, timeout_sec: float | None = None ): data = serialized_data if self._compression == Compression.Gzip: @@ -282,7 +279,7 @@ def _export_with_retries( for retry_num in range(_MAX_RETRYS): # multiplying by a random number between .8 and 1.2 introduces a +/20% jitter to each backoff. backoff_seconds = 2**retry_num * random.uniform(0.8, 1.2) - export_error: Optional[Exception] = None + export_error: Exception | None = None try: resp = self._export(serialized_data, deadline_sec - time()) if resp.ok: @@ -343,7 +340,7 @@ def _export_with_retries( def export( self, metrics_data: MetricsData, - timeout_millis: Optional[float] = 10000, + timeout_millis: float | None = 10000, **kwargs, ) -> MetricExportResult: if self._shutdown: @@ -559,8 +556,8 @@ def _split_metrics_data( def _get_split_resource_metrics_pb2( - split_resource_metrics: List[Dict], -) -> List[pb2.ResourceMetrics]: + split_resource_metrics: list[dict], +) -> list[pb2.ResourceMetrics]: """Helper that returns a list of pb2.ResourceMetrics objects based on split_resource_metrics. Example input: @@ -720,10 +717,10 @@ def _get_split_resource_metrics_pb2( "Use one of the encoders from opentelemetry-exporter-otlp-proto-common instead. Deprecated since version 1.18.0.", ) def get_resource_data( - sdk_resource_scope_data: Dict[SDKResource, Any], # ResourceDataT? + sdk_resource_scope_data: dict[SDKResource, Any], # ResourceDataT? resource_class: Callable[..., PB2Resource], name: str, -) -> List[PB2Resource]: +) -> list[PB2Resource]: return _get_resource_data(sdk_resource_scope_data, resource_class, name) diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/trace_exporter/__init__.py b/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/trace_exporter/__init__.py index 018d89df1ee..3a911b461a8 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/trace_exporter/__init__.py +++ b/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/trace_exporter/__init__.py @@ -17,10 +17,10 @@ import random import threading import zlib +from collections.abc import Sequence from io import BytesIO from os import environ from time import time -from typing import Dict, Optional, Sequence from urllib.parse import urlparse import requests @@ -81,16 +81,16 @@ class OTLPSpanExporter(SpanExporter): def __init__( self, - endpoint: Optional[str] = None, - certificate_file: Optional[str] = None, - client_key_file: Optional[str] = None, - client_certificate_file: Optional[str] = None, - headers: Optional[Dict[str, str]] = None, - timeout: Optional[float] = None, - compression: Optional[Compression] = None, - session: Optional[requests.Session] = None, + endpoint: str | None = None, + certificate_file: str | None = None, + client_key_file: str | None = None, + client_certificate_file: str | None = None, + headers: dict[str, str] | None = None, + timeout: float | None = None, + compression: Compression | None = None, + session: requests.Session | None = None, *, - meter_provider: Optional[MeterProvider] = None, + meter_provider: MeterProvider | None = None, ): self._shutdown_in_progress = threading.Event() self._endpoint = endpoint or environ.get( @@ -155,7 +155,7 @@ def __init__( ) def _export( - self, serialized_data: bytes, timeout_sec: Optional[float] = None + self, serialized_data: bytes, timeout_sec: float | None = None ): data = serialized_data if self._compression == Compression.Gzip: @@ -202,7 +202,7 @@ def export(self, spans: Sequence[ReadableSpan]) -> SpanExportResult: for retry_num in range(_MAX_RETRYS): # multiplying by a random number between .8 and 1.2 introduces a +/20% jitter to each backoff. backoff_seconds = 2**retry_num * random.uniform(0.8, 1.2) - export_error: Optional[Exception] = None + export_error: Exception | None = None try: resp = self._export(serialized_data, deadline_sec - time()) if resp.ok: diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/trace_exporter/encoder/__init__.py b/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/trace_exporter/encoder/__init__.py index aec46da1a24..35e502fef43 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/trace_exporter/encoder/__init__.py +++ b/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/trace_exporter/encoder/__init__.py @@ -14,7 +14,7 @@ import logging # noqa: F401 from collections import abc # noqa: F401 -from typing import Any, List, Optional, Sequence # noqa: F401 +from collections.abc import Sequence # noqa: F401 from opentelemetry.proto.collector.trace.v1.trace_service_pb2 import ( # noqa: F401 ExportTraceServiceRequest as PB2ExportTraceServiceRequest, diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/tests/metrics/test_otlp_metrics_exporter.py b/exporter/opentelemetry-exporter-otlp-proto-http/tests/metrics/test_otlp_metrics_exporter.py index 5f7ae2afa9b..d623c185ece 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/tests/metrics/test_otlp_metrics_exporter.py +++ b/exporter/opentelemetry-exporter-otlp-proto-http/tests/metrics/test_otlp_metrics_exporter.py @@ -17,7 +17,6 @@ import time from logging import WARNING from os import environ -from typing import List from unittest import TestCase from unittest.mock import ANY, MagicMock, Mock, patch @@ -478,7 +477,7 @@ def test_split_metrics_data_many_data_points(self): ), ] ) - split_metrics_data: List[ExportMetricsServiceRequest] = list( + split_metrics_data: list[ExportMetricsServiceRequest] = list( # pylint: disable=protected-access _split_metrics_data( metrics_data=metrics_data, @@ -557,7 +556,7 @@ def test_split_metrics_data_nb_data_points_equal_batch_size(self): ] ) - split_metrics_data: List[ExportMetricsServiceRequest] = list( + split_metrics_data: list[ExportMetricsServiceRequest] = list( # pylint: disable=protected-access _split_metrics_data( metrics_data=metrics_data, @@ -649,7 +648,7 @@ def test_split_metrics_data_many_resources_scopes_metrics(self): ] ) - split_metrics_data: List[ExportMetricsServiceRequest] = list( + split_metrics_data: list[ExportMetricsServiceRequest] = list( # pylint: disable=protected-access _split_metrics_data( metrics_data=metrics_data, @@ -1458,7 +1457,7 @@ def assert_standard_metric_attrs(self, attributes): def _resource_metrics( - index: int, scope_metrics: List[pb2.ScopeMetrics] + index: int, scope_metrics: list[pb2.ScopeMetrics] ) -> pb2.ResourceMetrics: return pb2.ResourceMetrics( resource={ @@ -1469,7 +1468,7 @@ def _resource_metrics( ) -def _scope_metrics(index: int, metrics: List[pb2.Metric]) -> pb2.ScopeMetrics: +def _scope_metrics(index: int, metrics: list[pb2.Metric]) -> pb2.ScopeMetrics: return pb2.ScopeMetrics( scope=InstrumentationScope(name=f"scope_{index}"), schema_url=f"scope_url_{index}", @@ -1477,7 +1476,7 @@ def _scope_metrics(index: int, metrics: List[pb2.Metric]) -> pb2.ScopeMetrics: ) -def _gauge(index: int, data_points: List[pb2.NumberDataPoint]) -> pb2.Metric: +def _gauge(index: int, data_points: list[pb2.NumberDataPoint]) -> pb2.Metric: return pb2.Metric( name=f"gauge_{index}", description="description", diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py b/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py index 7981b0bc821..c5479c0d8b3 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py +++ b/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py @@ -18,7 +18,6 @@ import time import unittest from logging import WARNING -from typing import List from unittest.mock import MagicMock, Mock, patch import requests @@ -358,7 +357,7 @@ def test_exported_log_without_span_id(self): self.fail("No log records found") @staticmethod - def _get_sdk_log_data() -> List[ReadWriteLogRecord]: + def _get_sdk_log_data() -> list[ReadWriteLogRecord]: ctx_log1 = set_span_in_context( NonRecordingSpan( SpanContext( diff --git a/exporter/opentelemetry-exporter-prometheus/src/opentelemetry/exporter/prometheus/__init__.py b/exporter/opentelemetry-exporter-prometheus/src/opentelemetry/exporter/prometheus/__init__.py index 608d8f6d302..a3b65185b46 100644 --- a/exporter/opentelemetry-exporter-prometheus/src/opentelemetry/exporter/prometheus/__init__.py +++ b/exporter/opentelemetry-exporter-prometheus/src/opentelemetry/exporter/prometheus/__init__.py @@ -63,11 +63,11 @@ """ from collections import deque +from collections.abc import Iterable, Sequence from itertools import chain from json import dumps from logging import getLogger from os import environ -from typing import Deque, Dict, Iterable, Sequence, Tuple, Union from prometheus_client import start_http_server from prometheus_client.core import ( @@ -118,7 +118,7 @@ def _convert_buckets( bucket_counts: Sequence[int], explicit_bounds: Sequence[float] -) -> Sequence[Tuple[str, int]]: +) -> Sequence[tuple[str, int]]: buckets = [] total_count = 0 for upper_bound, count in zip( @@ -178,7 +178,7 @@ class _CustomCollector: def __init__(self, disable_target_info: bool = False, prefix: str = ""): self._callback = None - self._metrics_datas: Deque[MetricsData] = deque() + self._metrics_datas: deque[MetricsData] = deque() self._disable_target_info = disable_target_info self._target_info = None self._prefix = prefix @@ -224,7 +224,7 @@ def collect(self) -> Iterable[PrometheusMetric]: def _translate_to_prometheus( self, metrics_data: MetricsData, - metric_family_id_metric_family: Dict[str, PrometheusMetric], + metric_family_id_metric_family: dict[str, PrometheusMetric], ): metrics = [] @@ -383,14 +383,14 @@ def _translate_to_prometheus( ) # pylint: disable=no-self-use - def _check_value(self, value: Union[int, float, str, Sequence]) -> str: + def _check_value(self, value: int | float | str | Sequence) -> str: """Check the label value and return is appropriate representation""" if not isinstance(value, str): return dumps(value, default=str) return str(value) def _create_info_metric( - self, name: str, description: str, attributes: Dict[str, str] + self, name: str, description: str, attributes: dict[str, str] ) -> InfoMetricFamily: """Create an Info Metric Family with list of attributes""" # sanitize the attribute names according to Prometheus rule diff --git a/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/encoder/__init__.py b/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/encoder/__init__.py index bb90daa37c2..71002641675 100644 --- a/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/encoder/__init__.py +++ b/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/encoder/__init__.py @@ -20,8 +20,9 @@ import abc import json import logging +from collections.abc import Sequence from enum import Enum -from typing import Any, Dict, List, Optional, Sequence, TypeVar +from typing import Any, TypeVar from opentelemetry.exporter.zipkin.node_endpoint import NodeEndpoint from opentelemetry.sdk.trace import Event @@ -114,7 +115,7 @@ def _encode_trace_id(trace_id: int) -> Any: pass @staticmethod - def _get_parent_id(span_context) -> Optional[int]: + def _get_parent_id(span_context) -> int | None: if isinstance(span_context, Span): parent_id = span_context.parent.span_id elif isinstance(span_context, SpanContext): @@ -124,8 +125,8 @@ def _get_parent_id(span_context) -> Optional[int]: return parent_id def _extract_tags_from_dict( - self, tags_dict: Optional[Dict] - ) -> Dict[str, str]: + self, tags_dict: dict | None + ) -> dict[str, str]: tags = {} if not tags_dict: return tags @@ -194,7 +195,7 @@ def _extract_tag_value_string_from_sequence(self, sequence: Sequence): return json.dumps(tag_value_elements, separators=(",", ":")) - def _extract_tags_from_span(self, span: Span) -> Dict[str, str]: + def _extract_tags_from_span(self, span: Span) -> dict[str, str]: tags = self._extract_tags_from_dict(span.attributes) if span.resource: tags.update(self._extract_tags_from_dict(span.resource.attributes)) @@ -228,8 +229,8 @@ def _extract_tags_from_span(self, span: Span) -> Dict[str, str]: return tags def _extract_annotations_from_events( - self, events: Optional[List[Event]] - ) -> Optional[List[Dict]]: + self, events: list[Event] | None + ) -> list[dict] | None: if not events: return None @@ -280,7 +281,7 @@ def serialize( return json.dumps(encoded_spans) @staticmethod - def _encode_local_endpoint(local_endpoint: NodeEndpoint) -> Dict: + def _encode_local_endpoint(local_endpoint: NodeEndpoint) -> dict: encoded_local_endpoint = {"serviceName": local_endpoint.service_name} if local_endpoint.ipv4 is not None: encoded_local_endpoint["ipv4"] = str(local_endpoint.ipv4) diff --git a/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/json/__init__.py b/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/json/__init__.py index ba313db942a..bdaa8f6d91c 100644 --- a/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/json/__init__.py +++ b/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/json/__init__.py @@ -73,8 +73,8 @@ """ import logging +from collections.abc import Sequence from os import environ -from typing import Optional, Sequence import requests @@ -100,13 +100,13 @@ class ZipkinExporter(SpanExporter): def __init__( self, version: Protocol = Protocol.V2, - endpoint: Optional[str] = None, + endpoint: str | None = None, local_node_ipv4: IpInput = None, local_node_ipv6: IpInput = None, - local_node_port: Optional[int] = None, - max_tag_value_length: Optional[int] = None, - timeout: Optional[int] = None, - session: Optional[requests.Session] = None, + local_node_port: int | None = None, + max_tag_value_length: int | None = None, + timeout: int | None = None, + session: requests.Session | None = None, ): """Zipkin exporter. diff --git a/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/json/v1/__init__.py b/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/json/v1/__init__.py index c44a2dd0af2..044568d13fe 100644 --- a/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/json/v1/__init__.py +++ b/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/json/v1/__init__.py @@ -14,8 +14,6 @@ """Zipkin Export Encoders for JSON formats""" -from typing import Dict, List - from opentelemetry.exporter.zipkin.encoder import Encoder, JsonEncoder from opentelemetry.trace import Span @@ -23,8 +21,8 @@ # pylint: disable=W0223 class V1Encoder(Encoder): def _extract_binary_annotations( - self, span: Span, encoded_local_endpoint: Dict - ) -> List[Dict]: + self, span: Span, encoded_local_endpoint: dict + ) -> list[dict]: binary_annotations = [] for tag_key, tag_value in self._extract_tags_from_span(span).items(): if isinstance(tag_value, str) and self.max_tag_value_length > 0: @@ -45,7 +43,7 @@ class JsonV1Encoder(JsonEncoder, V1Encoder): API spec: https://github.com/openzipkin/zipkin-api/blob/master/zipkin-api.yaml """ - def _encode_span(self, span: Span, encoded_local_endpoint: Dict) -> Dict: + def _encode_span(self, span: Span, encoded_local_endpoint: dict) -> dict: context = span.get_span_context() encoded_span = { diff --git a/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/json/v2/__init__.py b/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/json/v2/__init__.py index 579087c4516..d084a616de9 100644 --- a/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/json/v2/__init__.py +++ b/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/json/v2/__init__.py @@ -14,8 +14,6 @@ """Zipkin Export Encoders for JSON formats""" -from typing import Dict - from opentelemetry.exporter.zipkin.encoder import JsonEncoder from opentelemetry.trace import Span, SpanKind @@ -34,7 +32,7 @@ class JsonV2Encoder(JsonEncoder): SpanKind.CONSUMER: "CONSUMER", } - def _encode_span(self, span: Span, encoded_local_endpoint: Dict) -> Dict: + def _encode_span(self, span: Span, encoded_local_endpoint: dict) -> dict: context = span.get_span_context() encoded_span = { "traceId": self._encode_trace_id(context.trace_id), diff --git a/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/node_endpoint.py b/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/node_endpoint.py index 67f5d0ad12f..f1dd31d224e 100644 --- a/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/node_endpoint.py +++ b/exporter/opentelemetry-exporter-zipkin-json/src/opentelemetry/exporter/zipkin/node_endpoint.py @@ -15,12 +15,11 @@ """Zipkin Exporter Endpoints""" import ipaddress -from typing import Optional, Union from opentelemetry import trace from opentelemetry.sdk.resources import SERVICE_NAME, Resource -IpInput = Union[str, int, None] +IpInput = str | int | None class NodeEndpoint: @@ -37,7 +36,7 @@ def __init__( self, ipv4: IpInput = None, ipv6: IpInput = None, - port: Optional[int] = None, + port: int | None = None, ): self.ipv4 = ipv4 self.ipv6 = ipv6 @@ -53,7 +52,7 @@ def __init__( self.service_name = resource.attributes[SERVICE_NAME] @property - def ipv4(self) -> Optional[ipaddress.IPv4Address]: + def ipv4(self) -> ipaddress.IPv4Address | None: return self._ipv4 @ipv4.setter @@ -69,7 +68,7 @@ def ipv4(self, address: IpInput) -> None: self._ipv4 = ipv4_address @property - def ipv6(self) -> Optional[ipaddress.IPv6Address]: + def ipv6(self) -> ipaddress.IPv6Address | None: return self._ipv6 @ipv6.setter diff --git a/exporter/opentelemetry-exporter-zipkin-json/tests/encoder/common_tests.py b/exporter/opentelemetry-exporter-zipkin-json/tests/encoder/common_tests.py index ada00c7c8e6..8ae0b5a14d7 100644 --- a/exporter/opentelemetry-exporter-zipkin-json/tests/encoder/common_tests.py +++ b/exporter/opentelemetry-exporter-zipkin-json/tests/encoder/common_tests.py @@ -13,7 +13,6 @@ # limitations under the License. import abc import unittest -from typing import Dict, List from opentelemetry import trace as trace_api from opentelemetry.exporter.zipkin.encoder import ( @@ -165,7 +164,7 @@ def test_get_parent_id_from_span_context(self): @staticmethod def get_data_for_max_tag_length_test( max_tag_length: int, - ) -> (trace._Span, Dict): + ) -> (trace._Span, dict): start_time = 683647322 * 10**9 # in ns duration = 50 * 10**6 end_time = start_time + duration @@ -327,7 +326,7 @@ def get_data_for_max_tag_length_test( return span, expected_outputs[max_tag_length] @staticmethod - def get_exhaustive_otel_span_list() -> List[trace._Span]: + def get_exhaustive_otel_span_list() -> list[trace._Span]: trace_id = 0x6E0C63257DE34C926F9EFCD03927272E base_time = 683647322 * 10**9 # in ns diff --git a/exporter/opentelemetry-exporter-zipkin-proto-http/src/opentelemetry/exporter/zipkin/proto/http/__init__.py b/exporter/opentelemetry-exporter-zipkin-proto-http/src/opentelemetry/exporter/zipkin/proto/http/__init__.py index dcb092c9cec..71050464e24 100644 --- a/exporter/opentelemetry-exporter-zipkin-proto-http/src/opentelemetry/exporter/zipkin/proto/http/__init__.py +++ b/exporter/opentelemetry-exporter-zipkin-proto-http/src/opentelemetry/exporter/zipkin/proto/http/__init__.py @@ -72,8 +72,8 @@ """ import logging +from collections.abc import Sequence from os import environ -from typing import Optional, Sequence import requests @@ -96,13 +96,13 @@ class ZipkinExporter(SpanExporter): def __init__( self, - endpoint: Optional[str] = None, + endpoint: str | None = None, local_node_ipv4: IpInput = None, local_node_ipv6: IpInput = None, - local_node_port: Optional[int] = None, - max_tag_value_length: Optional[int] = None, - timeout: Optional[int] = None, - session: Optional[requests.Session] = None, + local_node_port: int | None = None, + max_tag_value_length: int | None = None, + timeout: int | None = None, + session: requests.Session | None = None, ): """Zipkin exporter. diff --git a/exporter/opentelemetry-exporter-zipkin-proto-http/src/opentelemetry/exporter/zipkin/proto/http/v2/__init__.py b/exporter/opentelemetry-exporter-zipkin-proto-http/src/opentelemetry/exporter/zipkin/proto/http/v2/__init__.py index d7ca3b88d27..874237eae96 100644 --- a/exporter/opentelemetry-exporter-zipkin-proto-http/src/opentelemetry/exporter/zipkin/proto/http/v2/__init__.py +++ b/exporter/opentelemetry-exporter-zipkin-proto-http/src/opentelemetry/exporter/zipkin/proto/http/v2/__init__.py @@ -17,7 +17,7 @@ API spec: https://github.com/openzipkin/zipkin-api/blob/master/zipkin.proto """ -from typing import List, Optional, Sequence +from collections.abc import Sequence from opentelemetry.exporter.zipkin.encoder import Encoder from opentelemetry.exporter.zipkin.node_endpoint import NodeEndpoint @@ -90,8 +90,8 @@ def _encode_span( return encoded_span def _encode_annotations( - self, span_events: Optional[List[Event]] - ) -> Optional[List]: + self, span_events: list[Event] | None + ) -> list | None: annotations = self._extract_annotations_from_events(span_events) if annotations is None: encoded_annotations = None diff --git a/exporter/opentelemetry-exporter-zipkin-proto-http/tests/encoder/common_tests.py b/exporter/opentelemetry-exporter-zipkin-proto-http/tests/encoder/common_tests.py index ada00c7c8e6..8ae0b5a14d7 100644 --- a/exporter/opentelemetry-exporter-zipkin-proto-http/tests/encoder/common_tests.py +++ b/exporter/opentelemetry-exporter-zipkin-proto-http/tests/encoder/common_tests.py @@ -13,7 +13,6 @@ # limitations under the License. import abc import unittest -from typing import Dict, List from opentelemetry import trace as trace_api from opentelemetry.exporter.zipkin.encoder import ( @@ -165,7 +164,7 @@ def test_get_parent_id_from_span_context(self): @staticmethod def get_data_for_max_tag_length_test( max_tag_length: int, - ) -> (trace._Span, Dict): + ) -> (trace._Span, dict): start_time = 683647322 * 10**9 # in ns duration = 50 * 10**6 end_time = start_time + duration @@ -327,7 +326,7 @@ def get_data_for_max_tag_length_test( return span, expected_outputs[max_tag_length] @staticmethod - def get_exhaustive_otel_span_list() -> List[trace._Span]: + def get_exhaustive_otel_span_list() -> list[trace._Span]: trace_id = 0x6E0C63257DE34C926F9EFCD03927272E base_time = 683647322 * 10**9 # in ns diff --git a/opentelemetry-api/src/opentelemetry/_events/__init__.py b/opentelemetry-api/src/opentelemetry/_events/__init__.py index d86fd12721d..fd6281d96b5 100644 --- a/opentelemetry-api/src/opentelemetry/_events/__init__.py +++ b/opentelemetry-api/src/opentelemetry/_events/__init__.py @@ -40,13 +40,13 @@ class Event(LogRecord): def __init__( self, name: str, - timestamp: Optional[int] = None, - trace_id: Optional[int] = None, - span_id: Optional[int] = None, + timestamp: int | None = None, + trace_id: int | None = None, + span_id: int | None = None, trace_flags: Optional["TraceFlags"] = None, - body: Optional[AnyValue] = None, - severity_number: Optional[SeverityNumber] = None, - attributes: Optional[_ExtendedAttributes] = None, + body: AnyValue | None = None, + severity_number: SeverityNumber | None = None, + attributes: _ExtendedAttributes | None = None, ): attributes = attributes or {} event_attributes = { @@ -73,9 +73,9 @@ class EventLogger(ABC): def __init__( self, name: str, - version: Optional[str] = None, - schema_url: Optional[str] = None, - attributes: Optional[_ExtendedAttributes] = None, + version: str | None = None, + schema_url: str | None = None, + attributes: _ExtendedAttributes | None = None, ): self._name = name self._version = version @@ -104,9 +104,9 @@ class ProxyEventLogger(EventLogger): def __init__( self, name: str, - version: Optional[str] = None, - schema_url: Optional[str] = None, - attributes: Optional[_ExtendedAttributes] = None, + version: str | None = None, + schema_url: str | None = None, + attributes: _ExtendedAttributes | None = None, ): super().__init__( name=name, @@ -114,7 +114,7 @@ def __init__( schema_url=schema_url, attributes=attributes, ) - self._real_event_logger: Optional[EventLogger] = None + self._real_event_logger: EventLogger | None = None self._noop_event_logger = NoOpEventLogger(name) @property @@ -145,9 +145,9 @@ class EventLoggerProvider(ABC): def get_event_logger( self, name: str, - version: Optional[str] = None, - schema_url: Optional[str] = None, - attributes: Optional[_ExtendedAttributes] = None, + version: str | None = None, + schema_url: str | None = None, + attributes: _ExtendedAttributes | None = None, ) -> EventLogger: """Returns an EventLoggerProvider for use.""" @@ -160,9 +160,9 @@ class NoOpEventLoggerProvider(EventLoggerProvider): def get_event_logger( self, name: str, - version: Optional[str] = None, - schema_url: Optional[str] = None, - attributes: Optional[_ExtendedAttributes] = None, + version: str | None = None, + schema_url: str | None = None, + attributes: _ExtendedAttributes | None = None, ) -> EventLogger: return NoOpEventLogger( name, version=version, schema_url=schema_url, attributes=attributes @@ -177,9 +177,9 @@ class ProxyEventLoggerProvider(EventLoggerProvider): def get_event_logger( self, name: str, - version: Optional[str] = None, - schema_url: Optional[str] = None, - attributes: Optional[_ExtendedAttributes] = None, + version: str | None = None, + schema_url: str | None = None, + attributes: _ExtendedAttributes | None = None, ) -> EventLogger: if _EVENT_LOGGER_PROVIDER: return _EVENT_LOGGER_PROVIDER.get_event_logger( @@ -197,7 +197,7 @@ def get_event_logger( _EVENT_LOGGER_PROVIDER_SET_ONCE = Once() -_EVENT_LOGGER_PROVIDER: Optional[EventLoggerProvider] = None +_EVENT_LOGGER_PROVIDER: EventLoggerProvider | None = None _PROXY_EVENT_LOGGER_PROVIDER = ProxyEventLoggerProvider() @@ -251,10 +251,10 @@ def set_event_logger_provider( ) def get_event_logger( name: str, - version: Optional[str] = None, - schema_url: Optional[str] = None, - attributes: Optional[_ExtendedAttributes] = None, - event_logger_provider: Optional[EventLoggerProvider] = None, + version: str | None = None, + schema_url: str | None = None, + attributes: _ExtendedAttributes | None = None, + event_logger_provider: EventLoggerProvider | None = None, ) -> "EventLogger": if event_logger_provider is None: event_logger_provider = get_event_logger_provider() diff --git a/opentelemetry-api/src/opentelemetry/_logs/_internal/__init__.py b/opentelemetry-api/src/opentelemetry/_logs/_internal/__init__.py index 12a8cc08f88..7ef5537c34e 100644 --- a/opentelemetry-api/src/opentelemetry/_logs/_internal/__init__.py +++ b/opentelemetry-api/src/opentelemetry/_logs/_internal/__init__.py @@ -39,7 +39,7 @@ from logging import getLogger from os import environ from time import time_ns -from typing import Optional, cast, overload +from typing import cast, overload from typing_extensions import deprecated @@ -68,15 +68,15 @@ class LogRecord(ABC): def __init__( self, *, - timestamp: Optional[int] = None, - observed_timestamp: Optional[int] = None, - context: Optional[Context] = None, - severity_text: Optional[str] = None, - severity_number: Optional[SeverityNumber] = None, + timestamp: int | None = None, + observed_timestamp: int | None = None, + context: Context | None = None, + severity_text: str | None = None, + severity_number: SeverityNumber | None = None, body: AnyValue = None, - attributes: Optional[_ExtendedAttributes] = None, - event_name: Optional[str] = None, - exception: Optional[BaseException] = None, + attributes: _ExtendedAttributes | None = None, + event_name: str | None = None, + exception: BaseException | None = None, ) -> None: ... @overload @@ -86,32 +86,32 @@ def __init__( def __init__( self, *, - timestamp: Optional[int] = None, - observed_timestamp: Optional[int] = None, - trace_id: Optional[int] = None, - span_id: Optional[int] = None, - trace_flags: Optional[TraceFlags] = None, - severity_text: Optional[str] = None, - severity_number: Optional[SeverityNumber] = None, + timestamp: int | None = None, + observed_timestamp: int | None = None, + trace_id: int | None = None, + span_id: int | None = None, + trace_flags: TraceFlags | None = None, + severity_text: str | None = None, + severity_number: SeverityNumber | None = None, body: AnyValue = None, - attributes: Optional[_ExtendedAttributes] = None, + attributes: _ExtendedAttributes | None = None, ) -> None: ... def __init__( self, *, - timestamp: Optional[int] = None, - observed_timestamp: Optional[int] = None, - context: Optional[Context] = None, - trace_id: Optional[int] = None, - span_id: Optional[int] = None, - trace_flags: Optional[TraceFlags] = None, - severity_text: Optional[str] = None, - severity_number: Optional[SeverityNumber] = None, + timestamp: int | None = None, + observed_timestamp: int | None = None, + context: Context | None = None, + trace_id: int | None = None, + span_id: int | None = None, + trace_flags: TraceFlags | None = None, + severity_text: str | None = None, + severity_number: SeverityNumber | None = None, body: AnyValue = None, - attributes: Optional[_ExtendedAttributes] = None, - event_name: Optional[str] = None, - exception: Optional[BaseException] = None, + attributes: _ExtendedAttributes | None = None, + event_name: str | None = None, + exception: BaseException | None = None, ) -> None: if not context: context = get_current() @@ -138,9 +138,9 @@ class Logger(ABC): def __init__( self, name: str, - version: Optional[str] = None, - schema_url: Optional[str] = None, - attributes: Optional[_ExtendedAttributes] = None, + version: str | None = None, + schema_url: str | None = None, + attributes: _ExtendedAttributes | None = None, ) -> None: super().__init__() self._name = name @@ -235,15 +235,15 @@ class ProxyLogger(Logger): def __init__( # pylint: disable=super-init-not-called self, name: str, - version: Optional[str] = None, - schema_url: Optional[str] = None, - attributes: Optional[_ExtendedAttributes] = None, + version: str | None = None, + schema_url: str | None = None, + attributes: _ExtendedAttributes | None = None, ): self._name = name self._version = version self._schema_url = schema_url self._attributes = attributes - self._real_logger: Optional[Logger] = None + self._real_logger: Logger | None = None self._noop_logger = NoOpLogger(name) @property @@ -321,9 +321,9 @@ class LoggerProvider(ABC): def get_logger( self, name: str, - version: Optional[str] = None, - schema_url: Optional[str] = None, - attributes: Optional[_ExtendedAttributes] = None, + version: str | None = None, + schema_url: str | None = None, + attributes: _ExtendedAttributes | None = None, ) -> Logger: """Returns a `Logger` for use by the given instrumentation library. @@ -360,9 +360,9 @@ class NoOpLoggerProvider(LoggerProvider): def get_logger( self, name: str, - version: Optional[str] = None, - schema_url: Optional[str] = None, - attributes: Optional[_ExtendedAttributes] = None, + version: str | None = None, + schema_url: str | None = None, + attributes: _ExtendedAttributes | None = None, ) -> Logger: """Returns a NoOpLogger.""" return NoOpLogger( @@ -374,9 +374,9 @@ class ProxyLoggerProvider(LoggerProvider): def get_logger( self, name: str, - version: Optional[str] = None, - schema_url: Optional[str] = None, - attributes: Optional[_ExtendedAttributes] = None, + version: str | None = None, + schema_url: str | None = None, + attributes: _ExtendedAttributes | None = None, ) -> Logger: if _LOGGER_PROVIDER: return _LOGGER_PROVIDER.get_logger( @@ -394,7 +394,7 @@ def get_logger( _LOGGER_PROVIDER_SET_ONCE = Once() -_LOGGER_PROVIDER: Optional[LoggerProvider] = None +_LOGGER_PROVIDER: LoggerProvider | None = None _PROXY_LOGGER_PROVIDER = ProxyLoggerProvider() @@ -437,9 +437,9 @@ def set_logger_provider(logger_provider: LoggerProvider) -> None: def get_logger( instrumenting_module_name: str, instrumenting_library_version: str = "", - logger_provider: Optional[LoggerProvider] = None, - schema_url: Optional[str] = None, - attributes: Optional[_ExtendedAttributes] = None, + logger_provider: LoggerProvider | None = None, + schema_url: str | None = None, + attributes: _ExtendedAttributes | None = None, ) -> Logger: """Returns a `Logger` for use within a python process. diff --git a/opentelemetry-api/src/opentelemetry/attributes/__init__.py b/opentelemetry-api/src/opentelemetry/attributes/__init__.py index e7799a69633..53190bd5578 100644 --- a/opentelemetry-api/src/opentelemetry/attributes/__init__.py +++ b/opentelemetry-api/src/opentelemetry/attributes/__init__.py @@ -16,8 +16,7 @@ import logging import threading from collections import OrderedDict -from collections.abc import MutableMapping -from typing import Mapping, Optional, Sequence, Tuple, Union +from collections.abc import Mapping, MutableMapping, Sequence from opentelemetry.util import types @@ -48,8 +47,8 @@ def _type_name(t): def _clean_attribute( - key: str, value: types.AttributeValue, max_len: Optional[int] -) -> Optional[Union[types.AttributeValue, Tuple[Union[str, int, float], ...]]]: + key: str, value: types.AttributeValue, max_len: int | None +) -> types.AttributeValue | tuple[str | int | float, ...] | None: """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. @@ -127,7 +126,7 @@ def _clean_attribute( def _clean_extended_attribute_value( # pylint: disable=too-many-branches - value: types.AnyValue, max_len: Optional[int] + value: types.AnyValue, max_len: int | None ) -> types.AnyValue: # for primitive types just return the value and eventually shorten the string length if value is None or isinstance(value, _VALID_ATTR_VALUE_TYPES): @@ -204,7 +203,7 @@ def _clean_extended_attribute_value( # pylint: disable=too-many-branches def _clean_extended_attribute( - key: str, value: types.AnyValue, max_len: Optional[int] + key: str, value: types.AnyValue, max_len: int | None ) -> types.AnyValue: """Checks if attribute value is valid and cleans it if required. @@ -227,8 +226,8 @@ def _clean_extended_attribute( def _clean_attribute_value( - value: types.AttributeValue, limit: Optional[int] -) -> Optional[types.AttributeValue]: + value: types.AttributeValue, limit: int | None +) -> types.AttributeValue | None: if value is None: return None @@ -253,10 +252,10 @@ class BoundedAttributes(MutableMapping): # type: ignore def __init__( self, - maxlen: Optional[int] = None, - attributes: Optional[types._ExtendedAttributes] = None, + maxlen: int | None = None, + attributes: types._ExtendedAttributes | None = None, immutable: bool = True, - max_value_len: Optional[int] = None, + max_value_len: int | None = None, extended_attributes: bool = False, ): if maxlen is not None: @@ -270,10 +269,10 @@ def __init__( self._extended_attributes = extended_attributes # OrderedDict is not used until the maxlen is reached for efficiency. - self._dict: Union[ - MutableMapping[str, types.AnyValue], - OrderedDict[str, types.AnyValue], - ] = {} + self._dict: ( + MutableMapping[str, types.AnyValue] + | OrderedDict[str, types.AnyValue] + ) = {} self._lock = threading.RLock() if attributes: for key, value in attributes.items(): diff --git a/opentelemetry-api/src/opentelemetry/baggage/__init__.py b/opentelemetry-api/src/opentelemetry/baggage/__init__.py index c8e34c1c45b..6654d3b8757 100644 --- a/opentelemetry-api/src/opentelemetry/baggage/__init__.py +++ b/opentelemetry-api/src/opentelemetry/baggage/__init__.py @@ -12,10 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. +from collections.abc import Mapping from logging import getLogger from re import compile from types import MappingProxyType -from typing import Dict, Mapping, Optional from opentelemetry.context import create_key, get_value, set_value from opentelemetry.context.context import Context @@ -34,7 +34,7 @@ def get_all( - context: Optional[Context] = None, + context: Context | None = None, ) -> Mapping[str, object]: """Returns the name/value pairs in the Baggage @@ -47,9 +47,7 @@ def get_all( return MappingProxyType(_get_baggage_value(context=context)) -def get_baggage( - name: str, context: Optional[Context] = None -) -> Optional[object]: +def get_baggage(name: str, context: Context | None = None) -> object | None: """Provides access to the value for a name/value pair in the Baggage @@ -65,7 +63,7 @@ def get_baggage( def set_baggage( - name: str, value: object, context: Optional[Context] = None + name: str, value: object, context: Context | None = None ) -> Context: """Sets a value in the Baggage @@ -82,7 +80,7 @@ def set_baggage( return set_value(_BAGGAGE_KEY, baggage, context=context) -def remove_baggage(name: str, context: Optional[Context] = None) -> Context: +def remove_baggage(name: str, context: Context | None = None) -> Context: """Removes a value from the Baggage Args: @@ -98,7 +96,7 @@ def remove_baggage(name: str, context: Optional[Context] = None) -> Context: return set_value(_BAGGAGE_KEY, baggage, context=context) -def clear(context: Optional[Context] = None) -> Context: +def clear(context: Context | None = None) -> Context: """Removes all values from the Baggage Args: @@ -110,7 +108,7 @@ def clear(context: Optional[Context] = None) -> Context: return set_value(_BAGGAGE_KEY, {}, context=context) -def _get_baggage_value(context: Optional[Context] = None) -> Dict[str, object]: +def _get_baggage_value(context: Context | None = None) -> dict[str, object]: baggage = get_value(_BAGGAGE_KEY, context=context) if isinstance(baggage, dict): return baggage diff --git a/opentelemetry-api/src/opentelemetry/baggage/propagation/__init__.py b/opentelemetry-api/src/opentelemetry/baggage/propagation/__init__.py index 49fb378eabd..5c6f5645fbc 100644 --- a/opentelemetry-api/src/opentelemetry/baggage/propagation/__init__.py +++ b/opentelemetry-api/src/opentelemetry/baggage/propagation/__init__.py @@ -12,9 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. # +from collections.abc import Iterable, Mapping from logging import getLogger from re import split -from typing import Iterable, List, Mapping, Optional, Set from urllib.parse import quote_plus, unquote_plus from opentelemetry.baggage import _is_valid_pair, get_all, set_baggage @@ -37,7 +37,7 @@ class W3CBaggagePropagator(textmap.TextMapPropagator): def extract( self, carrier: textmap.CarrierT, - context: Optional[Context] = None, + context: Context | None = None, getter: textmap.Getter[textmap.CarrierT] = textmap.default_getter, ) -> Context: """Extract Baggage from the carrier. @@ -63,7 +63,7 @@ def extract( ) return context - baggage_entries: List[str] = split(_DELIMITER_PATTERN, header) + baggage_entries: list[str] = split(_DELIMITER_PATTERN, header) total_baggage_entries = self._MAX_PAIRS if len(baggage_entries) > self._MAX_PAIRS: @@ -110,7 +110,7 @@ def extract( def inject( self, carrier: textmap.CarrierT, - context: Optional[Context] = None, + context: Context | None = None, setter: textmap.Setter[textmap.CarrierT] = textmap.default_setter, ) -> None: """Injects Baggage into the carrier. @@ -126,7 +126,7 @@ def inject( setter.set(carrier, self._BAGGAGE_HEADER_NAME, baggage_string) @property - def fields(self) -> Set[str]: + def fields(self) -> set[str]: """Returns a set with the fields set in `inject`.""" return {self._BAGGAGE_HEADER_NAME} @@ -139,8 +139,8 @@ def _format_baggage(baggage_entries: Mapping[str, object]) -> str: def _extract_first_element( - items: Optional[Iterable[textmap.CarrierT]], -) -> Optional[textmap.CarrierT]: + items: Iterable[textmap.CarrierT] | None, +) -> textmap.CarrierT | None: 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 9287d5b401e..83eeef2825d 100644 --- a/opentelemetry-api/src/opentelemetry/context/__init__.py +++ b/opentelemetry-api/src/opentelemetry/context/__init__.py @@ -15,7 +15,6 @@ from __future__ import annotations import logging -import typing from contextvars import Token from os import environ from uuid import uuid4 @@ -82,7 +81,7 @@ def create_key(keyname: str) -> str: return keyname + "-" + str(uuid4()) -def get_value(key: str, context: typing.Optional[Context] = None) -> object: +def get_value(key: str, context: Context | None = 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, and returns a value. @@ -98,7 +97,7 @@ def get_value(key: str, context: typing.Optional[Context] = None) -> object: def set_value( - key: str, value: object, context: typing.Optional[Context] = None + key: str, value: object, context: Context | None = None ) -> Context: """To record the local state of a cross-cutting concern, the RuntimeContext API provides a function which takes a context, a diff --git a/opentelemetry-api/src/opentelemetry/context/context.py b/opentelemetry-api/src/opentelemetry/context/context.py index c1ef9cfbb6b..4d9348a63a2 100644 --- a/opentelemetry-api/src/opentelemetry/context/context.py +++ b/opentelemetry-api/src/opentelemetry/context/context.py @@ -14,12 +14,11 @@ from __future__ import annotations -import typing from abc import ABC, abstractmethod from contextvars import Token -class Context(typing.Dict[str, object]): +class Context(dict[str, object]): def __setitem__(self, key: str, value: object) -> None: raise ValueError diff --git a/opentelemetry-api/src/opentelemetry/metrics/_internal/__init__.py b/opentelemetry-api/src/opentelemetry/metrics/_internal/__init__.py index 93658a7974e..4acc0617026 100644 --- a/opentelemetry-api/src/opentelemetry/metrics/_internal/__init__.py +++ b/opentelemetry-api/src/opentelemetry/metrics/_internal/__init__.py @@ -42,11 +42,12 @@ import warnings from abc import ABC, abstractmethod +from collections.abc import Sequence from dataclasses import dataclass from logging import getLogger from os import environ from threading import Lock -from typing import Dict, List, Optional, Sequence, Union, cast +from typing import cast from opentelemetry.environment_variables import OTEL_PYTHON_METER_PROVIDER from opentelemetry.metrics._internal.instrument import ( @@ -84,15 +85,15 @@ # pylint: disable=invalid-name -_ProxyInstrumentT = Union[ - _ProxyCounter, - _ProxyHistogram, - _ProxyGauge, - _ProxyObservableCounter, - _ProxyObservableGauge, - _ProxyObservableUpDownCounter, - _ProxyUpDownCounter, -] +_ProxyInstrumentT = ( + _ProxyCounter + | _ProxyHistogram + | _ProxyGauge + | _ProxyObservableCounter + | _ProxyObservableGauge + | _ProxyObservableUpDownCounter + | _ProxyUpDownCounter +) class MeterProvider(ABC): @@ -104,9 +105,9 @@ class MeterProvider(ABC): def get_meter( self, name: str, - version: Optional[str] = None, - schema_url: Optional[str] = None, - attributes: Optional[Attributes] = None, + version: str | None = None, + schema_url: str | None = None, + attributes: Attributes | None = None, ) -> "Meter": """Returns a `Meter` for use by the given instrumentation library. @@ -143,9 +144,9 @@ class NoOpMeterProvider(MeterProvider): def get_meter( self, name: str, - version: Optional[str] = None, - schema_url: Optional[str] = None, - attributes: Optional[Attributes] = None, + version: str | None = None, + schema_url: str | None = None, + attributes: Attributes | None = None, ) -> "Meter": """Returns a NoOpMeter.""" return NoOpMeter(name, version=version, schema_url=schema_url) @@ -154,15 +155,15 @@ def get_meter( class _ProxyMeterProvider(MeterProvider): def __init__(self) -> None: self._lock = Lock() - self._meters: List[_ProxyMeter] = [] - self._real_meter_provider: Optional[MeterProvider] = None + self._meters: list[_ProxyMeter] = [] + self._real_meter_provider: MeterProvider | None = None def get_meter( self, name: str, - version: Optional[str] = None, - schema_url: Optional[str] = None, - attributes: Optional[Attributes] = None, + version: str | None = None, + schema_url: str | None = None, + attributes: Attributes | None = None, ) -> "Meter": with self._lock: if self._real_meter_provider is not None: @@ -186,7 +187,7 @@ class _InstrumentRegistrationStatus: instrument_id: str already_registered: bool conflict: bool - current_advisory: Optional[_MetricsHistogramAdvisory] + current_advisory: _MetricsHistogramAdvisory | None class Meter(ABC): @@ -199,16 +200,14 @@ class Meter(ABC): def __init__( self, name: str, - version: Optional[str] = None, - schema_url: Optional[str] = None, + version: str | None = None, + schema_url: str | None = None, ) -> None: super().__init__() self._name = name self._version = version self._schema_url = schema_url - self._instrument_ids: Dict[ - str, Optional[_MetricsHistogramAdvisory] - ] = {} + self._instrument_ids: dict[str, _MetricsHistogramAdvisory | None] = {} self._instrument_ids_lock = Lock() @property @@ -219,14 +218,14 @@ def name(self) -> str: return self._name @property - def version(self) -> Optional[str]: + def version(self) -> str | None: """ The version string of the instrumenting library. """ return self._version @property - def schema_url(self) -> Optional[str]: + def schema_url(self) -> str | None: """ Specifies the Schema URL of the emitted telemetry """ @@ -238,7 +237,7 @@ def _register_instrument( type_: type, unit: str, description: str, - advisory: Optional[_MetricsHistogramAdvisory] = None, + advisory: _MetricsHistogramAdvisory | None = None, ) -> _InstrumentRegistrationStatus: """ Register an instrument with the name, type, unit and description as @@ -331,7 +330,7 @@ def create_up_down_counter( def create_observable_counter( self, name: str, - callbacks: Optional[Sequence[CallbackT]] = None, + callbacks: Sequence[CallbackT] | None = None, unit: str = "", description: str = "", ) -> ObservableCounter: @@ -431,7 +430,7 @@ def create_histogram( unit: str = "", description: str = "", *, - explicit_bucket_boundaries_advisory: Optional[Sequence[float]] = None, + explicit_bucket_boundaries_advisory: Sequence[float] | None = None, ) -> Histogram: """Creates a :class:`~opentelemetry.metrics.Histogram` instrument @@ -462,7 +461,7 @@ def create_gauge( # type: ignore # pylint: disable=no-self-use def create_observable_gauge( self, name: str, - callbacks: Optional[Sequence[CallbackT]] = None, + callbacks: Sequence[CallbackT] | None = None, unit: str = "", description: str = "", ) -> ObservableGauge: @@ -482,7 +481,7 @@ def create_observable_gauge( def create_observable_up_down_counter( self, name: str, - callbacks: Optional[Sequence[CallbackT]] = None, + callbacks: Sequence[CallbackT] | None = None, unit: str = "", description: str = "", ) -> ObservableUpDownCounter: @@ -503,13 +502,13 @@ class _ProxyMeter(Meter): def __init__( self, name: str, - version: Optional[str] = None, - schema_url: Optional[str] = None, + version: str | None = None, + schema_url: str | None = None, ) -> None: super().__init__(name, version=version, schema_url=schema_url) self._lock = Lock() - self._instruments: List[_ProxyInstrumentT] = [] - self._real_meter: Optional[Meter] = None + self._instruments: list[_ProxyInstrumentT] = [] + self._real_meter: Meter | None = None def on_set_meter_provider(self, meter_provider: MeterProvider) -> None: """Called when a real meter provider is set on the creating _ProxyMeterProvider @@ -559,7 +558,7 @@ def create_up_down_counter( def create_observable_counter( self, name: str, - callbacks: Optional[Sequence[CallbackT]] = None, + callbacks: Sequence[CallbackT] | None = None, unit: str = "", description: str = "", ) -> ObservableCounter: @@ -580,7 +579,7 @@ def create_histogram( unit: str = "", description: str = "", *, - explicit_bucket_boundaries_advisory: Optional[Sequence[float]] = None, + explicit_bucket_boundaries_advisory: Sequence[float] | None = None, ) -> Histogram: with self._lock: if self._real_meter: @@ -612,7 +611,7 @@ def create_gauge( def create_observable_gauge( self, name: str, - callbacks: Optional[Sequence[CallbackT]] = None, + callbacks: Sequence[CallbackT] | None = None, unit: str = "", description: str = "", ) -> ObservableGauge: @@ -630,7 +629,7 @@ def create_observable_gauge( def create_observable_up_down_counter( self, name: str, - callbacks: Optional[Sequence[CallbackT]] = None, + callbacks: Sequence[CallbackT] | None = None, unit: str = "", description: str = "", ) -> ObservableUpDownCounter: @@ -717,7 +716,7 @@ def create_up_down_counter( def create_observable_counter( self, name: str, - callbacks: Optional[Sequence[CallbackT]] = None, + callbacks: Sequence[CallbackT] | None = None, unit: str = "", description: str = "", ) -> ObservableCounter: @@ -746,7 +745,7 @@ def create_histogram( unit: str = "", description: str = "", *, - explicit_bucket_boundaries_advisory: Optional[Sequence[float]] = None, + explicit_bucket_boundaries_advisory: Sequence[float] | None = None, ) -> Histogram: """Returns a no-op Histogram.""" status = self._register_instrument( @@ -776,7 +775,7 @@ def create_histogram( def create_observable_gauge( self, name: str, - callbacks: Optional[Sequence[CallbackT]] = None, + callbacks: Sequence[CallbackT] | None = None, unit: str = "", description: str = "", ) -> ObservableGauge: @@ -802,7 +801,7 @@ def create_observable_gauge( def create_observable_up_down_counter( self, name: str, - callbacks: Optional[Sequence[CallbackT]] = None, + callbacks: Sequence[CallbackT] | None = None, unit: str = "", description: str = "", ) -> ObservableUpDownCounter: @@ -827,16 +826,16 @@ def create_observable_up_down_counter( _METER_PROVIDER_SET_ONCE = Once() -_METER_PROVIDER: Optional[MeterProvider] = None +_METER_PROVIDER: MeterProvider | None = None _PROXY_METER_PROVIDER = _ProxyMeterProvider() def get_meter( name: str, version: str = "", - meter_provider: Optional[MeterProvider] = None, - schema_url: Optional[str] = None, - attributes: Optional[Attributes] = None, + meter_provider: MeterProvider | None = None, + schema_url: str | None = None, + attributes: Attributes | None = None, ) -> "Meter": """Returns a `Meter` for use by the given instrumentation library. diff --git a/opentelemetry-api/src/opentelemetry/metrics/_internal/instrument.py b/opentelemetry-api/src/opentelemetry/metrics/_internal/instrument.py index cfd7a1526c6..268e126de24 100644 --- a/opentelemetry-api/src/opentelemetry/metrics/_internal/instrument.py +++ b/opentelemetry-api/src/opentelemetry/metrics/_internal/instrument.py @@ -16,19 +16,13 @@ from abc import ABC, abstractmethod +from collections.abc import Callable, Generator, Iterable, Sequence from dataclasses import dataclass from logging import getLogger from re import compile as re_compile from typing import ( - Callable, - Dict, - Generator, Generic, - Iterable, - Optional, - Sequence, TypeVar, - Union, ) # pylint: disable=unused-import; needed for typing and sphinx @@ -47,7 +41,7 @@ @dataclass(frozen=True) class _MetricsHistogramAdvisory: - explicit_bucket_boundaries: Optional[Sequence[float]] = None + explicit_bucket_boundaries: Sequence[float] | None = None @dataclass(frozen=True) @@ -64,10 +58,10 @@ class CallbackOptions: InstrumentT = TypeVar("InstrumentT", bound="Instrument") # pylint: disable=invalid-name -CallbackT = Union[ - Callable[[CallbackOptions], Iterable[Observation]], - Generator[Iterable[Observation], CallbackOptions, None], -] +CallbackT = ( + Callable[[CallbackOptions], Iterable[Observation]] + | Generator[Iterable[Observation], CallbackOptions, None] +) class Instrument(ABC): @@ -85,7 +79,7 @@ def __init__( @staticmethod def _check_name_unit_description( name: str, unit: str, description: str - ) -> Dict[str, Optional[str]]: + ) -> dict[str, str | None]: """ Checks the following instrument name, unit and description for compliance with the spec. @@ -96,7 +90,7 @@ def _check_name_unit_description( original values. """ - result: Dict[str, Optional[str]] = {} + result: dict[str, str | None] = {} if _name_regex.fullmatch(name) is not None: result["name"] = name @@ -128,7 +122,7 @@ def __init__( self._name = name self._unit = unit self._description = description - self._real_instrument: Optional[InstrumentT] = None + self._real_instrument: InstrumentT | None = None def on_meter_set(self, meter: "metrics.Meter") -> None: """Called when a real meter is set on the creating _ProxyMeter""" @@ -147,7 +141,7 @@ class _ProxyAsynchronousInstrument(_ProxyInstrument[InstrumentT]): def __init__( self, name: str, - callbacks: Optional[Sequence[CallbackT]] = None, + callbacks: Sequence[CallbackT] | None = None, unit: str = "", description: str = "", ) -> None: @@ -166,7 +160,7 @@ class Asynchronous(Instrument): def __init__( self, name: str, - callbacks: Optional[Sequence[CallbackT]] = None, + callbacks: Sequence[CallbackT] | None = None, unit: str = "", description: str = "", ) -> None: @@ -179,9 +173,9 @@ class Counter(Synchronous): @abstractmethod def add( self, - amount: Union[int, float], - attributes: Optional[Attributes] = None, - context: Optional[Context] = None, + amount: int | float, + attributes: Attributes | None = None, + context: Context | None = None, ) -> None: """Records an increment to the counter. @@ -206,9 +200,9 @@ def __init__( def add( self, - amount: Union[int, float], - attributes: Optional[Attributes] = None, - context: Optional[Context] = None, + amount: int | float, + attributes: Attributes | None = None, + context: Context | None = None, ) -> None: return super().add(amount, attributes=attributes, context=context) @@ -216,9 +210,9 @@ def add( class _ProxyCounter(_ProxyInstrument[Counter], Counter): def add( self, - amount: Union[int, float], - attributes: Optional[Attributes] = None, - context: Optional[Context] = None, + amount: int | float, + attributes: Attributes | None = None, + context: Context | None = None, ) -> None: if self._real_instrument: self._real_instrument.add(amount, attributes, context) @@ -237,9 +231,9 @@ class UpDownCounter(Synchronous): @abstractmethod def add( self, - amount: Union[int, float], - attributes: Optional[Attributes] = None, - context: Optional[Context] = None, + amount: int | float, + attributes: Attributes | None = None, + context: Context | None = None, ) -> None: """Records an increment or decrement to the counter. @@ -268,9 +262,9 @@ def __init__( def add( self, - amount: Union[int, float], - attributes: Optional[Attributes] = None, - context: Optional[Context] = None, + amount: int | float, + attributes: Attributes | None = None, + context: Context | None = None, ) -> None: return super().add(amount, attributes=attributes, context=context) @@ -278,9 +272,9 @@ def add( class _ProxyUpDownCounter(_ProxyInstrument[UpDownCounter], UpDownCounter): def add( self, - amount: Union[int, float], - attributes: Optional[Attributes] = None, - context: Optional[Context] = None, + amount: int | float, + attributes: Attributes | None = None, + context: Context | None = None, ) -> None: if self._real_instrument: self._real_instrument.add(amount, attributes, context) @@ -305,7 +299,7 @@ class NoOpObservableCounter(ObservableCounter): def __init__( self, name: str, - callbacks: Optional[Sequence[CallbackT]] = None, + callbacks: Sequence[CallbackT] | None = None, unit: str = "", description: str = "", ) -> None: @@ -344,7 +338,7 @@ class NoOpObservableUpDownCounter(ObservableUpDownCounter): def __init__( self, name: str, - callbacks: Optional[Sequence[CallbackT]] = None, + callbacks: Sequence[CallbackT] | None = None, unit: str = "", description: str = "", ) -> None: @@ -383,16 +377,16 @@ def __init__( name: str, unit: str = "", description: str = "", - explicit_bucket_boundaries_advisory: Optional[Sequence[float]] = None, + explicit_bucket_boundaries_advisory: Sequence[float] | None = None, ) -> None: pass @abstractmethod def record( self, - amount: Union[int, float], - attributes: Optional[Attributes] = None, - context: Optional[Context] = None, + amount: int | float, + attributes: Attributes | None = None, + context: Context | None = None, ) -> None: """Records a measurement. @@ -418,7 +412,7 @@ def __init__( name: str, unit: str = "", description: str = "", - explicit_bucket_boundaries_advisory: Optional[Sequence[float]] = None, + explicit_bucket_boundaries_advisory: Sequence[float] | None = None, ) -> None: super().__init__( name, @@ -429,9 +423,9 @@ def __init__( def record( self, - amount: Union[int, float], - attributes: Optional[Attributes] = None, - context: Optional[Context] = None, + amount: int | float, + attributes: Attributes | None = None, + context: Context | None = None, ) -> None: return super().record(amount, attributes=attributes, context=context) @@ -442,7 +436,7 @@ def __init__( name: str, unit: str = "", description: str = "", - explicit_bucket_boundaries_advisory: Optional[Sequence[float]] = None, + explicit_bucket_boundaries_advisory: Sequence[float] | None = None, ) -> None: super().__init__(name, unit=unit, description=description) self._explicit_bucket_boundaries_advisory = ( @@ -451,9 +445,9 @@ def __init__( def record( self, - amount: Union[int, float], - attributes: Optional[Attributes] = None, - context: Optional[Context] = None, + amount: int | float, + attributes: Attributes | None = None, + context: Context | None = None, ) -> None: if self._real_instrument: self._real_instrument.record(amount, attributes, context) @@ -480,7 +474,7 @@ class NoOpObservableGauge(ObservableGauge): def __init__( self, name: str, - callbacks: Optional[Sequence[CallbackT]] = None, + callbacks: Sequence[CallbackT] | None = None, unit: str = "", description: str = "", ) -> None: @@ -513,9 +507,9 @@ class Gauge(Synchronous): @abstractmethod def set( self, - amount: Union[int, float], - attributes: Optional[Attributes] = None, - context: Optional[Context] = None, + amount: int | float, + attributes: Attributes | None = None, + context: Context | None = None, ) -> None: """Records the current value of the gauge. @@ -544,9 +538,9 @@ def __init__( def set( self, - amount: Union[int, float], - attributes: Optional[Attributes] = None, - context: Optional[Context] = None, + amount: int | float, + attributes: Attributes | None = None, + context: Context | None = None, ) -> None: return super().set(amount, attributes=attributes, context=context) @@ -557,9 +551,9 @@ class _ProxyGauge( ): def set( self, - amount: Union[int, float], - attributes: Optional[Attributes] = None, - context: Optional[Context] = None, + amount: int | float, + attributes: Attributes | None = None, + context: Context | None = None, ) -> None: if self._real_instrument: self._real_instrument.set(amount, attributes, context) diff --git a/opentelemetry-api/src/opentelemetry/metrics/_internal/observation.py b/opentelemetry-api/src/opentelemetry/metrics/_internal/observation.py index ffc254b20a4..d64ab7eb992 100644 --- a/opentelemetry-api/src/opentelemetry/metrics/_internal/observation.py +++ b/opentelemetry-api/src/opentelemetry/metrics/_internal/observation.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import Optional, Union from opentelemetry.context import Context from opentelemetry.util.types import Attributes @@ -31,16 +30,16 @@ class Observation: def __init__( self, - value: Union[int, float], + value: int | float, attributes: Attributes = None, - context: Optional[Context] = None, + context: Context | None = None, ) -> None: self._value = value self._attributes = attributes self._context = context @property - def value(self) -> Union[float, int]: + def value(self) -> float | int: return self._value @property @@ -48,7 +47,7 @@ def attributes(self) -> Attributes: return self._attributes @property - def context(self) -> Optional[Context]: + def context(self) -> Context | None: return self._context def __eq__(self, other: object) -> bool: diff --git a/opentelemetry-api/src/opentelemetry/propagate/__init__.py b/opentelemetry-api/src/opentelemetry/propagate/__init__.py index 02381147f9b..0c704146ac7 100644 --- a/opentelemetry-api/src/opentelemetry/propagate/__init__.py +++ b/opentelemetry-api/src/opentelemetry/propagate/__init__.py @@ -70,7 +70,6 @@ def example_route(): from logging import getLogger from os import environ -from typing import List, Optional from opentelemetry.context.context import Context from opentelemetry.environment_variables import OTEL_PROPAGATORS @@ -82,7 +81,7 @@ def example_route(): def extract( carrier: textmap.CarrierT, - context: Optional[Context] = None, + context: Context | None = None, getter: textmap.Getter[textmap.CarrierT] = textmap.default_getter, ) -> Context: """Uses the configured propagator to extract a Context from the carrier. @@ -103,7 +102,7 @@ def extract( def inject( carrier: textmap.CarrierT, - context: Optional[Context] = None, + context: Context | None = None, setter: textmap.Setter[textmap.CarrierT] = textmap.default_setter, ) -> None: """Uses the configured propagator to inject a Context into the carrier. @@ -121,7 +120,7 @@ def inject( get_global_textmap().inject(carrier, context=context, setter=setter) -propagators: List[textmap.TextMapPropagator] = [] +propagators: list[textmap.TextMapPropagator] = [] # Single use variable here to hack black and make lint pass environ_propagators = environ.get( diff --git a/opentelemetry-api/src/opentelemetry/propagators/_envcarrier.py b/opentelemetry-api/src/opentelemetry/propagators/_envcarrier.py index 0ea5f48bcdb..b4bf952fdff 100644 --- a/opentelemetry-api/src/opentelemetry/propagators/_envcarrier.py +++ b/opentelemetry-api/src/opentelemetry/propagators/_envcarrier.py @@ -38,13 +38,13 @@ class EnvironmentGetter(Getter[typing.Mapping[str, str]]): def __init__(self): # Create case-insensitive lookup from current environment # Per spec: "creates an in-memory copy of the current environment variables" - self.carrier: typing.Dict[str, str] = { + self.carrier: dict[str, str] = { k.lower(): v for k, v in os.environ.items() } def get( self, carrier: typing.Mapping[str, str], key: str - ) -> typing.Optional[typing.List[str]]: + ) -> list[str] | None: """Get a value from the environment carrier for the given key. Args: @@ -61,7 +61,7 @@ def get( return list(val) return [val] - def keys(self, carrier: typing.Mapping[str, str]) -> typing.List[str]: + def keys(self, carrier: typing.Mapping[str, str]) -> list[str]: """Get all keys from the environment carrier. Args: diff --git a/opentelemetry-api/src/opentelemetry/propagators/composite.py b/opentelemetry-api/src/opentelemetry/propagators/composite.py index 08dddb03cd8..6aad5f567ac 100644 --- a/opentelemetry-api/src/opentelemetry/propagators/composite.py +++ b/opentelemetry-api/src/opentelemetry/propagators/composite.py @@ -38,7 +38,7 @@ def __init__( def extract( self, carrier: textmap.CarrierT, - context: typing.Optional[Context] = None, + context: Context | None = None, getter: textmap.Getter[textmap.CarrierT] = textmap.default_getter, ) -> Context: """Run each of the configured propagators with the given context and carrier. @@ -55,7 +55,7 @@ def extract( def inject( self, carrier: textmap.CarrierT, - context: typing.Optional[Context] = None, + context: Context | None = None, setter: textmap.Setter[textmap.CarrierT] = textmap.default_setter, ) -> None: """Run each of the configured propagators with the given context and carrier. @@ -69,7 +69,7 @@ def inject( propagator.inject(carrier, context, setter=setter) @property - def fields(self) -> typing.Set[str]: + def fields(self) -> set[str]: """Returns a set with the fields set in `inject`. See diff --git a/opentelemetry-api/src/opentelemetry/propagators/textmap.py b/opentelemetry-api/src/opentelemetry/propagators/textmap.py index 42f1124f36d..7a4e6b0f19f 100644 --- a/opentelemetry-api/src/opentelemetry/propagators/textmap.py +++ b/opentelemetry-api/src/opentelemetry/propagators/textmap.py @@ -19,7 +19,7 @@ CarrierT = typing.TypeVar("CarrierT") # pylint: disable=invalid-name -CarrierValT = typing.Union[typing.List[str], str] +CarrierValT = list[str] | str class Getter(abc.ABC, typing.Generic[CarrierT]): @@ -28,9 +28,7 @@ class Getter(abc.ABC, typing.Generic[CarrierT]): """ @abc.abstractmethod - def get( - self, carrier: CarrierT, key: str - ) -> typing.Optional[typing.List[str]]: + def get(self, carrier: CarrierT, key: str) -> list[str] | None: """Function that can retrieve zero or more values from the carrier. In the case that the value does not exist, returns None. @@ -44,7 +42,7 @@ def get( """ @abc.abstractmethod - def keys(self, carrier: CarrierT) -> typing.List[str]: + def keys(self, carrier: CarrierT) -> list[str]: """Function that can retrieve all the keys in a carrier object. Args: @@ -75,7 +73,7 @@ def set(self, carrier: CarrierT, key: str, value: str) -> None: class DefaultGetter(Getter[typing.Mapping[str, CarrierValT]]): def get( self, carrier: typing.Mapping[str, CarrierValT], key: str - ) -> typing.Optional[typing.List[str]]: + ) -> list[str] | None: """Getter implementation to retrieve a value from a dictionary. Args: @@ -91,9 +89,7 @@ def get( return list(val) return [val] - def keys( - self, carrier: typing.Mapping[str, CarrierValT] - ) -> typing.List[str]: + def keys(self, carrier: typing.Mapping[str, CarrierValT]) -> list[str]: """Keys implementation that returns all keys from a dictionary.""" return list(carrier.keys()) @@ -134,7 +130,7 @@ class TextMapPropagator(abc.ABC): def extract( self, carrier: CarrierT, - context: typing.Optional[Context] = None, + context: Context | None = None, getter: Getter[CarrierT] = default_getter, ) -> Context: """Create a Context from values in the carrier. @@ -162,7 +158,7 @@ def extract( def inject( self, carrier: CarrierT, - context: typing.Optional[Context] = None, + context: Context | None = None, setter: Setter[CarrierT] = default_setter, ) -> None: """Inject values from a Context into a carrier. @@ -185,7 +181,7 @@ def inject( @property @abc.abstractmethod - def fields(self) -> typing.Set[str]: + def fields(self) -> set[str]: """ Gets the fields set in the carrier by the `inject` method. diff --git a/opentelemetry-api/src/opentelemetry/trace/__init__.py b/opentelemetry-api/src/opentelemetry/trace/__init__.py index 7ec36a21533..649bd1efb09 100644 --- a/opentelemetry-api/src/opentelemetry/trace/__init__.py +++ b/opentelemetry-api/src/opentelemetry/trace/__init__.py @@ -74,11 +74,11 @@ """ import os -import typing from abc import ABC, abstractmethod +from collections.abc import Iterator, Sequence from enum import Enum from logging import getLogger -from typing import Iterator, Optional, Sequence, cast +from typing import cast from typing_extensions import deprecated @@ -156,7 +156,7 @@ def dropped_attributes(self) -> int: return 0 -_Links = Optional[Sequence[Link]] +_Links = Sequence[Link] | None class SpanKind(Enum): @@ -193,9 +193,9 @@ class TracerProvider(ABC): def get_tracer( self, instrumenting_module_name: str, - instrumenting_library_version: typing.Optional[str] = None, - schema_url: typing.Optional[str] = None, - attributes: typing.Optional[types.Attributes] = None, + instrumenting_library_version: str | None = None, + schema_url: str | None = None, + attributes: types.Attributes | None = None, ) -> "Tracer": """Returns a `Tracer` for use by the given instrumentation library. @@ -236,9 +236,9 @@ class NoOpTracerProvider(TracerProvider): def get_tracer( self, instrumenting_module_name: str, - instrumenting_library_version: typing.Optional[str] = None, - schema_url: typing.Optional[str] = None, - attributes: typing.Optional[types.Attributes] = None, + instrumenting_library_version: str | None = None, + schema_url: str | None = None, + attributes: types.Attributes | None = None, ) -> "Tracer": # pylint:disable=no-self-use,unused-argument return NoOpTracer() @@ -258,9 +258,9 @@ class ProxyTracerProvider(TracerProvider): def get_tracer( self, instrumenting_module_name: str, - instrumenting_library_version: typing.Optional[str] = None, - schema_url: typing.Optional[str] = None, - attributes: typing.Optional[types.Attributes] = None, + instrumenting_library_version: str | None = None, + schema_url: str | None = None, + attributes: types.Attributes | None = None, ) -> "Tracer": if _TRACER_PROVIDER: return _TRACER_PROVIDER.get_tracer( @@ -288,11 +288,11 @@ class Tracer(ABC): def start_span( self, name: str, - context: Optional[Context] = None, + context: Context | None = None, kind: SpanKind = SpanKind.INTERNAL, attributes: types.Attributes = None, links: _Links = None, - start_time: Optional[int] = None, + start_time: int | None = None, record_exception: bool = True, set_status_on_exception: bool = True, ) -> "Span": @@ -343,11 +343,11 @@ def start_span( def start_as_current_span( self, name: str, - context: Optional[Context] = None, + context: Context | None = None, kind: SpanKind = SpanKind.INTERNAL, attributes: types.Attributes = None, links: _Links = None, - start_time: Optional[int] = None, + start_time: int | None = None, record_exception: bool = True, set_status_on_exception: bool = True, end_on_exit: bool = True, @@ -419,15 +419,15 @@ class ProxyTracer(Tracer): def __init__( self, instrumenting_module_name: str, - instrumenting_library_version: typing.Optional[str] = None, - schema_url: typing.Optional[str] = None, - attributes: typing.Optional[types.Attributes] = None, + instrumenting_library_version: str | None = None, + schema_url: str | None = None, + attributes: types.Attributes | None = None, ): self._instrumenting_module_name = instrumenting_module_name self._instrumenting_library_version = instrumenting_library_version self._schema_url = schema_url self._attributes = attributes - self._real_tracer: Optional[Tracer] = None + self._real_tracer: Tracer | None = None self._noop_tracer = NoOpTracer() @property @@ -463,11 +463,11 @@ class NoOpTracer(Tracer): def start_span( self, name: str, - context: Optional[Context] = None, + context: Context | None = None, kind: SpanKind = SpanKind.INTERNAL, attributes: types.Attributes = None, links: _Links = None, - start_time: Optional[int] = None, + start_time: int | None = None, record_exception: bool = True, set_status_on_exception: bool = True, ) -> "Span": @@ -491,11 +491,11 @@ def start_span( def start_as_current_span( self, name: str, - context: Optional[Context] = None, + context: Context | None = None, kind: SpanKind = SpanKind.INTERNAL, attributes: types.Attributes = None, links: _Links = None, - start_time: Optional[int] = None, + start_time: int | None = None, record_exception: bool = True, set_status_on_exception: bool = True, end_on_exit: bool = True, @@ -528,16 +528,16 @@ class _DefaultTracer(NoOpTracer): _TRACER_PROVIDER_SET_ONCE = Once() -_TRACER_PROVIDER: Optional[TracerProvider] = None +_TRACER_PROVIDER: TracerProvider | None = None _PROXY_TRACER_PROVIDER = ProxyTracerProvider() def get_tracer( instrumenting_module_name: str, - instrumenting_library_version: typing.Optional[str] = None, - tracer_provider: Optional[TracerProvider] = None, - schema_url: typing.Optional[str] = None, - attributes: typing.Optional[types.Attributes] = None, + instrumenting_library_version: str | None = None, + tracer_provider: TracerProvider | None = None, + schema_url: str | None = None, + attributes: types.Attributes | None = None, ) -> "Tracer": """Returns a `Tracer` for use by the given instrumentation library. diff --git a/opentelemetry-api/src/opentelemetry/trace/propagation/__init__.py b/opentelemetry-api/src/opentelemetry/trace/propagation/__init__.py index d3529e1779e..c66302ff314 100644 --- a/opentelemetry-api/src/opentelemetry/trace/propagation/__init__.py +++ b/opentelemetry-api/src/opentelemetry/trace/propagation/__init__.py @@ -11,7 +11,6 @@ # 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. -from typing import Optional from opentelemetry.context import create_key, get_value, set_value from opentelemetry.context.context import Context @@ -21,9 +20,7 @@ _SPAN_KEY = create_key("current-span") -def set_span_in_context( - span: Span, context: Optional[Context] = None -) -> Context: +def set_span_in_context(span: Span, context: Context | None = None) -> Context: """Set the span in the given context. Args: @@ -35,7 +32,7 @@ def set_span_in_context( return ctx -def get_current_span(context: Optional[Context] = None) -> Span: +def get_current_span(context: Context | None = None) -> Span: """Retrieve the current span. Args: diff --git a/opentelemetry-api/src/opentelemetry/trace/propagation/tracecontext.py b/opentelemetry-api/src/opentelemetry/trace/propagation/tracecontext.py index af16a08f0be..ac8dc122cfd 100644 --- a/opentelemetry-api/src/opentelemetry/trace/propagation/tracecontext.py +++ b/opentelemetry-api/src/opentelemetry/trace/propagation/tracecontext.py @@ -13,7 +13,6 @@ # limitations under the License. # import re -import typing from opentelemetry import trace from opentelemetry.context.context import Context @@ -36,7 +35,7 @@ class TraceContextTextMapPropagator(textmap.TextMapPropagator): def extract( self, carrier: textmap.CarrierT, - context: typing.Optional[Context] = None, + context: Context | None = None, getter: textmap.Getter[textmap.CarrierT] = textmap.default_getter, ) -> Context: """Extracts SpanContext from the carrier. @@ -89,7 +88,7 @@ def extract( def inject( self, carrier: textmap.CarrierT, - context: typing.Optional[Context] = None, + context: Context | None = None, setter: textmap.Setter[textmap.CarrierT] = textmap.default_setter, ) -> None: """Injects SpanContext into the carrier. @@ -109,7 +108,7 @@ def inject( ) @property - def fields(self) -> typing.Set[str]: + def fields(self) -> set[str]: """Returns a set with the fields set in `inject`. See diff --git a/opentelemetry-api/src/opentelemetry/trace/span.py b/opentelemetry-api/src/opentelemetry/trace/span.py index b0cda475e2f..b3fbf6956f2 100644 --- a/opentelemetry-api/src/opentelemetry/trace/span.py +++ b/opentelemetry-api/src/opentelemetry/trace/span.py @@ -57,7 +57,7 @@ class Span(abc.ABC): """A span represents a single operation within a trace.""" @abc.abstractmethod - def end(self, end_time: typing.Optional[int] = None) -> None: + def end(self, end_time: int | None = None) -> None: """Sets the current time as the span's end time. The span's end time is the wall time at which the operation finished. @@ -108,7 +108,7 @@ def add_event( self, name: str, attributes: types.Attributes = None, - timestamp: typing.Optional[int] = None, + timestamp: int | None = None, ) -> None: """Adds an `Event`. @@ -159,8 +159,8 @@ def is_recording(self) -> bool: @abc.abstractmethod def set_status( self, - status: typing.Union[Status, StatusCode], - description: typing.Optional[str] = None, + status: Status | StatusCode, + description: str | None = None, ) -> None: """Sets the Status of the Span. If used, this will override the default Span status. @@ -171,7 +171,7 @@ def record_exception( self, exception: BaseException, attributes: types.Attributes = None, - timestamp: typing.Optional[int] = None, + timestamp: int | None = None, escaped: bool = False, ) -> None: """Records an exception as a span event.""" @@ -185,9 +185,9 @@ def __enter__(self) -> "Span": def __exit__( self, - exc_type: typing.Optional[typing.Type[BaseException]], - exc_val: typing.Optional[BaseException], - exc_tb: typing.Optional[python_types.TracebackType], + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: python_types.TracebackType | None, ) -> None: """Ends context manager and calls `end` on the `Span`.""" @@ -234,9 +234,7 @@ class TraceState(typing.Mapping[str, str]): def __init__( self, - entries: typing.Optional[ - typing.Sequence[typing.Tuple[str, str]] - ] = None, + entries: typing.Sequence[tuple[str, str]] | None = None, ) -> None: self._dict = {} # type: dict[str, str] if entries is None: @@ -365,7 +363,7 @@ def to_header(self) -> str: return ",".join(key + "=" + value for key, value in self._dict.items()) @classmethod - def from_header(cls, header_list: typing.List[str]) -> "TraceState": + def from_header(cls, header_list: list[str]) -> "TraceState": """Parses one or more w3c tracestate header into a TraceState. Args: @@ -383,7 +381,7 @@ def from_header(cls, header_list: typing.List[str]) -> "TraceState": """ pairs = {} # type: dict[str, str] for header in header_list: - members: typing.List[str] = re.split(_delimiter_pattern, header) + members: list[str] = re.split(_delimiter_pattern, header) for member in members: # empty members are valid, but no need to process further. if not member: @@ -395,7 +393,7 @@ def from_header(cls, header_list: typing.List[str]) -> "TraceState": member, ) return cls() - groups: typing.Tuple[str, ...] = match.groups() + groups: tuple[str, ...] = match.groups() key, _eq, value = groups # duplicate keys are not legal in header if key in pairs: @@ -422,9 +420,7 @@ def values(self) -> typing.ValuesView[str]: _SPAN_ID_MAX_VALUE = 2**64 - 1 -class SpanContext( - typing.Tuple[int, int, bool, "TraceFlags", "TraceState", bool] -): +class SpanContext(tuple[int, int, bool, "TraceFlags", "TraceState", bool]): """The state of a Span to propagate between processes. This class includes the immutable attributes of a :class:`.Span` that must @@ -463,7 +459,7 @@ def __new__( def __getnewargs__( self, - ) -> typing.Tuple[int, int, bool, "TraceFlags", "TraceState"]: + ) -> tuple[int, int, bool, "TraceFlags", "TraceState"]: return ( self.trace_id, self.span_id, @@ -525,7 +521,7 @@ def get_span_context(self) -> "SpanContext": def is_recording(self) -> bool: return False - def end(self, end_time: typing.Optional[int] = None) -> None: + def end(self, end_time: int | None = None) -> None: pass def set_attributes( @@ -540,7 +536,7 @@ def add_event( self, name: str, attributes: types.Attributes = None, - timestamp: typing.Optional[int] = None, + timestamp: int | None = None, ) -> None: pass @@ -556,8 +552,8 @@ def update_name(self, name: str) -> None: def set_status( self, - status: typing.Union[Status, StatusCode], - description: typing.Optional[str] = None, + status: Status | StatusCode, + description: str | None = None, ) -> None: pass @@ -565,7 +561,7 @@ def record_exception( self, exception: BaseException, attributes: types.Attributes = None, - timestamp: typing.Optional[int] = None, + timestamp: int | None = None, escaped: bool = False, ) -> None: pass diff --git a/opentelemetry-api/src/opentelemetry/trace/status.py b/opentelemetry-api/src/opentelemetry/trace/status.py index ada7fa1ebda..14e16d50bdf 100644 --- a/opentelemetry-api/src/opentelemetry/trace/status.py +++ b/opentelemetry-api/src/opentelemetry/trace/status.py @@ -14,7 +14,6 @@ import enum import logging -import typing logger = logging.getLogger(__name__) @@ -44,7 +43,7 @@ class Status: def __init__( self, status_code: StatusCode = StatusCode.UNSET, - description: typing.Optional[str] = None, + description: str | None = None, ): self._status_code = status_code self._description = None @@ -67,7 +66,7 @@ def status_code(self) -> StatusCode: return self._status_code @property - def description(self) -> typing.Optional[str]: + def description(self) -> str | None: """Status description""" return self._description diff --git a/opentelemetry-api/src/opentelemetry/util/_decorator.py b/opentelemetry-api/src/opentelemetry/util/_decorator.py index b1a7f6c4259..c437057a824 100644 --- a/opentelemetry-api/src/opentelemetry/util/_decorator.py +++ b/opentelemetry-api/src/opentelemetry/util/_decorator.py @@ -15,7 +15,8 @@ import contextlib import functools import inspect -from typing import TYPE_CHECKING, Callable, Generic, Iterator, TypeVar +from collections.abc import Callable, Iterator +from typing import TYPE_CHECKING, Generic, TypeVar V = TypeVar("V") R = TypeVar("R") # Return type diff --git a/opentelemetry-api/src/opentelemetry/util/_once.py b/opentelemetry-api/src/opentelemetry/util/_once.py index c0cee43a174..4ec31bfa86e 100644 --- a/opentelemetry-api/src/opentelemetry/util/_once.py +++ b/opentelemetry-api/src/opentelemetry/util/_once.py @@ -12,8 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. +from collections.abc import Callable from threading import Lock -from typing import Callable class Once: diff --git a/opentelemetry-api/src/opentelemetry/util/re.py b/opentelemetry-api/src/opentelemetry/util/re.py index 28ecd03d3ec..c7d0ebc3073 100644 --- a/opentelemetry-api/src/opentelemetry/util/re.py +++ b/opentelemetry-api/src/opentelemetry/util/re.py @@ -12,9 +12,9 @@ # See the License for the specific language governing permissions and # limitations under the License. +from collections.abc import Mapping from logging import getLogger from re import compile, split -from typing import Dict, List, Mapping from urllib.parse import unquote from typing_extensions import deprecated @@ -75,8 +75,8 @@ def parse_env_headers(s: str, liberal: bool = False) -> Mapping[str, str]: If ``liberal`` is True we try to parse ``s`` anyway to be more compatible with other languages SDKs that accept non URL-encoded headers by default. """ - headers: Dict[str, str] = {} - headers_list: List[str] = split(_DELIMITER_PATTERN, s) + headers: dict[str, str] = {} + headers_list: list[str] = split(_DELIMITER_PATTERN, s) for header in headers_list: if not header: # empty string continue diff --git a/opentelemetry-api/src/opentelemetry/util/types.py b/opentelemetry-api/src/opentelemetry/util/types.py index 7455c741c93..3afbfb4e56c 100644 --- a/opentelemetry-api/src/opentelemetry/util/types.py +++ b/opentelemetry-api/src/opentelemetry/util/types.py @@ -12,46 +12,44 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import Mapping, Optional, Sequence, Tuple, Union +from collections.abc import Mapping, Sequence # This is the implementation of the "Any" type as specified by the specifications of OpenTelemetry data model for logs. # For more details, refer to the OTel specification: # https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/data-model.md#type-any -AnyValue = Union[ - str, - bool, - int, - float, - bytes, - Sequence["AnyValue"], - Mapping[str, "AnyValue"], - None, -] +AnyValue = ( + str + | bool + | int + | float + | bytes + | Sequence["AnyValue"] + | Mapping[str, "AnyValue"] + | None +) -AttributeValue = Union[ - str, - bool, - int, - float, - Sequence[str], - Sequence[bool], - Sequence[int], - Sequence[float], -] -Attributes = Optional[Mapping[str, AttributeValue]] -AttributesAsKey = Tuple[ - Tuple[ +AttributeValue = ( + str + | bool + | int + | float + | Sequence[str] + | Sequence[bool] + | Sequence[int] + | Sequence[float] +) +Attributes = Mapping[str, AttributeValue] | None +AttributesAsKey = tuple[ + tuple[ str, - Union[ - str, - bool, - int, - float, - Tuple[Optional[str], ...], - Tuple[Optional[bool], ...], - Tuple[Optional[int], ...], - Tuple[Optional[float], ...], - ], + str + | bool + | int + | float + | tuple[str | None, ...] + | tuple[bool | None, ...] + | tuple[int | None, ...] + | tuple[float | None, ...], ], ..., ] diff --git a/opentelemetry-api/tests/attributes/test_attributes.py b/opentelemetry-api/tests/attributes/test_attributes.py index ae3900ce9fa..4f8e4aca74b 100644 --- a/opentelemetry-api/tests/attributes/test_attributes.py +++ b/opentelemetry-api/tests/attributes/test_attributes.py @@ -17,7 +17,7 @@ import copy import unittest import unittest.mock -from typing import MutableSequence +from collections.abc import MutableSequence from opentelemetry.attributes import ( BoundedAttributes, diff --git a/opentelemetry-api/tests/events/test_proxy_event.py b/opentelemetry-api/tests/events/test_proxy_event.py index 44121a97d46..ad888e63a97 100644 --- a/opentelemetry-api/tests/events/test_proxy_event.py +++ b/opentelemetry-api/tests/events/test_proxy_event.py @@ -1,5 +1,4 @@ # pylint: disable=W0212,W0222,W0221 -import typing import unittest import opentelemetry._events as events @@ -11,9 +10,9 @@ class TestProvider(events.NoOpEventLoggerProvider): def get_event_logger( self, name: str, - version: typing.Optional[str] = None, - schema_url: typing.Optional[str] = None, - attributes: typing.Optional[_ExtendedAttributes] = None, + version: str | None = None, + schema_url: str | None = None, + attributes: _ExtendedAttributes | None = None, ) -> events.EventLogger: return LoggerTest(name) diff --git a/opentelemetry-api/tests/logs/test_proxy.py b/opentelemetry-api/tests/logs/test_proxy.py index 1b5d0c22ce1..5ba20f117c9 100644 --- a/opentelemetry-api/tests/logs/test_proxy.py +++ b/opentelemetry-api/tests/logs/test_proxy.py @@ -13,7 +13,6 @@ # limitations under the License. # pylint: disable=W0212,W0222,W0221 -import typing import unittest from unittest.mock import Mock @@ -27,9 +26,9 @@ class TestProvider(_logs.NoOpLoggerProvider): def get_logger( self, name: str, - version: typing.Optional[str] = None, - schema_url: typing.Optional[str] = None, - attributes: typing.Optional[_ExtendedAttributes] = None, + version: str | None = None, + schema_url: str | None = None, + attributes: _ExtendedAttributes | None = None, ) -> _logs.Logger: return LoggerTest(name) @@ -37,7 +36,7 @@ def get_logger( class LoggerTest(_logs.NoOpLogger): def emit( self, - record: typing.Optional[_logs.LogRecord] = None, + record: _logs.LogRecord | None = None, *, timestamp=None, observed_timestamp=None, @@ -47,7 +46,7 @@ def emit( body=None, attributes=None, event_name=None, - exception: typing.Optional[BaseException] = None, + exception: BaseException | None = None, ) -> None: pass diff --git a/opentelemetry-api/tests/metrics/test_subclass_instantiation.py b/opentelemetry-api/tests/metrics/test_subclass_instantiation.py index 67001e8206b..470e98d289e 100644 --- a/opentelemetry-api/tests/metrics/test_subclass_instantiation.py +++ b/opentelemetry-api/tests/metrics/test_subclass_instantiation.py @@ -19,7 +19,6 @@ # pylint: disable=useless-parent-delegation,arguments-differ -from typing import Optional from opentelemetry.metrics import ( Asynchronous, @@ -41,8 +40,8 @@ class MeterProviderImplTest(MeterProvider): def get_meter( self, name: str, - version: Optional[str] = None, - schema_url: Optional[str] = None, + version: str | None = None, + schema_url: str | None = None, ) -> Meter: return super().get_meter(name, version, schema_url) diff --git a/opentelemetry-api/tests/trace/propagation/test_tracecontexthttptextformat.py b/opentelemetry-api/tests/trace/propagation/test_tracecontexthttptextformat.py index 4ad9e89069d..402fd38a309 100644 --- a/opentelemetry-api/tests/trace/propagation/test_tracecontexthttptextformat.py +++ b/opentelemetry-api/tests/trace/propagation/test_tracecontexthttptextformat.py @@ -14,7 +14,6 @@ # type: ignore -import typing import unittest from unittest.mock import Mock, patch @@ -39,7 +38,7 @@ def test_no_traceparent_header(self): If no traceparent header is received, the vendor creates a new trace-id and parent-id that represents the current request. """ - output: typing.Dict[str, typing.List[str]] = {} + output: dict[str, list[str]] = {} span = trace.get_current_span(FORMAT.extract(output)) self.assertIsInstance(span.get_span_context(), trace.SpanContext) @@ -66,7 +65,7 @@ def test_headers_with_tracestate(self): span_context.trace_state, {"foo": "1", "bar": "2", "baz": "3"} ) self.assertTrue(span_context.is_remote) - output: typing.Dict[str, str] = {} + output: dict[str, str] = {} span = trace.NonRecordingSpan(span_context) ctx = trace.set_span_in_context(span) @@ -145,7 +144,7 @@ def test_no_send_empty_tracestate(self): Empty and whitespace-only list members are allowed. Vendors MUST accept empty tracestate headers but SHOULD avoid sending them. """ - output: typing.Dict[str, str] = {} + output: dict[str, str] = {} span = trace.NonRecordingSpan( trace.SpanContext(self.TRACE_ID, self.SPAN_ID, is_remote=False) ) @@ -177,7 +176,7 @@ def test_format_not_supported(self): def test_propagate_invalid_context(self): """Do not propagate invalid trace context.""" - output: typing.Dict[str, str] = {} + output: dict[str, str] = {} ctx = trace.set_span_in_context(trace.INVALID_SPAN) FORMAT.inject(output, context=ctx) self.assertFalse("traceparent" in output) diff --git a/opentelemetry-api/tests/trace/test_proxy.py b/opentelemetry-api/tests/trace/test_proxy.py index ad969e76617..c29ad938c3c 100644 --- a/opentelemetry-api/tests/trace/test_proxy.py +++ b/opentelemetry-api/tests/trace/test_proxy.py @@ -13,7 +13,6 @@ # limitations under the License. # pylint: disable=W0212,W0222,W0221 -import typing import unittest from opentelemetry import trace @@ -31,9 +30,9 @@ class TestProvider(trace.NoOpTracerProvider): def get_tracer( self, instrumenting_module_name: str, - instrumenting_library_version: typing.Optional[str] = None, - schema_url: typing.Optional[str] = None, - attributes: typing.Optional[Attributes] = None, + instrumenting_library_version: str | None = None, + schema_url: str | None = None, + attributes: Attributes | None = None, ) -> trace.Tracer: return TestTracer() diff --git a/opentelemetry-api/tests/util/test_contextmanager.py b/opentelemetry-api/tests/util/test_contextmanager.py index f26882c6c79..27369ccb5f7 100644 --- a/opentelemetry-api/tests/util/test_contextmanager.py +++ b/opentelemetry-api/tests/util/test_contextmanager.py @@ -14,7 +14,7 @@ import asyncio import unittest -from typing import Callable, Iterator +from collections.abc import Callable, Iterator from opentelemetry.util._decorator import _agnosticcontextmanager diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py index 4c6b5330de7..7d05b2f8f55 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py @@ -24,10 +24,9 @@ import os import warnings from abc import ABC, abstractmethod +from collections.abc import Callable, Mapping, Sequence from os import environ -from typing import Any, Callable, Mapping, Protocol, Sequence, Type, Union - -from typing_extensions import Literal +from typing import Any, Literal, Protocol from opentelemetry._logs import set_logger_provider from opentelemetry.environment_variables import ( @@ -108,12 +107,10 @@ _logger = logging.getLogger(__name__) ExporterArgsMap = Mapping[ - Union[ - Type[SpanExporter], - Type[MetricExporter], - Type[MetricReader], - Type[LogRecordExporter], - ], + type[SpanExporter] + | type[MetricExporter] + | type[MetricReader] + | type[LogRecordExporter], Mapping[str, Any], ] @@ -132,7 +129,7 @@ def __call__( def _import_config_components( selected_components: Sequence[str], entry_point_name: str -) -> list[tuple[str, Type]]: +) -> list[tuple[str, type]]: component_implementations = [] for selected_component in selected_components: @@ -242,7 +239,7 @@ def _get_exporter_names( def _init_tracing( - exporters: dict[str, Type[SpanExporter]], + exporters: dict[str, type[SpanExporter]], id_generator: IdGenerator | None = None, sampler: Sampler | None = None, resource: Resource | None = None, @@ -274,9 +271,7 @@ def _init_tracing( def _init_metrics( - exporters_or_readers: dict[ - str, Union[Type[MetricExporter], Type[MetricReader]] - ], + exporters_or_readers: dict[str, type[MetricExporter] | type[MetricReader]], resource: Resource | None = None, exporter_args_map: ExporterArgsMap | None = None, meter_configurator: _MeterConfiguratorT | None = None, @@ -305,7 +300,7 @@ def _init_metrics( # pylint: disable-next=too-many-locals def _init_logging( - exporters: dict[str, Type[LogRecordExporter]], + exporters: dict[str, type[LogRecordExporter]], resource: Resource | None = None, setup_logging_handler: bool = True, exporter_args_map: ExporterArgsMap | None = None, @@ -455,9 +450,9 @@ def _import_exporters( metric_exporter_names: Sequence[str], log_exporter_names: Sequence[str], ) -> tuple[ - dict[str, Type[SpanExporter]], - dict[str, Union[Type[MetricExporter], Type[MetricReader]]], - dict[str, Type[LogRecordExporter]], + dict[str, type[SpanExporter]], + dict[str, type[MetricExporter] | type[MetricReader]], + dict[str, type[LogRecordExporter]], ]: trace_exporters = {} metric_exporters = {} diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_common.py b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_common.py index 0498a19e13c..886ecb74605 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_common.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_common.py @@ -15,7 +15,6 @@ from __future__ import annotations import logging -from typing import Optional, Type from opentelemetry.sdk._configuration._exceptions import ConfigurationError from opentelemetry.util._importlib_metadata import entry_points @@ -23,7 +22,7 @@ _logger = logging.getLogger(__name__) -def load_entry_point(group: str, name: str) -> Type: +def load_entry_point(group: str, name: str) -> type: """Load a plugin class from an entry point group by name. Returns the loaded class — callers are responsible for instantiation @@ -49,9 +48,9 @@ def load_entry_point(group: str, name: str) -> Type: def _parse_headers( - headers: Optional[list], - headers_list: Optional[str], -) -> Optional[dict[str, str]]: + headers: list | None, + headers_list: str | None, +) -> dict[str, str] | None: """Merge headers struct and headers_list into a dict. Returns None if neither is set, letting the exporter read env vars. diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_logger_provider.py b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_logger_provider.py index 61673238b72..764b8d8c2e7 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_logger_provider.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_logger_provider.py @@ -15,7 +15,6 @@ from __future__ import annotations import logging -from typing import Optional from opentelemetry._logs import set_logger_provider from opentelemetry.sdk._configuration._common import _parse_headers @@ -60,8 +59,8 @@ def _map_compression( - value: Optional[str], compression_enum: type -) -> Optional[object]: + value: str | None, compression_enum: type +) -> object | None: """Map a compression string to the given Compression enum value.""" if value is None or value.lower() == "none": return None @@ -216,8 +215,8 @@ def _create_log_record_processor( def create_logger_provider( - config: Optional[LoggerProviderConfig], - resource: Optional[Resource] = None, + config: LoggerProviderConfig | None, + resource: Resource | None = None, ) -> LoggerProvider: """Create an SDK LoggerProvider from declarative config. @@ -251,8 +250,8 @@ def create_logger_provider( def configure_logger_provider( - config: Optional[LoggerProviderConfig], - resource: Optional[Resource] = None, + config: LoggerProviderConfig | None, + resource: Resource | None = None, ) -> None: """Configure the global LoggerProvider from declarative config. diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_meter_provider.py b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_meter_provider.py index 257351135f3..ff9c0520686 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_meter_provider.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_meter_provider.py @@ -15,7 +15,6 @@ from __future__ import annotations import logging -from typing import Optional, Set, Type from opentelemetry import metrics from opentelemetry.sdk._configuration._common import _parse_headers @@ -95,7 +94,7 @@ _DEFAULT_EXPORT_TIMEOUT_MILLIS = 30000 # Instrument type → SDK instrument class mapping (for View selectors). -_INSTRUMENT_TYPE_MAP: dict[InstrumentType, Type] = { +_INSTRUMENT_TYPE_MAP: dict[InstrumentType, type] = { InstrumentType.counter: Counter, InstrumentType.up_down_counter: UpDownCounter, InstrumentType.histogram: Histogram, @@ -107,7 +106,7 @@ def _map_temporality( - pref: Optional[ExporterTemporalityPreference], + pref: ExporterTemporalityPreference | None, ) -> dict[type, AggregationTemporality]: """Map a temporality preference to an explicit preferred_temporality dict. @@ -148,7 +147,7 @@ def _map_temporality( def _map_histogram_aggregation( - pref: Optional[ExporterDefaultHistogramAggregation], + pref: ExporterDefaultHistogramAggregation | None, ) -> dict[type, Aggregation]: """Map a histogram aggregation preference to an explicit preferred_aggregation dict. @@ -223,7 +222,7 @@ def _create_view(config: ViewConfig) -> View: f"Unknown instrument type: {selector.instrument_type!r}" ) - attribute_keys: Optional[Set[str]] = None + attribute_keys: set[str] | None = None if stream.attribute_keys is not None: if stream.attribute_keys.excluded: _logger.warning( @@ -266,8 +265,8 @@ def _create_console_metric_exporter( def _map_compression_metric( - value: Optional[str], compression_enum: type -) -> Optional[object]: + value: str | None, compression_enum: type +) -> object | None: """Map a compression string to the given Compression enum value.""" if value is None or value.lower() == "none": return None @@ -426,8 +425,8 @@ def _create_exemplar_filter( def create_meter_provider( - config: Optional[MeterProviderConfig], - resource: Optional[Resource] = None, + config: MeterProviderConfig | None, + resource: Resource | None = None, ) -> MeterProvider: """Create an SDK MeterProvider from declarative config. @@ -467,8 +466,8 @@ def create_meter_provider( def configure_meter_provider( - config: Optional[MeterProviderConfig], - resource: Optional[Resource] = None, + config: MeterProviderConfig | None, + resource: Resource | None = None, ) -> None: """Configure the global MeterProvider from declarative config. diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_propagator.py b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_propagator.py index 315a4e8beda..30f7aed82c6 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_propagator.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_propagator.py @@ -14,8 +14,6 @@ from __future__ import annotations -from typing import Optional - from opentelemetry.baggage.propagation import W3CBaggagePropagator from opentelemetry.propagate import set_global_textmap from opentelemetry.propagators.composite import CompositePropagator @@ -54,7 +52,7 @@ def _propagators_from_textmap_config( def create_propagator( - config: Optional[PropagatorConfig], + config: PropagatorConfig | None, ) -> CompositePropagator: """Create a CompositePropagator from declarative config. @@ -91,7 +89,7 @@ def create_propagator( return CompositePropagator(list(propagators.values())) -def configure_propagator(config: Optional[PropagatorConfig]) -> None: +def configure_propagator(config: PropagatorConfig | None) -> None: """Configure the global text map propagator from declarative config. Always calls set_global_textmap to override any defaults (including the diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_resource.py b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_resource.py index 13ef0a234a9..db3b25f54a7 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_resource.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_resource.py @@ -18,7 +18,7 @@ import logging import os import uuid -from typing import Callable, Optional +from collections.abc import Callable from urllib import parse from opentelemetry.sdk._configuration.models import ( @@ -93,7 +93,7 @@ def _parse_attributes_list(attributes_list: str) -> dict[str, str]: return result -def create_resource(config: Optional[ResourceConfig]) -> Resource: +def create_resource(config: ResourceConfig | None) -> Resource: """Create an SDK Resource from declarative config. Does NOT read OTEL_RESOURCE_ATTRIBUTES. Resource detectors are only run @@ -198,7 +198,7 @@ def _run_detectors( def _filter_attributes( - attrs: dict[str, object], filter_config: Optional[IncludeExclude] + attrs: dict[str, object], filter_config: IncludeExclude | None ) -> dict[str, object]: """Filter detected attribute keys using include/exclude glob patterns. diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_tracer_provider.py b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_tracer_provider.py index 32dfd96567b..820b2ecaf82 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_tracer_provider.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_tracer_provider.py @@ -15,7 +15,6 @@ from __future__ import annotations import logging -from typing import Optional from opentelemetry import trace from opentelemetry.sdk._configuration._common import _parse_headers @@ -105,8 +104,8 @@ def _create_otlp_http_span_exporter( def _map_compression( - value: Optional[str], compression_enum: type -) -> Optional[object]: + value: str | None, compression_enum: type +) -> object | None: """Map a compression string to the given Compression enum value.""" if value is None or value.lower() == "none": return None @@ -262,8 +261,8 @@ def _create_span_limits(config: SpanLimitsConfig) -> SpanLimits: def create_tracer_provider( - config: Optional[TracerProviderConfig], - resource: Optional[Resource] = None, + config: TracerProviderConfig | None, + resource: Resource | None = None, ) -> TracerProvider: """Create an SDK TracerProvider from declarative config. @@ -309,8 +308,8 @@ def create_tracer_provider( def configure_tracer_provider( - config: Optional[TracerProviderConfig], - resource: Optional[Resource] = None, + config: TracerProviderConfig | None, + resource: Resource | None = None, ) -> None: """Configure the global TracerProvider from declarative config. diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/file/_loader.py b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/file/_loader.py index eeab3f2694d..1ab12bb0436 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/file/_loader.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/file/_loader.py @@ -95,7 +95,7 @@ def load_config_file(file_path: str) -> OpenTelemetryConfiguration: try: with open(path, encoding="utf-8") as config_file: content = config_file.read() - except (OSError, IOError) as exc: + except OSError as exc: _logger.exception("Failed to read configuration file: %s", file_path) raise ConfigurationError( f"Failed to read configuration file: {file_path}" diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_events/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_events/__init__.py index ca90e9b1522..99bb5937968 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_events/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_events/__init__.py @@ -14,7 +14,6 @@ import logging from time import time_ns -from typing import Optional from typing_extensions import deprecated @@ -43,9 +42,9 @@ def __init__( self, logger_provider: LoggerProvider, name: str, - version: Optional[str] = None, - schema_url: Optional[str] = None, - attributes: Optional[_ExtendedAttributes] = None, + version: str | None = None, + schema_url: str | None = None, + attributes: _ExtendedAttributes | None = None, ): super().__init__( name=name, @@ -82,15 +81,15 @@ def emit(self, event: Event) -> None: "Deprecated since version 1.39.0 and will be removed in a future release." ) class EventLoggerProvider(APIEventLoggerProvider): - def __init__(self, logger_provider: Optional[LoggerProvider] = None): + def __init__(self, logger_provider: LoggerProvider | None = None): self._logger_provider = logger_provider or get_logger_provider() def get_event_logger( self, name: str, - version: Optional[str] = None, - schema_url: Optional[str] = None, - attributes: Optional[_ExtendedAttributes] = None, + version: str | None = None, + schema_url: str | None = None, + attributes: _ExtendedAttributes | None = None, ) -> EventLogger: if not name: _logger.warning("EventLogger created with invalid name: %s", name) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py index 956d9f28bd7..9040711873f 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py @@ -669,10 +669,8 @@ class Logger(APILogger): def __init__( self, resource: Resource, - multi_log_record_processor: Union[ - SynchronousMultiLogRecordProcessor, - ConcurrentMultiLogRecordProcessor, - ], + multi_log_record_processor: SynchronousMultiLogRecordProcessor + | ConcurrentMultiLogRecordProcessor, instrumentation_scope: InstrumentationScope, *, logger_metrics: LoggerMetrics, diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/__init__.py index 1c0f82ac055..1c5126d6075 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/__init__.py @@ -17,8 +17,9 @@ import enum import logging import sys +from collections.abc import Callable, Sequence from os import environ, linesep -from typing import IO, Callable, Optional, Sequence +from typing import IO from typing_extensions import deprecated @@ -326,7 +327,7 @@ def on_emit(self, log_record: ReadWriteLogRecord) -> None: def shutdown(self): return self._batch_processor.shutdown() - def force_flush(self, timeout_millis: Optional[int] = None) -> bool: + def force_flush(self, timeout_millis: int | None = None) -> bool: return self._batch_processor.force_flush(timeout_millis) @staticmethod diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/in_memory_log_exporter.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/in_memory_log_exporter.py index a724f81d89d..15fcb59a886 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/in_memory_log_exporter.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/in_memory_log_exporter.py @@ -41,7 +41,7 @@ def clear(self) -> None: with self._lock: self._logs.clear() - def get_finished_logs(self) -> typing.Tuple[ReadableLogRecord, ...]: + def get_finished_logs(self) -> tuple[ReadableLogRecord, ...]: with self._lock: return tuple(self._logs) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_shared_internal/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_shared_internal/__init__.py index cde19165d62..b2d20a76b5c 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_shared_internal/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_shared_internal/__init__.py @@ -25,7 +25,6 @@ from abc import abstractmethod from typing import ( Generic, - Optional, Protocol, TypeVar, ) @@ -249,7 +248,7 @@ def shutdown(self, timeout_millis: int = 30000): # the thread to finish. # TODO: Fix force flush so the timeout is used https://github.com/open-telemetry/opentelemetry-python/issues/4568. - def force_flush(self, timeout_millis: Optional[int] = None) -> bool: + def force_flush(self, timeout_millis: int | None = None) -> bool: if self._shutdown: return False # Blocking call to export. diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/__init__.py index e6583d1c5ff..06ee4fe3e63 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/__init__.py @@ -14,12 +14,12 @@ import weakref from atexit import register, unregister +from collections.abc import Callable, Sequence from dataclasses import dataclass from logging import getLogger from os import environ from threading import Lock from time import time_ns -from typing import Callable, Optional, Sequence # This kind of import is needed to avoid Sphinx errors. import opentelemetry.sdk.metrics @@ -104,7 +104,7 @@ def __init__( instrumentation_scope: InstrumentationScope, measurement_consumer: MeasurementConsumer, *, - _meter_config: Optional[_MeterConfig] = None, + _meter_config: _MeterConfig | None = None, ): super().__init__( name=instrumentation_scope.name, @@ -238,7 +238,7 @@ def create_histogram( unit: str = "", description: str = "", *, - explicit_bucket_boundaries_advisory: Optional[Sequence[float]] = None, + explicit_bucket_boundaries_advisory: Sequence[float] | None = None, ) -> APIHistogram: if explicit_bucket_boundaries_advisory is not None: invalid_advisory = False @@ -481,12 +481,12 @@ def __init__( metric_readers: Sequence[ "opentelemetry.sdk.metrics.export.MetricReader" ] = (), - resource: Optional[Resource] = None, - exemplar_filter: Optional[ExemplarFilter] = None, + resource: Resource | None = None, + exemplar_filter: ExemplarFilter | None = None, shutdown_on_exit: bool = True, views: Sequence["opentelemetry.sdk.metrics.view.View"] = (), *, - _meter_configurator: Optional[_MeterConfiguratorT] = None, + _meter_configurator: _MeterConfiguratorT | None = None, ): self._lock = Lock() self._meter_lock = Lock() @@ -654,9 +654,9 @@ def _shutdown(): def get_meter( self, name: str, - version: Optional[str] = None, - schema_url: Optional[str] = None, - attributes: Optional[Attributes] = None, + version: str | None = None, + schema_url: str | None = None, + attributes: Attributes | None = None, ) -> APIMeter: if self._disabled: return NoOpMeter(name, version=version, schema_url=schema_url) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/_view_instrument_match.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/_view_instrument_match.py index 3cfa8b9c135..2788ce08d7f 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/_view_instrument_match.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/_view_instrument_match.py @@ -13,10 +13,11 @@ # limitations under the License. +from collections.abc import Sequence from logging import getLogger from threading import Lock from time import time_ns -from typing import Dict, List, Optional, Sequence, cast +from typing import cast from opentelemetry.sdk.metrics._internal.aggregation import ( Aggregation, @@ -38,11 +39,11 @@ def __init__( self, view: View, instrument: _Instrument, - instrument_class_aggregation: Dict[type, Aggregation], + instrument_class_aggregation: dict[type, Aggregation], ): self._view = view self._instrument = instrument - self._attributes_aggregation: Dict[frozenset, _Aggregation] = {} + self._attributes_aggregation: dict[frozenset, _Aggregation] = {} self._lock = Lock() self._instrument_class_aggregation = instrument_class_aggregation self._name = self._view._name or self._instrument.name @@ -143,8 +144,8 @@ def collect( self, collection_aggregation_temporality: AggregationTemporality, collection_start_nanos: int, - ) -> Optional[Sequence[DataPointT]]: - data_points: List[DataPointT] = [] + ) -> Sequence[DataPointT] | None: + data_points: list[DataPointT] = [] with self._lock: for aggregation in self._attributes_aggregation.values(): data_point = aggregation.collect( diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/aggregation.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/aggregation.py index 4e6d72e7229..39263ff764c 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/aggregation.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/aggregation.py @@ -16,18 +16,14 @@ from abc import ABC, abstractmethod from bisect import bisect_left +from collections.abc import Callable, Sequence from enum import IntEnum from functools import partial from logging import getLogger from math import inf from threading import Lock from typing import ( - Callable, Generic, - List, - Optional, - Sequence, - Type, TypeVar, cast, ) @@ -118,7 +114,7 @@ def collect( self, collection_aggregation_temporality: AggregationTemporality, collection_start_nano: int, - ) -> Optional[_DataPointVarT]: + ) -> _DataPointVarT | None: pass def _collect_exemplars(self) -> Sequence[Exemplar]: @@ -159,7 +155,7 @@ def collect( self, collection_aggregation_temporality: AggregationTemporality, collection_start_nano: int, - ) -> Optional[_DataPointVarT]: + ) -> _DataPointVarT | None: pass @@ -200,7 +196,7 @@ def collect( self, collection_aggregation_temporality: AggregationTemporality, collection_start_nano: int, - ) -> Optional[NumberDataPoint]: + ) -> NumberDataPoint | None: """ Atomically return a point for the current value of the metric and reset the aggregation value. @@ -425,7 +421,7 @@ def collect( self, collection_aggregation_temporality: AggregationTemporality, collection_start_nano: int, - ) -> Optional[_DataPointVarT]: + ) -> _DataPointVarT | None: """ Atomically return a point for the current value of the metric. """ @@ -472,7 +468,7 @@ def __init__( instrument_aggregation_temporality: AggregationTemporality, start_time_unix_nano: int, reservoir_builder: ExemplarReservoirBuilder, - boundaries: Optional[Sequence[float]] = None, + boundaries: Sequence[float] | None = None, record_min_max: bool = True, ): if boundaries is None: @@ -505,7 +501,7 @@ def __init__( self._previous_collection_start_nano = self._start_time_unix_nano - def _get_empty_bucket_counts(self) -> List[int]: + def _get_empty_bucket_counts(self) -> list[int]: return [0] * (len(self._boundaries) + 1) def aggregate( @@ -531,7 +527,7 @@ def collect( self, collection_aggregation_temporality: AggregationTemporality, collection_start_nano: int, - ) -> Optional[_DataPointVarT]: + ) -> _DataPointVarT | None: """ Atomically return a point for the current value of the metric. """ @@ -826,7 +822,7 @@ def collect( self, collection_aggregation_temporality: AggregationTemporality, collection_start_nano: int, - ) -> Optional[_DataPointVarT]: + ) -> _DataPointVarT | None: """ Atomically return a point for the current value of the metric. """ @@ -1212,7 +1208,7 @@ def _create_aggregation( instrument: _Instrument, attributes: Attributes, reservoir_factory: Callable[ - [Type[_Aggregation]], ExemplarReservoirBuilder + [type[_Aggregation]], ExemplarReservoirBuilder ], start_time_unix_nano: int, ) -> _Aggregation: @@ -1243,7 +1239,7 @@ def _create_aggregation( instrument: _Instrument, attributes: Attributes, reservoir_factory: Callable[ - [Type[_Aggregation]], ExemplarReservoirBuilder + [type[_Aggregation]], ExemplarReservoirBuilder ], start_time_unix_nano: int, ) -> _Aggregation: @@ -1335,7 +1331,7 @@ def _create_aggregation( instrument: _Instrument, attributes: Attributes, reservoir_factory: Callable[ - [Type[_Aggregation]], ExemplarReservoirBuilder + [type[_Aggregation]], ExemplarReservoirBuilder ], start_time_unix_nano: int, ) -> _Aggregation: @@ -1373,7 +1369,7 @@ class ExplicitBucketHistogramAggregation(Aggregation): def __init__( self, - boundaries: Optional[Sequence[float]] = None, + boundaries: Sequence[float] | None = None, record_min_max: bool = True, ) -> None: self._boundaries = boundaries @@ -1384,7 +1380,7 @@ def _create_aggregation( instrument: _Instrument, attributes: Attributes, reservoir_factory: Callable[ - [Type[_Aggregation]], ExemplarReservoirBuilder + [type[_Aggregation]], ExemplarReservoirBuilder ], start_time_unix_nano: int, ) -> _Aggregation: @@ -1428,7 +1424,7 @@ def _create_aggregation( instrument: _Instrument, attributes: Attributes, reservoir_factory: Callable[ - [Type[_Aggregation]], ExemplarReservoirBuilder + [type[_Aggregation]], ExemplarReservoirBuilder ], start_time_unix_nano: int, ) -> _Aggregation: @@ -1462,7 +1458,7 @@ def _create_aggregation( instrument: _Instrument, attributes: Attributes, reservoir_factory: Callable[ - [Type[_Aggregation]], ExemplarReservoirBuilder + [type[_Aggregation]], ExemplarReservoirBuilder ], start_time_unix_nano: int, ) -> _Aggregation: @@ -1480,7 +1476,7 @@ def _create_aggregation( instrument: _Instrument, attributes: Attributes, reservoir_factory: Callable[ - [Type[_Aggregation]], ExemplarReservoirBuilder + [type[_Aggregation]], ExemplarReservoirBuilder ], start_time_unix_nano: int, ) -> _Aggregation: diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/exemplar/exemplar.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/exemplar/exemplar.py index 28237f09c4b..49bec5087c3 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/exemplar/exemplar.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/exemplar/exemplar.py @@ -13,7 +13,6 @@ # limitations under the License. import dataclasses -from typing import Optional, Union from opentelemetry.util.types import Attributes @@ -39,7 +38,7 @@ class Exemplar: """ filtered_attributes: Attributes - value: Union[int, float] + value: int | float time_unix_nano: int - span_id: Optional[int] = None - trace_id: Optional[int] = None + span_id: int | None = None + trace_id: int | None = None diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/exemplar/exemplar_filter.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/exemplar/exemplar_filter.py index 8961d101efe..f6dc43e4087 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/exemplar/exemplar_filter.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/exemplar/exemplar_filter.py @@ -13,7 +13,6 @@ # limitations under the License. from abc import ABC, abstractmethod -from typing import Union from opentelemetry import trace from opentelemetry.context import Context @@ -35,7 +34,7 @@ class ExemplarFilter(ABC): @abstractmethod def should_sample( self, - value: Union[int, float], + value: int | float, time_unix_nano: int, attributes: Attributes, context: Context, @@ -62,7 +61,7 @@ class AlwaysOnExemplarFilter(ExemplarFilter): def should_sample( self, - value: Union[int, float], + value: int | float, time_unix_nano: int, attributes: Attributes, context: Context, @@ -89,7 +88,7 @@ class AlwaysOffExemplarFilter(ExemplarFilter): def should_sample( self, - value: Union[int, float], + value: int | float, time_unix_nano: int, attributes: Attributes, context: Context, @@ -115,7 +114,7 @@ class TraceBasedExemplarFilter(ExemplarFilter): def should_sample( self, - value: Union[int, float], + value: int | float, time_unix_nano: int, attributes: Attributes, context: Context, diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/exemplar/exemplar_reservoir.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/exemplar/exemplar_reservoir.py index 22d1ee9f75e..1eaf28d6839 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/exemplar/exemplar_reservoir.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/exemplar/exemplar_reservoir.py @@ -14,16 +14,10 @@ from abc import ABC, abstractmethod from collections import defaultdict +from collections.abc import Callable, Mapping, Sequence from random import randrange from typing import ( Any, - Callable, - Dict, - List, - Mapping, - Optional, - Sequence, - Union, ) from opentelemetry import trace @@ -49,7 +43,7 @@ class ExemplarReservoir(ABC): @abstractmethod def offer( self, - value: Union[int, float], + value: int | float, time_unix_nano: int, attributes: Attributes, context: Context, @@ -65,7 +59,7 @@ def offer( raise NotImplementedError("ExemplarReservoir.offer is not implemented") @abstractmethod - def collect(self, point_attributes: Attributes) -> List[Exemplar]: + def collect(self, point_attributes: Attributes) -> list[Exemplar]: """Returns accumulated Exemplars and also resets the reservoir for the next sampling period @@ -84,16 +78,16 @@ def collect(self, point_attributes: Attributes) -> List[Exemplar]: class ExemplarBucket: def __init__(self) -> None: - self.__value: Union[int, float] = 0 + self.__value: int | float = 0 self.__attributes: Attributes = None self.__time_unix_nano: int = 0 - self.__span_id: Optional[int] = None - self.__trace_id: Optional[int] = None + self.__span_id: int | None = None + self.__trace_id: int | None = None self.__offered: bool = False def offer( self, - value: Union[int, float], + value: int | float, time_unix_nano: int, attributes: Attributes, context: Context, @@ -117,7 +111,7 @@ def offer( self.__offered = True - def collect(self, point_attributes: Attributes) -> Optional[Exemplar]: + def collect(self, point_attributes: Attributes) -> Exemplar | None: """May return an Exemplar and resets the bucket for the next sampling period.""" if not self.__offered: return None @@ -169,7 +163,7 @@ def __init__(self, size: int, **kwargs) -> None: ExemplarBucket ) - def collect(self, point_attributes: Attributes) -> List[Exemplar]: + def collect(self, point_attributes: Attributes) -> list[Exemplar]: """Returns accumulated Exemplars and also resets the reservoir for the next sampling period @@ -194,7 +188,7 @@ def collect(self, point_attributes: Attributes) -> List[Exemplar]: def offer( self, - value: Union[int, float], + value: int | float, time_unix_nano: int, attributes: Attributes, context: Context, @@ -222,7 +216,7 @@ def offer( @abstractmethod def _find_bucket_index( self, - value: Union[int, float], + value: int | float, time_unix_nano: int, attributes: Attributes, context: Context, @@ -267,7 +261,7 @@ def _reset(self) -> None: def _find_bucket_index( self, - value: Union[int, float], + value: int | float, time_unix_nano: int, attributes: Attributes, context: Context, @@ -298,7 +292,7 @@ def __init__(self, boundaries: Sequence[float], **kwargs) -> None: def offer( self, - value: Union[int, float], + value: int | float, time_unix_nano: int, attributes: Attributes, context: Context, @@ -313,7 +307,7 @@ def offer( def _find_bucket_index( self, - value: Union[int, float], + value: int | float, time_unix_nano: int, attributes: Attributes, context: Context, @@ -324,9 +318,7 @@ def _find_bucket_index( return len(self._boundaries) -ExemplarReservoirBuilder = Callable[[Dict[str, Any]], ExemplarReservoir] -ExemplarReservoirBuilder.__doc__ = """ExemplarReservoir builder. - -It may receive the Aggregation parameters it is bounded to; e.g. -the _ExplicitBucketHistogramAggregation will provide the boundaries. -""" +# ExemplarReservoirBuilder: A callable that takes Aggregation parameters +# (e.g. boundaries for _ExplicitBucketHistogramAggregation) and returns +# an ExemplarReservoir instance. +ExemplarReservoirBuilder = Callable[[dict[str, Any]], ExemplarReservoir] diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/__init__.py index 66f327306a6..588c4e86b8a 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/__init__.py @@ -17,13 +17,14 @@ import os import weakref from abc import ABC, abstractmethod +from collections.abc import Callable, Iterable from enum import Enum from logging import getLogger from os import environ, linesep from sys import stdout from threading import Event, Lock, RLock, Thread from time import perf_counter, time_ns -from typing import IO, Callable, Iterable, Optional +from typing import IO from typing_extensions import final @@ -436,7 +437,7 @@ def __init__( def get_metrics_data( self, - ) -> Optional[MetricsData]: + ) -> MetricsData | None: """Reads and returns current metrics from the SDK""" with self._lock: self.collect() @@ -470,8 +471,8 @@ class PeriodicExportingMetricReader(MetricReader): def __init__( self, exporter: MetricExporter, - export_interval_millis: Optional[float] = None, - export_timeout_millis: Optional[float] = None, + export_interval_millis: float | None = None, + export_timeout_millis: float | None = None, ) -> None: # PeriodicExportingMetricReader defers to exporter for configuration super().__init__( diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/instrument.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/instrument.py index ecd1996d0a4..d7a7c894869 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/instrument.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/instrument.py @@ -15,16 +15,12 @@ # pylint: disable=too-many-ancestors, unused-import from __future__ import annotations +from collections.abc import Generator, Iterable, Sequence from logging import getLogger from time import time_ns from typing import ( TYPE_CHECKING, - Generator, - Iterable, - List, Protocol, - Sequence, - Union, cast, runtime_checkable, ) @@ -146,7 +142,7 @@ def __init__( self._meter_config = _meter_config super().__init__(name, callbacks, unit=unit, description=description) - self._callbacks: List[CallbackT] = [] + self._callbacks: list[CallbackT] = [] if callbacks is not None: for callback in callbacks: @@ -199,7 +195,7 @@ def __new__(cls, *args, **kwargs): def add( self, - amount: Union[int, float], + amount: int | float, attributes: dict[str, str] | None = None, context: Context | None = None, ): @@ -232,7 +228,7 @@ def __new__(cls, *args, **kwargs): def add( self, - amount: Union[int, float], + amount: int | float, attributes: dict[str, str] | None = None, context: Context | None = None, ): @@ -301,7 +297,7 @@ def __new__(cls, *args, **kwargs): def record( self, - amount: Union[int, float], + amount: int | float, attributes: dict[str, str] | None = None, context: Context | None = None, ): @@ -335,7 +331,7 @@ def __new__(cls, *args, **kwargs): def set( self, - amount: Union[int, float], + amount: int | float, attributes: dict[str, str] | None = None, context: Context | None = None, ): diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/measurement.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/measurement.py index 1d2137be802..21a1a435820 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/measurement.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/measurement.py @@ -15,7 +15,7 @@ from __future__ import annotations from dataclasses import dataclass -from typing import TYPE_CHECKING, Union +from typing import TYPE_CHECKING from opentelemetry.context import Context from opentelemetry.util.types import Attributes @@ -37,7 +37,7 @@ class Measurement: attributes: Measurement attributes """ - value: Union[int, float] + value: int | float time_unix_nano: int instrument: _Instrument context: Context diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/measurement_consumer.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/measurement_consumer.py index 4109e129566..709371270fe 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/measurement_consumer.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/measurement_consumer.py @@ -15,9 +15,9 @@ # pylint: disable=unused-import from abc import ABC, abstractmethod +from collections.abc import Mapping from threading import Lock from time import time_ns -from typing import List, Mapping, Optional # This kind of import is needed to avoid Sphinx errors. import opentelemetry.sdk.metrics @@ -51,7 +51,7 @@ def collect( self, metric_reader: "opentelemetry.sdk.metrics.export.MetricReader", timeout_millis: float = 10_000, - ) -> Optional[MetricsData]: + ) -> MetricsData | None: pass @@ -73,7 +73,7 @@ def __init__( ) for reader in sdk_config.metric_readers } - self._async_instruments: List[ + self._async_instruments: list[ opentelemetry.sdk.metrics._internal.instrument._Asynchronous ] = [] @@ -104,7 +104,7 @@ def collect( self, metric_reader: "opentelemetry.sdk.metrics.export.MetricReader", timeout_millis: float = 10_000, - ) -> Optional[MetricsData]: + ) -> MetricsData | None: with self._lock: metric_reader_storage = self._reader_storages[metric_reader] # for now, just use the defaults diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/metric_reader_storage.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/metric_reader_storage.py index 93c2ebcc61d..c40d1190969 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/metric_reader_storage.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/metric_reader_storage.py @@ -15,7 +15,6 @@ from logging import getLogger from threading import RLock from time import time_ns -from typing import Dict, List, Optional from opentelemetry.metrics import ( Asynchronous, @@ -64,20 +63,20 @@ class MetricReaderStorage: def __init__( self, sdk_config: SdkConfiguration, - instrument_class_temporality: Dict[type, AggregationTemporality], - instrument_class_aggregation: Dict[type, Aggregation], + instrument_class_temporality: dict[type, AggregationTemporality], + instrument_class_aggregation: dict[type, Aggregation], ) -> None: self._lock = RLock() self._sdk_config = sdk_config - self._instrument_view_instrument_matches: Dict[ - _Instrument, List[_ViewInstrumentMatch] + self._instrument_view_instrument_matches: dict[ + _Instrument, list[_ViewInstrumentMatch] ] = {} self._instrument_class_temporality = instrument_class_temporality self._instrument_class_aggregation = instrument_class_aggregation def _get_or_init_view_instrument_match( self, instrument: _Instrument - ) -> List[_ViewInstrumentMatch]: + ) -> list[_ViewInstrumentMatch]: # Optimistically get the relevant views for the given instrument. Once set for a given # instrument, the mapping will never change @@ -123,7 +122,7 @@ def consume_measurement( measurement, should_sample_exemplar ) - def collect(self) -> Optional[MetricsData]: + def collect(self) -> MetricsData | None: # Use a list instead of yielding to prevent a slow reader from holding # SDK locks @@ -139,7 +138,7 @@ def collect(self) -> Optional[MetricsData]: collection_start_nanos = time_ns() with self._lock: - instrumentation_scope_scope_metrics: Dict[ + instrumentation_scope_scope_metrics: dict[ InstrumentationScope, ScopeMetrics ] = {} @@ -155,7 +154,7 @@ def collect(self) -> Optional[MetricsData]: instrument.__class__ ] - metrics: List[Metric] = [] + metrics: list[Metric] = [] for view_instrument_match in view_instrument_matches: data_points = view_instrument_match.collect( @@ -254,7 +253,7 @@ def collect(self) -> Optional[MetricsData]: def _handle_view_instrument_match( self, instrument: _Instrument, - view_instrument_matches: List["_ViewInstrumentMatch"], + view_instrument_matches: list["_ViewInstrumentMatch"], ) -> None: for view in self._sdk_config.views: # pylint: disable=protected-access diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/point.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/point.py index 8c7e3469772..cc04167c3fe 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/point.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/point.py @@ -14,9 +14,9 @@ # pylint: disable=unused-import +from collections.abc import Sequence from dataclasses import asdict, dataclass, field from json import dumps, loads -from typing import Optional, Sequence, Union # This kind of import is needed to avoid Sphinx errors. import opentelemetry.sdk.metrics._internal @@ -35,10 +35,10 @@ class NumberDataPoint: attributes: Attributes start_time_unix_nano: int time_unix_nano: int - value: Union[int, float] + value: int | float exemplars: Sequence[Exemplar] = field(default_factory=list) - def to_json(self, indent: Optional[int] = 4) -> str: + def to_json(self, indent: int | None = 4) -> str: return dumps(asdict(self), indent=indent) @@ -52,14 +52,14 @@ class HistogramDataPoint: start_time_unix_nano: int time_unix_nano: int count: int - sum: Union[int, float] + sum: int | float bucket_counts: Sequence[int] explicit_bounds: Sequence[float] min: float max: float exemplars: Sequence[Exemplar] = field(default_factory=list) - def to_json(self, indent: Optional[int] = 4) -> str: + def to_json(self, indent: int | None = 4) -> str: return dumps(asdict(self), indent=indent) @@ -80,7 +80,7 @@ class ExponentialHistogramDataPoint: start_time_unix_nano: int time_unix_nano: int count: int - sum: Union[int, float] + sum: int | float scale: int zero_count: int positive: Buckets @@ -90,7 +90,7 @@ class ExponentialHistogramDataPoint: max: float exemplars: Sequence[Exemplar] = field(default_factory=list) - def to_json(self, indent: Optional[int] = 4) -> str: + def to_json(self, indent: int | None = 4) -> str: return dumps(asdict(self), indent=indent) @@ -105,7 +105,7 @@ class ExponentialHistogram: "opentelemetry.sdk.metrics.export.AggregationTemporality" ) - def to_json(self, indent: Optional[int] = 4) -> str: + def to_json(self, indent: int | None = 4) -> str: return dumps( { "data_points": [ @@ -129,7 +129,7 @@ class Sum: ) is_monotonic: bool - def to_json(self, indent: Optional[int] = 4) -> str: + def to_json(self, indent: int | None = 4) -> str: return dumps( { "data_points": [ @@ -151,7 +151,7 @@ class Gauge: data_points: Sequence[NumberDataPoint] - def to_json(self, indent: Optional[int] = 4) -> str: + def to_json(self, indent: int | None = 4) -> str: return dumps( { "data_points": [ @@ -173,7 +173,7 @@ class Histogram: "opentelemetry.sdk.metrics.export.AggregationTemporality" ) - def to_json(self, indent: Optional[int] = 4) -> str: + def to_json(self, indent: int | None = 4) -> str: return dumps( { "data_points": [ @@ -187,10 +187,10 @@ def to_json(self, indent: Optional[int] = 4) -> str: # pylint: disable=invalid-name -DataT = Union[Sum, Gauge, Histogram, ExponentialHistogram] -DataPointT = Union[ - NumberDataPoint, HistogramDataPoint, ExponentialHistogramDataPoint -] +DataT = Sum | Gauge | Histogram | ExponentialHistogram +DataPointT = ( + NumberDataPoint | HistogramDataPoint | ExponentialHistogramDataPoint +) @dataclass(frozen=True) @@ -199,11 +199,11 @@ class Metric: exported.""" name: str - description: Optional[str] - unit: Optional[str] + description: str | None + unit: str | None data: DataT - def to_json(self, indent: Optional[int] = 4) -> str: + def to_json(self, indent: int | None = 4) -> str: return dumps( { "name": self.name, @@ -223,7 +223,7 @@ class ScopeMetrics: metrics: Sequence[Metric] schema_url: str - def to_json(self, indent: Optional[int] = 4) -> str: + def to_json(self, indent: int | None = 4) -> str: return dumps( { "scope": loads(self.scope.to_json(indent=indent)), @@ -245,7 +245,7 @@ class ResourceMetrics: scope_metrics: Sequence[ScopeMetrics] schema_url: str - def to_json(self, indent: Optional[int] = 4) -> str: + def to_json(self, indent: int | None = 4) -> str: return dumps( { "resource": loads(self.resource.to_json(indent=indent)), @@ -265,7 +265,7 @@ class MetricsData: resource_metrics: Sequence[ResourceMetrics] - def to_json(self, indent: Optional[int] = 4) -> str: + def to_json(self, indent: int | None = 4) -> str: return dumps( { "resource_metrics": [ diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/sdk_configuration.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/sdk_configuration.py index f5d176d0b02..076316ab68e 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/sdk_configuration.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/sdk_configuration.py @@ -14,8 +14,8 @@ # pylint: disable=unused-import +from collections.abc import Sequence from dataclasses import dataclass -from typing import Sequence # This kind of import is needed to avoid Sphinx errors. import opentelemetry.sdk.metrics diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/view.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/view.py index ef0b04950b4..aceb179a8cd 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/view.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/view.py @@ -13,9 +13,9 @@ # limitations under the License. +from collections.abc import Callable from fnmatch import fnmatch from logging import getLogger -from typing import Callable, Optional, Set, Type from opentelemetry.metrics import Instrument from opentelemetry.sdk.metrics._internal.aggregation import ( @@ -36,7 +36,7 @@ def _default_reservoir_factory( - aggregation_type: Type[_Aggregation], + aggregation_type: type[_Aggregation], ) -> ExemplarReservoirBuilder: """Default reservoir factory per aggregation.""" if issubclass(aggregation_type, _ExplicitBucketHistogramAggregation): @@ -106,19 +106,20 @@ class View: def __init__( self, - instrument_type: Optional[Type[Instrument]] = None, - instrument_name: Optional[str] = None, - meter_name: Optional[str] = None, - meter_version: Optional[str] = None, - meter_schema_url: Optional[str] = None, - name: Optional[str] = None, - description: Optional[str] = None, - attribute_keys: Optional[Set[str]] = None, - aggregation: Optional[Aggregation] = None, - exemplar_reservoir_factory: Optional[ - Callable[[Type[_Aggregation]], ExemplarReservoirBuilder] - ] = None, - instrument_unit: Optional[str] = None, + instrument_type: type[Instrument] | None = None, + instrument_name: str | None = None, + meter_name: str | None = None, + meter_version: str | None = None, + meter_schema_url: str | None = None, + name: str | None = None, + description: str | None = None, + attribute_keys: set[str] | None = None, + aggregation: Aggregation | None = None, + exemplar_reservoir_factory: Callable[ + [type[_Aggregation]], ExemplarReservoirBuilder + ] + | None = None, + instrument_unit: str | None = None, ): if ( instrument_type diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py index 1bd0145d21a..9a641209160 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py @@ -70,7 +70,7 @@ from json import dumps from os import environ from types import ModuleType -from typing import List, Optional, cast +from typing import cast from urllib import parse from opentelemetry.attributes import BoundedAttributes @@ -86,7 +86,7 @@ ) from opentelemetry.util.types import AttributeValue -psutil: Optional[ModuleType] = None +psutil: ModuleType | None = None try: import psutil as psutil_module @@ -167,9 +167,7 @@ class Resource: _attributes: BoundedAttributes _schema_url: str - def __init__( - self, attributes: Attributes, schema_url: typing.Optional[str] = None - ): + def __init__(self, attributes: Attributes, schema_url: str | None = None): self._attributes = BoundedAttributes(attributes=attributes) if schema_url is None: schema_url = "" @@ -177,8 +175,8 @@ def __init__( @staticmethod def create( - attributes: typing.Optional[Attributes] = None, - schema_url: typing.Optional[str] = None, + attributes: Attributes | None = None, + schema_url: str | None = None, ) -> "Resource": """Creates a new `Resource` from attributes. @@ -203,7 +201,7 @@ def create( if detector.strip() ] - resource_detectors: List[ResourceDetector] = [] + resource_detectors: list[ResourceDetector] = [] if "*" in otel_experimental_resource_detectors: otel_experimental_resource_detectors = [ @@ -242,7 +240,7 @@ def create( if not resource.attributes.get(SERVICE_NAME, None): default_service_name = "unknown_service" process_executable_name = cast( - Optional[str], + str | None, resource.attributes.get(PROCESS_EXECUTABLE_NAME, None), ) if process_executable_name: @@ -312,7 +310,7 @@ def __hash__(self) -> int: f"{dumps(self._attributes.copy(), sort_keys=True)}|{self._schema_url}" ) - def to_json(self, indent: Optional[int] = 4) -> str: + def to_json(self, indent: int | None = 4) -> str: return dumps( { "attributes": dict(self.attributes), @@ -510,8 +508,8 @@ def detect(self) -> "Resource": def get_aggregated_resources( - detectors: typing.List["ResourceDetector"], - initial_resource: typing.Optional[Resource] = None, + detectors: list["ResourceDetector"], + initial_resource: Resource | None = None, timeout: int = 5, ) -> "Resource": """Retrieves resources from detectors in the order that they were passed diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py index 18fced70612..19bb8c07dd4 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py @@ -23,22 +23,19 @@ import traceback import typing import weakref +from collections.abc import ( + Callable, + Iterator, + Mapping, + MutableMapping, + Sequence, +) from dataclasses import dataclass from os import environ from time import time_ns from types import MappingProxyType, TracebackType from typing import ( Any, - Callable, - Dict, - Iterator, - List, - Mapping, - MutableMapping, - Optional, - Sequence, - Type, - Union, ) from warnings import filterwarnings @@ -106,7 +103,7 @@ class SpanProcessor: def on_start( self, span: "Span", - parent_context: Optional[context_api.Context] = None, + parent_context: context_api.Context | None = None, ) -> None: """Called when a :class:`opentelemetry.trace.Span` is started. @@ -180,7 +177,7 @@ def add_span_processor(self, span_processor: SpanProcessor) -> None: def on_start( self, span: "Span", - parent_context: Optional[context_api.Context] = None, + parent_context: context_api.Context | None = None, ) -> None: for sp in self._span_processors: sp.on_start(span, parent_context=parent_context) @@ -284,7 +281,7 @@ def _submit_and_await( def on_start( self, span: "Span", - parent_context: Optional[context_api.Context] = None, + parent_context: context_api.Context | None = None, ) -> None: self._submit_and_await( lambda sp: sp.on_start, span, parent_context=parent_context @@ -332,7 +329,7 @@ def force_flush(self, timeout_millis: int = 30000) -> bool: class EventBase(abc.ABC): - def __init__(self, name: str, timestamp: Optional[int] = None) -> None: + def __init__(self, name: str, timestamp: int | None = None) -> None: self._name = name if timestamp is None: self._timestamp = time_ns() @@ -368,8 +365,8 @@ def __init__( self, name: str, attributes: types.Attributes = None, - timestamp: Optional[int] = None, - limit: Optional[int] = _DEFAULT_OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT, + timestamp: int | None = None, + limit: int | None = _DEFAULT_OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT, ) -> None: super().__init__(name, timestamp) self._attributes = attributes @@ -417,18 +414,18 @@ class ReadableSpan: def __init__( self, name: str, - context: Optional[trace_api.SpanContext] = None, - parent: Optional[trace_api.SpanContext] = None, - resource: Optional[Resource] = None, + context: trace_api.SpanContext | None = None, + parent: trace_api.SpanContext | None = None, + resource: Resource | None = None, attributes: types.Attributes = None, events: Sequence[Event] = (), links: Sequence[trace_api.Link] = (), kind: trace_api.SpanKind = trace_api.SpanKind.INTERNAL, - instrumentation_info: Optional[InstrumentationInfo] = None, + instrumentation_info: InstrumentationInfo | None = None, status: Status = Status(StatusCode.UNSET), - start_time: Optional[int] = None, - end_time: Optional[int] = None, - instrumentation_scope: Optional[InstrumentationScope] = None, + start_time: int | None = None, + end_time: int | None = None, + instrumentation_scope: InstrumentationScope | None = None, ) -> None: self._name = name self._context = context @@ -469,7 +466,7 @@ def dropped_links(self) -> int: def name(self) -> str: return self._name - def get_span_context(self) -> Optional[trace_api.SpanContext]: + def get_span_context(self) -> trace_api.SpanContext | None: return self._context @property @@ -481,15 +478,15 @@ def kind(self) -> trace_api.SpanKind: return self._kind @property - def parent(self) -> Optional[trace_api.SpanContext]: + def parent(self) -> trace_api.SpanContext | None: return self._parent @property - def start_time(self) -> Optional[int]: + def start_time(self) -> int | None: return self._start_time @property - def end_time(self) -> Optional[int]: + def end_time(self) -> int | None: return self._end_time @property @@ -516,14 +513,14 @@ def resource(self) -> Resource: @deprecated( "You should use instrumentation_scope. Deprecated since version 1.11.1." ) - def instrumentation_info(self) -> Optional[InstrumentationInfo]: + def instrumentation_info(self) -> InstrumentationInfo | None: return self._instrumentation_info @property - def instrumentation_scope(self) -> Optional[InstrumentationScope]: + def instrumentation_scope(self) -> InstrumentationScope | None: return self._instrumentation_scope - def to_json(self, indent: Optional[int] = 4): + def to_json(self, indent: int | None = 4): parent_id = None if self.parent is not None: parent_id = f"0x{trace_api.format_span_id(self.parent.span_id)}" @@ -561,7 +558,7 @@ def to_json(self, indent: Optional[int] = 4): return json.dumps(f_span, indent=indent) @staticmethod - def _format_context(context: SpanContext) -> Dict[str, str]: + def _format_context(context: SpanContext) -> dict[str, str]: return { "trace_id": f"0x{trace_api.format_trace_id(context.trace_id)}", "span_id": f"0x{trace_api.format_span_id(context.span_id)}", @@ -571,13 +568,13 @@ def _format_context(context: SpanContext) -> Dict[str, str]: @staticmethod def _format_attributes( attributes: types.Attributes, - ) -> Optional[Dict[str, Any]]: + ) -> dict[str, Any] | None: if attributes is not None and not isinstance(attributes, dict): return dict(attributes) return attributes @staticmethod - def _format_events(events: Sequence[Event]) -> List[Dict[str, Any]]: + def _format_events(events: Sequence[Event]) -> list[dict[str, Any]]: return [ { "name": event.name, @@ -590,7 +587,7 @@ def _format_events(events: Sequence[Event]) -> List[Dict[str, Any]]: ] @staticmethod - def _format_links(links: Sequence[trace_api.Link]) -> List[Dict[str, Any]]: + def _format_links(links: Sequence[trace_api.Link]) -> list[dict[str, Any]]: return [ { "context": Span._format_context( # pylint: disable=protected-access @@ -651,14 +648,14 @@ class SpanLimits: def __init__( self, - max_attributes: Optional[int] = None, - max_events: Optional[int] = None, - max_links: Optional[int] = None, - max_span_attributes: Optional[int] = None, - max_event_attributes: Optional[int] = None, - max_link_attributes: Optional[int] = None, - max_attribute_length: Optional[int] = None, - max_span_attribute_length: Optional[int] = None, + max_attributes: int | None = None, + max_events: int | None = None, + max_links: int | None = None, + max_span_attributes: int | None = None, + max_event_attributes: int | None = None, + max_link_attributes: int | None = None, + max_attribute_length: int | None = None, + max_span_attribute_length: int | None = None, ): # span events and links count self.max_events = self._from_env_if_absent( @@ -727,8 +724,8 @@ def __repr__(self): @classmethod def _from_env_if_absent( - cls, value: Optional[int], env_var: str, default: Optional[int] = None - ) -> Optional[int]: + cls, value: int | None, env_var: str, default: int | None = None + ) -> int | None: if value == cls.UNSET: return None @@ -807,22 +804,22 @@ def __init__( self, name: str, context: trace_api.SpanContext, - parent: Optional[trace_api.SpanContext] = None, - sampler: Optional[sampling.Sampler] = None, + parent: trace_api.SpanContext | None = None, + sampler: sampling.Sampler | None = None, trace_config: None = None, # TODO - resource: Optional[Resource] = None, + resource: Resource | None = None, attributes: types.Attributes = None, - events: Optional[Sequence[Event]] = None, + events: Sequence[Event] | None = None, links: Sequence[trace_api.Link] = (), kind: trace_api.SpanKind = trace_api.SpanKind.INTERNAL, span_processor: SpanProcessor = SpanProcessor(), - instrumentation_info: Optional[InstrumentationInfo] = None, + instrumentation_info: InstrumentationInfo | None = None, record_exception: bool = True, set_status_on_exception: bool = True, limits=_UnsetLimits, - instrumentation_scope: Optional[InstrumentationScope] = None, + instrumentation_scope: InstrumentationScope | None = None, *, - record_end_metrics: Optional[Callable[[], None]] = None, + record_end_metrics: Callable[[], None] | None = None, ) -> None: if resource is None: resource = Resource.create({}) @@ -910,7 +907,7 @@ def add_event( self, name: str, attributes: types.Attributes = None, - timestamp: Optional[int] = None, + timestamp: int | None = None, ) -> None: attributes = BoundedAttributes( self._limits.max_event_attributes, @@ -968,8 +965,8 @@ def _readable_span(self) -> ReadableSpan: def start( self, - start_time: Optional[int] = None, - parent_context: Optional[context_api.Context] = None, + start_time: int | None = None, + parent_context: context_api.Context | None = None, ) -> None: with self._lock: if self._start_time is not None: @@ -981,7 +978,7 @@ def start( self._span_processor.on_start(self, parent_context=parent_context) - def end(self, end_time: Optional[int] = None) -> None: + def end(self, end_time: int | None = None) -> None: with self._lock: if self._start_time is None: raise RuntimeError("Calling end() on a not started span.") @@ -1007,8 +1004,8 @@ def is_recording(self) -> bool: @_check_span_ended def set_status( self, - status: typing.Union[Status, StatusCode], - description: typing.Optional[str] = None, + status: Status | StatusCode, + description: str | None = None, ) -> None: # Ignore future calls if status is already set to OK # Ignore calls to set to StatusCode.UNSET @@ -1036,9 +1033,9 @@ def set_status( def __exit__( self, - exc_type: Optional[Type[BaseException]], - exc_val: Optional[BaseException], - exc_tb: Optional[TracebackType], + exc_type: type[BaseException] | None, + exc_val: BaseException | None, + exc_tb: TracebackType | None, ) -> None: """Ends context manager and calls `end` on the `Span`.""" if exc_val is not None and self.is_recording(): @@ -1062,7 +1059,7 @@ def record_exception( self, exception: BaseException, attributes: types.Attributes = None, - timestamp: Optional[int] = None, + timestamp: int | None = None, escaped: bool = False, ) -> None: """Records an exception as a span event.""" @@ -1116,16 +1113,15 @@ def __init__( self, sampler: sampling.Sampler, resource: Resource, - span_processor: Union[ - SynchronousMultiSpanProcessor, ConcurrentMultiSpanProcessor - ], + span_processor: SynchronousMultiSpanProcessor + | ConcurrentMultiSpanProcessor, id_generator: IdGenerator, instrumentation_info: InstrumentationInfo, span_limits: SpanLimits, instrumentation_scope: InstrumentationScope, *, - meter_provider: Optional[metrics_api.MeterProvider] = None, - _tracer_config: Optional[_TracerConfig] = None, + meter_provider: metrics_api.MeterProvider | None = None, + _tracer_config: _TracerConfig | None = None, ) -> None: self.sampler = sampler self.resource = resource @@ -1150,11 +1146,11 @@ def _is_enabled(self) -> bool: def start_as_current_span( self, name: str, - context: Optional[context_api.Context] = None, + context: context_api.Context | None = None, kind: trace_api.SpanKind = trace_api.SpanKind.INTERNAL, attributes: types.Attributes = None, - links: Optional[Sequence[trace_api.Link]] = (), - start_time: Optional[int] = None, + links: Sequence[trace_api.Link] | None = (), + start_time: int | None = None, record_exception: bool = True, set_status_on_exception: bool = True, end_on_exit: bool = True, @@ -1180,11 +1176,11 @@ def start_as_current_span( def start_span( # pylint: disable=too-many-locals self, name: str, - context: Optional[context_api.Context] = None, + context: context_api.Context | None = None, kind: trace_api.SpanKind = trace_api.SpanKind.INTERNAL, attributes: types.Attributes = None, - links: Optional[Sequence[trace_api.Link]] = (), - start_time: Optional[int] = None, + links: Sequence[trace_api.Link] | None = (), + start_time: int | None = None, record_exception: bool = True, set_status_on_exception: bool = True, ) -> trace_api.Span: @@ -1295,17 +1291,17 @@ class TracerProvider(trace_api.TracerProvider): def __init__( self, - sampler: Optional[sampling.Sampler] = None, - resource: Optional[Resource] = None, + sampler: sampling.Sampler | None = None, + resource: Resource | None = None, shutdown_on_exit: bool = True, - active_span_processor: Union[ - SynchronousMultiSpanProcessor, ConcurrentMultiSpanProcessor, None - ] = None, - id_generator: Optional[IdGenerator] = None, - span_limits: Optional[SpanLimits] = None, + active_span_processor: SynchronousMultiSpanProcessor + | ConcurrentMultiSpanProcessor + | None = None, + id_generator: IdGenerator | None = None, + span_limits: SpanLimits | None = None, *, - meter_provider: Optional[metrics_api.MeterProvider] = None, - _tracer_configurator: Optional[_TracerConfiguratorT] = None, + meter_provider: metrics_api.MeterProvider | None = None, + _tracer_configurator: _TracerConfiguratorT | None = None, ) -> None: self._active_span_processor = ( active_span_processor or SynchronousMultiSpanProcessor() @@ -1372,9 +1368,9 @@ def _apply_tracer_configurator( def get_tracer( self, instrumenting_module_name: str, - instrumenting_library_version: typing.Optional[str] = None, - schema_url: typing.Optional[str] = None, - attributes: typing.Optional[types.Attributes] = None, + instrumenting_library_version: str | None = None, + schema_url: str | None = None, + attributes: types.Attributes | None = None, ) -> "trace_api.Tracer": if self._disabled: return NoOpTracer() diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_always_off.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_always_off.py index eaafe164161..424fbd0e5d6 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_always_off.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_always_off.py @@ -14,7 +14,7 @@ from __future__ import annotations -from typing import Sequence +from collections.abc import Sequence from opentelemetry.context import Context from opentelemetry.trace import Link, SpanKind, TraceState diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_always_on.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_always_on.py index 88ac61c5d37..2bd21df2111 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_always_on.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_always_on.py @@ -14,7 +14,7 @@ from __future__ import annotations -from typing import Sequence +from collections.abc import Sequence from opentelemetry.context import Context from opentelemetry.trace import Link, SpanKind, TraceState diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_composable.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_composable.py index 5829601e30d..70fb34f770a 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_composable.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_composable.py @@ -14,8 +14,9 @@ from __future__ import annotations +from collections.abc import Callable, Sequence from dataclasses import dataclass, field -from typing import Callable, Protocol, Sequence +from typing import Protocol from opentelemetry.context import Context from opentelemetry.trace import Link, SpanKind, TraceState diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_parent_threshold.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_parent_threshold.py index 83b7b7d3005..ab5958db78b 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_parent_threshold.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_parent_threshold.py @@ -14,7 +14,7 @@ from __future__ import annotations -from typing import Sequence +from collections.abc import Sequence from opentelemetry.context import Context from opentelemetry.trace import Link, SpanKind, TraceState, get_current_span diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_rule_based.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_rule_based.py index f03e3086527..d465cb7e857 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_rule_based.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_rule_based.py @@ -14,7 +14,8 @@ from __future__ import annotations -from typing import Protocol, Sequence +from collections.abc import Sequence +from typing import Protocol from opentelemetry.context import Context from opentelemetry.trace import Link, SpanKind, TraceState diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_sampler.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_sampler.py index 989cc36019d..a2acad63e86 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_sampler.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_sampler.py @@ -14,7 +14,7 @@ from __future__ import annotations -from typing import Sequence +from collections.abc import Sequence from opentelemetry.context import Context from opentelemetry.sdk.trace.sampling import Decision, Sampler, SamplingResult diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_trace_state.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_trace_state.py index bc06420f2a0..960a2db85e8 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_trace_state.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_trace_state.py @@ -14,8 +14,8 @@ from __future__ import annotations +from collections.abc import Sequence from dataclasses import dataclass -from typing import Sequence from opentelemetry.trace import TraceState diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_traceid_ratio.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_traceid_ratio.py index d63b6f8a8d7..8e95847f2f6 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_traceid_ratio.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_traceid_ratio.py @@ -14,7 +14,7 @@ from __future__ import annotations -from typing import Sequence +from collections.abc import Sequence from opentelemetry.context import Context from opentelemetry.trace import Link, SpanKind, TraceState diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py index 8cf9c5e922d..36df2e7178e 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py @@ -109,7 +109,7 @@ def __init__( ) def on_start( - self, span: Span, parent_context: typing.Optional[Context] = None + self, span: Span, parent_context: Context | None = None ) -> None: pass @@ -225,7 +225,7 @@ def on_end(self, span: ReadableSpan) -> None: def shutdown(self): return self._batch_processor.shutdown() - def force_flush(self, timeout_millis: typing.Optional[int] = None) -> bool: + def force_flush(self, timeout_millis: int | None = None) -> bool: return self._batch_processor.force_flush(timeout_millis) @staticmethod diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/in_memory_span_exporter.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/in_memory_span_exporter.py index c28ecfd214f..dd2f73b003c 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/in_memory_span_exporter.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/in_memory_span_exporter.py @@ -28,7 +28,7 @@ class InMemorySpanExporter(SpanExporter): """ def __init__(self) -> None: - self._finished_spans: typing.List[ReadableSpan] = [] + self._finished_spans: list[ReadableSpan] = [] self._stopped = False self._lock = threading.Lock() @@ -37,7 +37,7 @@ def clear(self) -> None: with self._lock: self._finished_spans.clear() - def get_finished_spans(self) -> typing.Tuple[ReadableSpan, ...]: + def get_finished_spans(self) -> tuple[ReadableSpan, ...]: """Get list of collected spans.""" with self._lock: return tuple(self._finished_spans) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/sampling.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/sampling.py index 68466eb1018..8a5c012718a 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/sampling.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/sampling.py @@ -135,9 +135,10 @@ def get_sampler(sampler_argument): import abc import enum import os +from collections.abc import Sequence from logging import getLogger from types import MappingProxyType -from typing import Optional, Sequence +from typing import Optional # pylint: disable=unused-import from opentelemetry.context import Context @@ -202,9 +203,9 @@ def should_sample( parent_context: Optional["Context"], trace_id: int, name: str, - kind: Optional[SpanKind] = None, + kind: SpanKind | None = None, attributes: Attributes = None, - links: Optional[Sequence["Link"]] = None, + links: Sequence["Link"] | None = None, trace_state: Optional["TraceState"] = None, ) -> "SamplingResult": pass @@ -225,9 +226,9 @@ def should_sample( parent_context: Optional["Context"], trace_id: int, name: str, - kind: Optional[SpanKind] = None, + kind: SpanKind | None = None, attributes: Attributes = None, - links: Optional[Sequence["Link"]] = None, + links: Sequence["Link"] | None = None, trace_state: Optional["TraceState"] = None, ) -> "SamplingResult": if self._decision is Decision.DROP: @@ -286,9 +287,9 @@ def should_sample( parent_context: Optional["Context"], trace_id: int, name: str, - kind: Optional[SpanKind] = None, + kind: SpanKind | None = None, attributes: Attributes = None, - links: Optional[Sequence["Link"]] = None, + links: Sequence["Link"] | None = None, trace_state: Optional["TraceState"] = None, ) -> "SamplingResult": decision = Decision.DROP @@ -341,9 +342,9 @@ def should_sample( parent_context: Optional["Context"], trace_id: int, name: str, - kind: Optional[SpanKind] = None, + kind: SpanKind | None = None, attributes: Attributes = None, - links: Optional[Sequence["Link"]] = None, + links: Sequence["Link"] | None = None, trace_state: Optional["TraceState"] = None, ) -> "SamplingResult": parent_span_context = get_current_span( @@ -445,7 +446,7 @@ def _get_from_env_or_default() -> Sampler: def _get_parent_trace_state( - parent_context: Optional[Context], + parent_context: Context | None, ) -> Optional["TraceState"]: parent_span_context = get_current_span(parent_context).get_span_context() if parent_span_context is None or not parent_span_context.is_valid: diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/util/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/util/__init__.py index 4adf4ed4599..0395c230068 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/util/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/util/__init__.py @@ -17,7 +17,6 @@ import threading from collections import deque from collections.abc import MutableMapping, Sequence -from typing import Optional from typing_extensions import deprecated @@ -51,7 +50,7 @@ class BoundedList(Sequence): not enough room. """ - def __init__(self, maxlen: Optional[int]): + def __init__(self, maxlen: int | None): self.dropped = 0 self._dq = deque(maxlen=maxlen) # type: deque self._lock = threading.Lock() @@ -110,7 +109,7 @@ class BoundedDict(MutableMapping): added. """ - def __init__(self, maxlen: Optional[int]): + def __init__(self, maxlen: int | None): if maxlen is not None: if not isinstance(maxlen, int): raise ValueError diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/util/__init__.pyi b/opentelemetry-sdk/src/opentelemetry/sdk/util/__init__.pyi index 00d1e7cfd51..53d372afba0 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/util/__init__.pyi +++ b/opentelemetry-sdk/src/opentelemetry/sdk/util/__init__.pyi @@ -12,14 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. -from typing import ( - Any, +from collections.abc import ( Iterable, Iterator, Mapping, MutableMapping, - Optional, Sequence, +) +from typing import ( + Any, TypeVar, overload, ) @@ -44,7 +45,7 @@ class BoundedList(Sequence[_T]): """ dropped: int - def __init__(self, maxlen: Optional[int]): ... + def __init__(self, maxlen: int | None): ... def __deepcopy__(self, memo: dict[int, Any]) -> BoundedList[_T]: ... def insert(self, index: int, value: _T) -> None: ... @overload @@ -56,7 +57,7 @@ class BoundedList(Sequence[_T]): def extend(self, seq: Sequence[_T]) -> None: ... @classmethod def from_seq( - cls, maxlen: Optional[int], seq: Iterable[_T] + cls, maxlen: int | None, seq: Iterable[_T] ) -> BoundedList[_T]: ... # pylint: disable=undefined-variable class BoundedDict(MutableMapping[_KT, _VT]): diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/util/_configurator.py b/opentelemetry-sdk/src/opentelemetry/sdk/util/_configurator.py index c7c9e78c965..0cd3f88ed8a 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/util/_configurator.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/util/_configurator.py @@ -11,7 +11,8 @@ # 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. -from typing import Generic, Sequence, TypeVar +from collections.abc import Sequence +from typing import Generic, TypeVar from opentelemetry.sdk.util.instrumentation import ( InstrumentationScope, diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/util/instrumentation.py b/opentelemetry-sdk/src/opentelemetry/sdk/util/instrumentation.py index fd8af277f58..9da2ab1d593 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/util/instrumentation.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/util/instrumentation.py @@ -12,13 +12,17 @@ # See the License for the specific language governing permissions and # limitations under the License. import fnmatch +from collections.abc import Callable from json import dumps -from typing import Callable, Optional from typing_extensions import deprecated from opentelemetry.attributes import BoundedAttributes -from opentelemetry.util.types import Attributes, _ExtendedAttributes +from opentelemetry.util.types import ( # noqa: F401 + AnyValue, + Attributes, + _ExtendedAttributes, +) class InstrumentationInfo: @@ -36,8 +40,8 @@ class InstrumentationInfo: def __init__( self, name: str, - version: Optional[str] = None, - schema_url: Optional[str] = None, + version: str | None = None, + schema_url: str | None = None, ): self._name = name self._version = version @@ -68,11 +72,11 @@ def __lt__(self, value): ) @property - def schema_url(self) -> Optional[str]: + def schema_url(self) -> str | None: return self._schema_url @property - def version(self) -> Optional[str]: + def version(self) -> str | None: return self._version @property @@ -93,9 +97,9 @@ class InstrumentationScope: def __init__( self, name: str, - version: Optional[str] = None, - schema_url: Optional[str] = None, - attributes: Optional[_ExtendedAttributes] = None, + version: str | None = None, + schema_url: str | None = None, + attributes: _ExtendedAttributes | None = None, ) -> None: self._name = name self._version = version @@ -141,11 +145,11 @@ def __lt__(self, value: object) -> bool: ) @property - def schema_url(self) -> Optional[str]: + def schema_url(self) -> str | None: return self._schema_url @property - def version(self) -> Optional[str]: + def version(self) -> str | None: return self._version @property @@ -156,7 +160,7 @@ def name(self) -> str: def attributes(self) -> Attributes: return self._attributes - def to_json(self, indent: Optional[int] = 4) -> str: + def to_json(self, indent: int | None = 4) -> str: return dumps( { "name": self._name, diff --git a/opentelemetry-sdk/tests/logs/test_export.py b/opentelemetry-sdk/tests/logs/test_export.py index c36eeccfdc8..134e101b6b7 100644 --- a/opentelemetry-sdk/tests/logs/test_export.py +++ b/opentelemetry-sdk/tests/logs/test_export.py @@ -19,10 +19,10 @@ import threading import time import unittest +from collections.abc import Sequence from concurrent.futures import ( # pylint: disable=no-name-in-module ThreadPoolExecutor, ) -from typing import Sequence from unittest import mock from unittest.mock import Mock, patch diff --git a/opentelemetry-sdk/tests/metrics/integration_test/test_cpu_time.py b/opentelemetry-sdk/tests/metrics/integration_test/test_cpu_time.py index 8b9483d8326..ebae3379420 100644 --- a/opentelemetry-sdk/tests/metrics/integration_test/test_cpu_time.py +++ b/opentelemetry-sdk/tests/metrics/integration_test/test_cpu_time.py @@ -14,7 +14,7 @@ # type: ignore import io -from typing import Generator, Iterable, List +from collections.abc import Generator, Iterable from unittest import TestCase from unittest.mock import Mock, patch @@ -52,7 +52,7 @@ class TestCpuTimeIntegration(TestCase): @staticmethod def create_measurements_expected( instrument: Instrument, - ) -> List[Measurement]: + ) -> list[Measurement]: return [ Measurement( 6150.29, diff --git a/opentelemetry-sdk/tests/metrics/integration_test/test_provider_shutdown.py b/opentelemetry-sdk/tests/metrics/integration_test/test_provider_shutdown.py index 1f4a16d7f69..5e0cf4d27bd 100644 --- a/opentelemetry-sdk/tests/metrics/integration_test/test_provider_shutdown.py +++ b/opentelemetry-sdk/tests/metrics/integration_test/test_provider_shutdown.py @@ -15,7 +15,7 @@ import gc import time import weakref -from typing import Sequence +from collections.abc import Sequence from unittest import TestCase from opentelemetry.sdk.metrics import MeterProvider diff --git a/opentelemetry-sdk/tests/metrics/test_aggregation.py b/opentelemetry-sdk/tests/metrics/test_aggregation.py index bacaf350793..c4137aec029 100644 --- a/opentelemetry-sdk/tests/metrics/test_aggregation.py +++ b/opentelemetry-sdk/tests/metrics/test_aggregation.py @@ -16,7 +16,6 @@ from math import inf from time import sleep, time_ns -from typing import Union from unittest import TestCase from unittest.mock import Mock @@ -55,7 +54,7 @@ def measurement( - value: Union[int, float], attributes: Attributes = None + value: int | float, attributes: Attributes = None ) -> Measurement: return Measurement( value, diff --git a/opentelemetry-sdk/tests/metrics/test_backward_compat.py b/opentelemetry-sdk/tests/metrics/test_backward_compat.py index 90e885c3099..9c963b9683e 100644 --- a/opentelemetry-sdk/tests/metrics/test_backward_compat.py +++ b/opentelemetry-sdk/tests/metrics/test_backward_compat.py @@ -25,7 +25,7 @@ Ideally, we could use pyright for this as well, but SDK is not type checked atm. """ -from typing import Iterable, Sequence +from collections.abc import Iterable, Sequence from opentelemetry.metrics import CallbackOptions, Observation from opentelemetry.sdk.metrics import MeterProvider diff --git a/opentelemetry-sdk/tests/metrics/test_metric_reader.py b/opentelemetry-sdk/tests/metrics/test_metric_reader.py index 2f7aad25c6e..af7c8ffb9e6 100644 --- a/opentelemetry-sdk/tests/metrics/test_metric_reader.py +++ b/opentelemetry-sdk/tests/metrics/test_metric_reader.py @@ -14,7 +14,7 @@ # pylint: disable=protected-access -from typing import Dict, Iterable +from collections.abc import Iterable from unittest import TestCase from unittest.mock import patch @@ -54,8 +54,8 @@ class DummyMetricReader(MetricReader): def __init__( self, - preferred_temporality: Dict[type, AggregationTemporality] = None, - preferred_aggregation: Dict[type, Aggregation] = None, + preferred_temporality: dict[type, AggregationTemporality] = None, + preferred_aggregation: dict[type, Aggregation] = None, ) -> None: super().__init__( preferred_temporality=preferred_temporality, diff --git a/opentelemetry-sdk/tests/metrics/test_metrics.py b/opentelemetry-sdk/tests/metrics/test_metrics.py index d2f475faa00..2d225938c6e 100644 --- a/opentelemetry-sdk/tests/metrics/test_metrics.py +++ b/opentelemetry-sdk/tests/metrics/test_metrics.py @@ -15,11 +15,11 @@ # pylint: disable=protected-access,no-self-use,too-many-lines import weakref -from collections.abc import Callable +from collections.abc import Callable, Iterable, Sequence from logging import WARNING from threading import Lock from time import sleep -from typing import Any, Iterable, Sequence +from typing import Any from unittest.mock import MagicMock, Mock, patch from opentelemetry.attributes import BoundedAttributes diff --git a/opentelemetry-sdk/tests/metrics/test_periodic_exporting_metric_reader.py b/opentelemetry-sdk/tests/metrics/test_periodic_exporting_metric_reader.py index 3e47e577689..f9e06c492a0 100644 --- a/opentelemetry-sdk/tests/metrics/test_periodic_exporting_metric_reader.py +++ b/opentelemetry-sdk/tests/metrics/test_periodic_exporting_metric_reader.py @@ -19,7 +19,7 @@ import weakref from logging import WARNING from time import sleep, time_ns -from typing import Optional, cast +from typing import cast from unittest.mock import Mock import pytest @@ -91,8 +91,8 @@ def __init__( self, exporter: MetricExporter, exception: Exception, - export_interval_millis: Optional[float] = None, - export_timeout_millis: Optional[float] = None, + export_interval_millis: float | None = None, + export_timeout_millis: float | None = None, ) -> None: super().__init__( exporter, export_interval_millis, export_timeout_millis diff --git a/opentelemetry-sdk/tests/metrics/test_view_instrument_match.py b/opentelemetry-sdk/tests/metrics/test_view_instrument_match.py index 38d36758f39..fcb32217de6 100644 --- a/opentelemetry-sdk/tests/metrics/test_view_instrument_match.py +++ b/opentelemetry-sdk/tests/metrics/test_view_instrument_match.py @@ -15,8 +15,8 @@ # pylint: disable=protected-access from __future__ import annotations +from collections.abc import Callable, Sequence from time import time_ns -from typing import Callable, Sequence, Type from unittest import TestCase from unittest.mock import MagicMock, Mock, patch @@ -52,9 +52,9 @@ def generalized_reservoir_factory( size: int = 1, boundaries: Sequence[float] | None = None -) -> Callable[[Type[_Aggregation]], ExemplarReservoirBuilder]: +) -> Callable[[type[_Aggregation]], ExemplarReservoirBuilder]: def factory( - aggregation_type: Type[_Aggregation], + aggregation_type: type[_Aggregation], ) -> ExemplarReservoirBuilder: if issubclass(aggregation_type, _ExplicitBucketHistogramAggregation): return lambda **kwargs: AlignedHistogramBucketExemplarReservoir( diff --git a/opentelemetry-sdk/tests/test_configurator.py b/opentelemetry-sdk/tests/test_configurator.py index 17a2b85bae8..2125cdcfe08 100644 --- a/opentelemetry-sdk/tests/test_configurator.py +++ b/opentelemetry-sdk/tests/test_configurator.py @@ -18,9 +18,9 @@ import logging import logging.config +from collections.abc import Iterable, Sequence from logging import WARNING, getLogger from os import environ -from typing import Iterable, Optional, Sequence from unittest import TestCase, mock from unittest.mock import Mock, patch @@ -273,7 +273,7 @@ def get_description(self) -> str: def should_sample( self, - parent_context: Optional[Context], + parent_context: Context | None, trace_id: int, name: str, kind: SpanKind = None, diff --git a/opentelemetry-sdk/tests/trace/test_sampling.py b/opentelemetry-sdk/tests/trace/test_sampling.py index 09057ee1c15..a9e06bde741 100644 --- a/opentelemetry-sdk/tests/trace/test_sampling.py +++ b/opentelemetry-sdk/tests/trace/test_sampling.py @@ -14,7 +14,6 @@ import contextlib import sys -import typing import unittest from opentelemetry import context as context_api @@ -67,7 +66,7 @@ def test_ctr(self): class TestSampler(unittest.TestCase): def _create_parent( self, trace_flags: trace.TraceFlags, is_remote=False, trace_state=None - ) -> typing.Optional[context_api.Context]: + ) -> context_api.Context | None: if trace_flags is None: return None return trace.set_span_in_context( diff --git a/opentelemetry-sdk/tests/trace/test_span_processor.py b/opentelemetry-sdk/tests/trace/test_span_processor.py index c751ab96d9f..2410815aa42 100644 --- a/opentelemetry-sdk/tests/trace/test_span_processor.py +++ b/opentelemetry-sdk/tests/trace/test_span_processor.py @@ -17,11 +17,9 @@ import multiprocessing import os import time -import typing import unittest import weakref from threading import Event -from typing import Optional from unittest import mock from opentelemetry import trace as trace_api @@ -51,7 +49,7 @@ def __init__(self, name, span_list): self.span_list = span_list def on_start( - self, span: "trace.Span", parent_context: Optional[Context] = None + self, span: "trace.Span", parent_context: Context | None = None ) -> None: self.span_list.append(span_event_start_fmt(self.name, span.name)) @@ -273,9 +271,10 @@ class MultiSpanProcessorTestBase(abc.ABC): @abc.abstractmethod def create_multi_span_processor( self, - ) -> typing.Union[ - trace.SynchronousMultiSpanProcessor, trace.ConcurrentMultiSpanProcessor - ]: + ) -> ( + trace.SynchronousMultiSpanProcessor + | trace.ConcurrentMultiSpanProcessor + ): pass @staticmethod diff --git a/opentelemetry-sdk/tests/trace/test_trace.py b/opentelemetry-sdk/tests/trace/test_trace.py index 2c6fdf3f929..60573ac8d2e 100644 --- a/opentelemetry-sdk/tests/trace/test_trace.py +++ b/opentelemetry-sdk/tests/trace/test_trace.py @@ -24,7 +24,6 @@ from logging import ERROR, WARNING from random import randint from time import time_ns -from typing import Optional from unittest import mock from unittest.mock import Mock, patch @@ -1572,7 +1571,7 @@ def __init__(self, name, span_list): self.span_list = span_list def on_start( - self, span: "trace.Span", parent_context: Optional[Context] = None + self, span: "trace.Span", parent_context: Context | None = None ) -> None: self.span_list.append(span_event_start_fmt(self.name, span.name)) diff --git a/propagator/opentelemetry-propagator-b3/src/opentelemetry/propagators/b3/__init__.py b/propagator/opentelemetry-propagator-b3/src/opentelemetry/propagators/b3/__init__.py index 9bcce9b7c0e..70f6f9b2ce4 100644 --- a/propagator/opentelemetry-propagator-b3/src/opentelemetry/propagators/b3/__init__.py +++ b/propagator/opentelemetry-propagator-b3/src/opentelemetry/propagators/b3/__init__.py @@ -49,7 +49,7 @@ class B3MultiFormat(TextMapPropagator): def extract( self, carrier: CarrierT, - context: typing.Optional[Context] = None, + context: Context | None = None, getter: Getter = default_getter, ) -> Context: if context is None: @@ -130,7 +130,7 @@ def extract( def inject( self, carrier: CarrierT, - context: typing.Optional[Context] = None, + context: Context | None = None, setter: Setter = default_setter, ) -> None: span = trace.get_current_span(context=context) @@ -151,7 +151,7 @@ def inject( setter.set(carrier, self.SAMPLED_KEY, "1" if sampled else "0") @property - def fields(self) -> typing.Set[str]: + def fields(self) -> set[str]: return { self.TRACE_ID_KEY, self.SPAN_ID_KEY, @@ -169,7 +169,7 @@ class B3SingleFormat(B3MultiFormat): def inject( self, carrier: CarrierT, - context: typing.Optional[Context] = None, + context: Context | None = None, setter: Setter = default_setter, ) -> None: span = trace.get_current_span(context=context) @@ -189,7 +189,7 @@ def inject( setter.set(carrier, self.SINGLE_HEADER_KEY, "-".join(fields)) @property - def fields(self) -> typing.Set[str]: + def fields(self) -> set[str]: return {self.SINGLE_HEADER_KEY} @@ -203,7 +203,7 @@ def __init__(self, *args, **kwargs): def _extract_first_element( items: typing.Iterable[CarrierT], -) -> typing.Optional[CarrierT]: +) -> CarrierT | None: if items is None: return None return next(iter(items), None) diff --git a/propagator/opentelemetry-propagator-jaeger/src/opentelemetry/propagators/jaeger/__init__.py b/propagator/opentelemetry-propagator-jaeger/src/opentelemetry/propagators/jaeger/__init__.py index 6b6eb8fbf05..bae07221c69 100644 --- a/propagator/opentelemetry-propagator-jaeger/src/opentelemetry/propagators/jaeger/__init__.py +++ b/propagator/opentelemetry-propagator-jaeger/src/opentelemetry/propagators/jaeger/__init__.py @@ -41,7 +41,7 @@ class JaegerPropagator(TextMapPropagator): def extract( self, carrier: CarrierT, - context: typing.Optional[Context] = None, + context: Context | None = None, getter: Getter = default_getter, ) -> Context: if context is None: @@ -72,7 +72,7 @@ def extract( def inject( self, carrier: CarrierT, - context: typing.Optional[Context] = None, + context: Context | None = None, setter: Setter = default_setter, ) -> None: span = trace.get_current_span(context=context) @@ -109,7 +109,7 @@ def inject( setter.set(carrier, baggage_key, urllib.parse.quote(str(value))) @property - def fields(self) -> typing.Set[str]: + def fields(self) -> set[str]: return {self.TRACE_ID_KEY} def _extract_baggage(self, getter, carrier, context): @@ -134,7 +134,7 @@ def _format_uber_trace_id(trace_id, span_id, parent_span_id, flags): def _extract_first_element( items: typing.Iterable[CarrierT], -) -> typing.Optional[CarrierT]: +) -> CarrierT | None: if items is None: return None return next(iter(items), None) @@ -142,7 +142,7 @@ def _extract_first_element( def _parse_trace_id_header( items: typing.Iterable[CarrierT], -) -> typing.Tuple[int]: +) -> tuple[int]: invalid_header_result = (trace.INVALID_TRACE_ID, trace.INVALID_SPAN_ID, 0) header = _extract_first_element(items) @@ -163,9 +163,7 @@ def _parse_trace_id_header( return trace_id, span_id, flags -def _int_from_hex_str( - identifier: str, default: typing.Optional[int] -) -> typing.Optional[int]: +def _int_from_hex_str(identifier: str, default: int | None) -> int | None: try: return int(identifier, 16) except ValueError: diff --git a/pyproject.toml b/pyproject.toml index b0d89f84ca7..03148850b97 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -77,20 +77,16 @@ output-format = "concise" # https://docs.astral.sh/ruff/linter/#rule-selection # pylint: https://github.com/astral-sh/ruff/issues/970 select = [ - "I", # isort - "F", # pyflakes - "E", # pycodestyle errors - "W", # pycodestyle warnings - "PLC", # pylint convention - "PLE", # pylint error - "Q", # flake8-quotes + "I", # https://docs.astral.sh/ruff/rules/#isort-i + "F", # https://docs.astral.sh/ruff/rules/#pyflakes-f + "E", # https://docs.astral.sh/ruff/rules/#error-e + "W", # https://docs.astral.sh/ruff/rules/#warning-w + "PLC", # https://docs.astral.sh/ruff/rules/#convention-plc + "PLE", # https://docs.astral.sh/ruff/rules/#error-ple + "Q", # https://docs.astral.sh/ruff/rules/#flake8-quotes-q "G", # https://docs.astral.sh/ruff/rules/#flake8-logging-format-g - "TID", # flake8-tidy-imports - "UP011", # lru-cache-without-parameters - "UP015", # redundant-open-modes - "UP032", # f-string - "UP034", # extraneous-parentheses - "UP037", # quoted-annotation + "TID", # https://docs.astral.sh/ruff/rules/#flake8-tidy-imports-tid + "UP", # https://docs.astral.sh/ruff/rules/#pyupgrade-up ] ignore = [ diff --git a/shim/opentelemetry-opencensus-shim/src/opentelemetry/shim/opencensus/_patch.py b/shim/opentelemetry-opencensus-shim/src/opentelemetry/shim/opencensus/_patch.py index 71d09486616..b7d4debf73c 100644 --- a/shim/opentelemetry-opencensus-shim/src/opentelemetry/shim/opencensus/_patch.py +++ b/shim/opentelemetry-opencensus-shim/src/opentelemetry/shim/opencensus/_patch.py @@ -14,7 +14,6 @@ from functools import lru_cache from logging import getLogger -from typing import Optional from opencensus.trace.span_context import SpanContext from opencensus.trace.tracer import Tracer @@ -28,7 +27,7 @@ def install_shim( - tracer_provider: Optional[trace.TracerProvider] = None, + tracer_provider: trace.TracerProvider | None = None, ) -> None: otel_tracer = trace.get_tracer( "opentelemetry-opencensus-shim", diff --git a/shim/opentelemetry-opentracing-shim/src/opentelemetry/shim/opentracing_shim/__init__.py b/shim/opentelemetry-opentracing-shim/src/opentelemetry/shim/opentracing_shim/__init__.py index 45251e6b241..e88125496c0 100644 --- a/shim/opentelemetry-opentracing-shim/src/opentelemetry/shim/opentracing_shim/__init__.py +++ b/shim/opentelemetry-opentracing-shim/src/opentelemetry/shim/opentracing_shim/__init__.py @@ -88,7 +88,7 @@ import logging from types import TracebackType -from typing import Type, TypeVar +from typing import TypeVar from opentracing import ( Format, @@ -425,7 +425,7 @@ def __exit__(self, exc_type, exc_val, exc_tb): def _end_span_scope( self, - exc_type: Type[BaseException] | None, + exc_type: type[BaseException] | None, exc_val: BaseException | None, exc_tb: TracebackType | None, ) -> None: diff --git a/tests/opentelemetry-test-utils/src/opentelemetry/test/concurrency_test.py b/tests/opentelemetry-test-utils/src/opentelemetry/test/concurrency_test.py index 5d178e24fff..52bf5b26770 100644 --- a/tests/opentelemetry-test-utils/src/opentelemetry/test/concurrency_test.py +++ b/tests/opentelemetry-test-utils/src/opentelemetry/test/concurrency_test.py @@ -15,8 +15,9 @@ import sys import threading import unittest +from collections.abc import Callable from functools import partial -from typing import Callable, List, Optional, TypeVar +from typing import TypeVar from unittest.mock import Mock ReturnT = TypeVar("ReturnT") @@ -66,11 +67,11 @@ def tearDownClass(cls) -> None: def run_with_many_threads( func_to_test: Callable[[], ReturnT], num_threads: int = 100, - ) -> List[ReturnT]: + ) -> list[ReturnT]: """Util to run ``func_to_test`` in ``num_threads`` concurrently""" barrier = threading.Barrier(num_threads) - results: List[Optional[ReturnT]] = [None] * num_threads + results: list[ReturnT | None] = [None] * num_threads def thread_start(idx: int) -> None: nonlocal results diff --git a/tests/opentelemetry-test-utils/src/opentelemetry/test/metrictestutil.py b/tests/opentelemetry-test-utils/src/opentelemetry/test/metrictestutil.py index 33f1039ef87..782b71ba7c0 100644 --- a/tests/opentelemetry-test-utils/src/opentelemetry/test/metrictestutil.py +++ b/tests/opentelemetry-test-utils/src/opentelemetry/test/metrictestutil.py @@ -13,8 +13,6 @@ # limitations under the License. -from typing import Optional - from opentelemetry.attributes import BoundedAttributes from opentelemetry.sdk.metrics.export import ( AggregationTemporality, @@ -108,8 +106,8 @@ def _generate_unsupported_metric( def _generate_histogram( name: str, attributes: Attributes = None, - description: Optional[str] = None, - unit: Optional[str] = None, + description: str | None = None, + unit: str | None = None, ) -> Metric: if attributes is None: attributes = BoundedAttributes(attributes={"a": 1, "b": True}) diff --git a/tests/opentelemetry-test-utils/src/opentelemetry/test/mock_textmap.py b/tests/opentelemetry-test-utils/src/opentelemetry/test/mock_textmap.py index c3e901ee287..ce4a04daf6a 100644 --- a/tests/opentelemetry-test-utils/src/opentelemetry/test/mock_textmap.py +++ b/tests/opentelemetry-test-utils/src/opentelemetry/test/mock_textmap.py @@ -12,7 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import typing from opentelemetry import trace from opentelemetry.context import Context @@ -36,7 +35,7 @@ class NOOPTextMapPropagator(TextMapPropagator): def extract( self, carrier: CarrierT, - context: typing.Optional[Context] = None, + context: Context | None = None, getter: Getter = default_getter, ) -> Context: return Context() @@ -44,7 +43,7 @@ def extract( def inject( self, carrier: CarrierT, - context: typing.Optional[Context] = None, + context: Context | None = None, setter: Setter = default_setter, ) -> None: return None @@ -63,7 +62,7 @@ class MockTextMapPropagator(TextMapPropagator): def extract( self, carrier: CarrierT, - context: typing.Optional[Context] = None, + context: Context | None = None, getter: Getter = default_getter, ) -> Context: if context is None: @@ -88,7 +87,7 @@ def extract( def inject( self, carrier: CarrierT, - context: typing.Optional[Context] = None, + context: Context | None = None, setter: Setter = default_setter, ) -> None: span = trace.get_current_span(context) diff --git a/tests/opentelemetry-test-utils/src/opentelemetry/test/test_base.py b/tests/opentelemetry-test-utils/src/opentelemetry/test/test_base.py index 0ec7d594ca5..e508aca173e 100644 --- a/tests/opentelemetry-test-utils/src/opentelemetry/test/test_base.py +++ b/tests/opentelemetry-test-utils/src/opentelemetry/test/test_base.py @@ -14,8 +14,8 @@ import logging import unittest +from collections.abc import Sequence from contextlib import contextmanager -from typing import Optional, Sequence, Tuple from opentelemetry import metrics as metrics_api from opentelemetry import trace as trace_api @@ -118,7 +118,7 @@ def create_tracer_provider(**kwargs): return tracer_provider, memory_exporter @staticmethod - def create_meter_provider(**kwargs) -> Tuple[MeterProvider, MetricReader]: + def create_meter_provider(**kwargs) -> tuple[MeterProvider, MetricReader]: """Helper to create a configured meter provider Creates a `MeterProvider` and an `InMemoryMetricReader`. Returns: @@ -142,7 +142,7 @@ def disable_logging(highest_level=logging.CRITICAL): finally: logging.disable(logging.NOTSET) - def get_sorted_metrics(self, scope: Optional[str] = None): + def get_sorted_metrics(self, scope: str | None = None): """Returns recorded metrics sorted by name. Args: @@ -177,7 +177,7 @@ def assert_metric_expected( self, metric: Metric, expected_data_points: Sequence[DataPointT], - est_value_delta: Optional[float] = 0, + est_value_delta: float | None = 0, ): self.assertEqual( len(expected_data_points), len(metric.data.data_points) @@ -192,7 +192,7 @@ def assert_metric_expected( def is_data_points_equal( expected_data_point: DataPointT, data_point: DataPointT, - est_value_delta: Optional[float] = 0, + est_value_delta: float | None = 0, ): if type(expected_data_point) != type( # noqa: E721 data_point @@ -230,7 +230,7 @@ def assert_data_point_expected( self, expected_data_point: DataPointT, data_points: Sequence[DataPointT], - est_value_delta: Optional[float] = 0, + est_value_delta: float | None = 0, ): is_data_point_exist = False for data_point in data_points: