diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bcb9ba07a..9897aa91f1 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 + ([#5133](https://github.com/open-telemetry/opentelemetry-python/pull/5133)) - Switch to SPDX license headers and add CI enforcement ([#5177](https://github.com/open-telemetry/opentelemetry-python/pull/5177)) - `opentelemetry-api`: Enforce W3C Baggage size limits on outbound propagation in `W3CBaggagePropagator.inject()`. Previously only inbound extraction enforced limits; now inject also caps entries at 180, individual pairs at 4096 bytes, and total header at 8192 bytes per the W3C Baggage spec. The extract path max_pairs limit now counts all size-valid entries rather than only successfully parsed ones. 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 885a7124b2..0a3fb0986b 100644 --- a/codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/generator.py +++ b/codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/generator.py @@ -7,9 +7,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 @@ -125,7 +125,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. @@ -365,7 +365,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. @@ -421,7 +421,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. @@ -951,7 +951,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 c4a9702630..0a6c7c7196 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 @@ -38,14 +38,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. @@ -57,7 +57,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. @@ -83,7 +83,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. @@ -100,7 +100,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]: """ @@ -115,7 +115,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. @@ -136,7 +136,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. @@ -157,9 +157,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. @@ -180,9 +178,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. @@ -210,7 +206,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]: @@ -232,7 +228,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 0db9b101d7..310aa6cf76 100644 --- a/codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/writer.py +++ b/codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/writer.py @@ -3,9 +3,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 @@ -61,7 +61,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. @@ -77,7 +77,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. @@ -128,8 +128,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. @@ -153,8 +153,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", @@ -201,8 +201,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. @@ -232,7 +232,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. @@ -268,9 +268,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. @@ -296,9 +296,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. @@ -375,7 +375,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 @@ -393,7 +393,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 552f196b4b..aa24f838d5 100644 --- a/codegen/opentelemetry-codegen-json/tests/test_json_codec.py +++ b/codegen/opentelemetry-codegen-json/tests/test_json_codec.py @@ -2,7 +2,6 @@ # SPDX-License-Identifier: Apache-2.0 import math -from typing import Optional, Union import pytest # type: ignore @@ -29,7 +28,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 @@ -41,7 +40,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 @@ -60,7 +59,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 @@ -72,7 +71,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 @@ -101,7 +100,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 @@ -121,7 +120,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 @@ -142,7 +141,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 c820413a53..16c1852cfb 100644 --- a/codegen/opentelemetry-codegen-json/tests/test_protobuf_compatibility.py +++ b/codegen/opentelemetry-codegen-json/tests/test_protobuf_compatibility.py @@ -5,7 +5,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 @@ -28,7 +28,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 ) @@ -43,7 +43,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 ) @@ -55,7 +55,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, ) @@ -70,7 +70,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, ) @@ -82,7 +82,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 @@ -136,7 +136,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 @@ -160,7 +160,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 @@ -204,7 +204,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 d2199250ec..e89453ea6a 100644 --- a/codegen/opentelemetry-codegen-json/tests/test_serde.py +++ b/codegen/opentelemetry-codegen-json/tests/test_serde.py @@ -6,13 +6,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, @@ -22,7 +22,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 ) @@ -31,7 +31,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 @@ -39,7 +39,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, @@ -59,7 +59,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 4c850e5e2f..f931c2b9a1 100644 --- a/codegen/opentelemetry-codegen-json/tests/test_writer.py +++ b/codegen/opentelemetry-codegen-json/tests/test_writer.py @@ -1,6 +1,6 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 -from typing import Any, Optional +from typing import Any import pytest # type: ignore @@ -95,8 +95,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() @@ -164,8 +164,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 331557d2dd..0000000000 --- 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 7aef5ffe7d..e73d8f674b 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 65d9b4d8c8..b59d9dce6f 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 94b36930df..0000000000 --- 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 0205446c80..0000000000 --- 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 5ddd53be9c..45fc14df0c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -177,6 +177,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 c60deb0ee8..299c43f7b6 100644 --- a/docs/examples/metrics/instruments/example.py +++ b/docs/examples/metrics/instruments/example.py @@ -1,7 +1,7 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 -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 0296725ce6..41499c1d5b 100644 --- a/docs/examples/metrics/reader/synchronous_gauge_read.py +++ b/docs/examples/metrics/reader/synchronous_gauge_read.py @@ -2,7 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 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 c95802e696..7b4d2ab2df 100644 --- a/docs/examples/metrics/views/change_reservoir_factory.py +++ b/docs/examples/metrics/views/change_reservoir_factory.py @@ -3,7 +3,6 @@ import random import time -from typing import Type from opentelemetry import trace from opentelemetry.metrics import get_meter_provider, set_meter_provider @@ -28,7 +27,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 857cb379f2..eedf389848 100644 --- a/docs/examples/metrics/views/limit_num_of_attrs.py +++ b/docs/examples/metrics/views/limit_num_of_attrs.py @@ -3,7 +3,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 adef34b29d..7d83d04e88 100644 --- a/docs/getting_started/metrics_example.py +++ b/docs/getting_started/metrics_example.py @@ -4,7 +4,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 14cf8fcdc1..831d4b830d 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 @@ -4,7 +4,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 37ffece507..024d23fe11 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 @@ -4,10 +4,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 1df0840be4..8dbbc212f7 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 @@ -5,14 +5,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, ) @@ -56,9 +51,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): @@ -125,7 +118,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(): @@ -142,10 +135,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 6562ace7c1..453b4e79b8 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 @@ -1,7 +1,7 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 from collections import defaultdict -from typing import List, Sequence +from collections.abc import Sequence from opentelemetry.exporter.otlp.proto.common._internal import ( _encode_attributes, @@ -61,7 +61,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 37b1c196b3..fad7aaf3dd 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 @@ -4,7 +4,6 @@ import logging from os import environ -from typing import Dict, List from opentelemetry.exporter.otlp.proto.common._internal import ( _encode_attributes, @@ -68,8 +67,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, @@ -125,8 +124,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", @@ -333,7 +332,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 fe92277130..96276a383e 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 @@ -3,7 +3,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, @@ -48,7 +48,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 @@ -94,7 +94,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 @@ -125,7 +125,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 = [] @@ -156,7 +156,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( @@ -166,7 +166,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( @@ -175,7 +175,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 d4c3806ae9..a84134fab7 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 @@ -2,7 +2,6 @@ # SPDX-License-Identifier: Apache-2.0 import unittest -from typing import List, Tuple from opentelemetry._logs import LogRecord, SeverityNumber from opentelemetry.exporter.otlp.proto.common._internal import ( @@ -76,7 +75,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( @@ -319,7 +318,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( @@ -635,7 +634,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 b22a57606e..0c685948b7 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 @@ -4,7 +4,6 @@ # pylint: disable=protected-access import unittest -from typing import List, Tuple from opentelemetry.exporter.otlp.proto.common._internal import ( _encode_span_id, @@ -52,7 +51,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 @@ -183,7 +182,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 ba93509625..276122b861 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 @@ -1,9 +1,10 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 +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 @@ -51,17 +52,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 efd0866428..fc9c240b5d 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 @@ -12,25 +12,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 @@ -158,7 +156,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 @@ -176,14 +174,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() @@ -196,9 +194,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 @@ -218,7 +216,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, @@ -287,19 +285,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 cc1a60a59d..43d5b2bbd0 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 @@ -3,11 +3,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 ( @@ -94,7 +94,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, @@ -102,9 +104,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: @@ -196,10 +198,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, @@ -207,7 +209,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, @@ -215,7 +217,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 6f0cfa9a8c..314b54a5f0 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 @@ -4,9 +4,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 ( @@ -80,17 +80,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 3938b74aa4..66ba58380b 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 @@ -4,12 +4,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 @@ -104,8 +105,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 @@ -153,7 +154,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 18f17bd328..496fe3054d 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 @@ -5,7 +5,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 @@ -334,7 +333,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, @@ -413,7 +412,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, @@ -504,7 +503,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, @@ -818,7 +817,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( @@ -830,7 +829,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}", @@ -838,7 +837,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 5a32eed5f5..57bd7ca065 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 @@ -2,7 +2,7 @@ # SPDX-License-Identifier: Apache-2.0 from os import environ -from typing import Literal, Optional +from typing import Literal import requests @@ -26,7 +26,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 1535496d2c..cc8673c6df 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 @@ -6,10 +6,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 @@ -74,16 +74,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( @@ -149,7 +149,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: @@ -198,7 +198,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 bf36928234..a1c9254436 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 @@ -7,15 +7,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 @@ -124,7 +121,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 @@ -215,7 +212,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: @@ -272,7 +269,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: @@ -333,7 +330,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: @@ -549,8 +546,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: @@ -710,10 +707,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 1e51f8ebd3..167bd0dd0d 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 @@ -6,10 +6,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 @@ -70,16 +70,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( @@ -144,7 +144,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: @@ -191,7 +191,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 ddf4766914..252dab8874 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 @@ -3,7 +3,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 f63ae10ca5..45ee471fd2 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 @@ -6,7 +6,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 @@ -467,7 +466,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, @@ -546,7 +545,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, @@ -638,7 +637,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, @@ -1447,7 +1446,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={ @@ -1458,7 +1457,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}", @@ -1466,7 +1465,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 55b7603729..3dfb7df684 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 @@ -7,7 +7,6 @@ import time import unittest from logging import WARNING -from typing import List from unittest.mock import MagicMock, Mock, patch import requests @@ -347,7 +346,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 521f5dc39a..2dce0bf47a 100644 --- a/exporter/opentelemetry-exporter-prometheus/src/opentelemetry/exporter/prometheus/__init__.py +++ b/exporter/opentelemetry-exporter-prometheus/src/opentelemetry/exporter/prometheus/__init__.py @@ -52,11 +52,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 ( @@ -107,7 +107,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( @@ -167,7 +167,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 @@ -213,7 +213,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 = [] @@ -372,14 +372,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 e72f551b32..3811ccbd41 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 @@ -9,8 +9,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 @@ -103,7 +104,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): @@ -113,8 +114,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 @@ -183,7 +184,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)) @@ -217,8 +218,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 @@ -269,7 +270,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 b16d921540..3e277cb086 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 @@ -62,8 +62,8 @@ """ import logging +from collections.abc import Sequence from os import environ -from typing import Optional, Sequence import requests @@ -89,13 +89,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 cdd8ca6f24..1fb4e1a775 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 @@ -3,8 +3,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 @@ -12,8 +10,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: @@ -34,7 +32,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 4f50c72438..a157fe79ec 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 @@ -3,8 +3,6 @@ """Zipkin Export Encoders for JSON formats""" -from typing import Dict - from opentelemetry.exporter.zipkin.encoder import JsonEncoder from opentelemetry.trace import Span, SpanKind @@ -23,7 +21,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 4289799831..0f85f6bfc4 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 @@ -4,12 +4,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: @@ -26,7 +25,7 @@ def __init__( self, ipv4: IpInput = None, ipv6: IpInput = None, - port: Optional[int] = None, + port: int | None = None, ): self.ipv4 = ipv4 self.ipv6 = ipv6 @@ -42,7 +41,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 @@ -58,7 +57,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 8296b0dbad..ff5fe4d2a5 100644 --- a/exporter/opentelemetry-exporter-zipkin-json/tests/encoder/common_tests.py +++ b/exporter/opentelemetry-exporter-zipkin-json/tests/encoder/common_tests.py @@ -2,7 +2,6 @@ # SPDX-License-Identifier: Apache-2.0 import abc import unittest -from typing import Dict, List from opentelemetry import trace as trace_api from opentelemetry.exporter.zipkin.encoder import ( @@ -154,7 +153,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 @@ -316,7 +315,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 baa6a37a32..124aa303b1 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 @@ -61,8 +61,8 @@ """ import logging +from collections.abc import Sequence from os import environ -from typing import Optional, Sequence import requests @@ -85,13 +85,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 c9bcf3d5e2..0ddd7fc123 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 @@ -6,7 +6,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 @@ -79,8 +79,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 8296b0dbad..ff5fe4d2a5 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 @@ -2,7 +2,6 @@ # SPDX-License-Identifier: Apache-2.0 import abc import unittest -from typing import Dict, List from opentelemetry import trace as trace_api from opentelemetry.exporter.zipkin.encoder import ( @@ -154,7 +153,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 @@ -316,7 +315,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 f5df0caebb..9c70b90dae 100644 --- a/opentelemetry-api/src/opentelemetry/_events/__init__.py +++ b/opentelemetry-api/src/opentelemetry/_events/__init__.py @@ -29,13 +29,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 = { @@ -62,9 +62,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 @@ -93,9 +93,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, @@ -103,7 +103,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 @@ -134,9 +134,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.""" @@ -149,9 +149,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 @@ -166,9 +166,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( @@ -186,7 +186,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() @@ -240,10 +240,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 ed1a6543c9..2319a461c9 100644 --- a/opentelemetry-api/src/opentelemetry/_logs/_internal/__init__.py +++ b/opentelemetry-api/src/opentelemetry/_logs/_internal/__init__.py @@ -28,7 +28,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 @@ -57,15 +57,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 @@ -75,32 +75,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() @@ -127,9 +127,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 @@ -224,15 +224,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 @@ -310,9 +310,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. @@ -349,9 +349,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( @@ -363,9 +363,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( @@ -383,7 +383,7 @@ def get_logger( _LOGGER_PROVIDER_SET_ONCE = Once() -_LOGGER_PROVIDER: Optional[LoggerProvider] = None +_LOGGER_PROVIDER: LoggerProvider | None = None _PROXY_LOGGER_PROVIDER = ProxyLoggerProvider() @@ -426,9 +426,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 8754f847f2..09d01d3411 100644 --- a/opentelemetry-api/src/opentelemetry/attributes/__init__.py +++ b/opentelemetry-api/src/opentelemetry/attributes/__init__.py @@ -5,8 +5,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 @@ -37,8 +36,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. @@ -116,7 +115,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): @@ -193,7 +192,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. @@ -216,8 +215,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 @@ -242,10 +241,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: @@ -259,10 +258,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 fdedab57ac..b1b36a990d 100644 --- a/opentelemetry-api/src/opentelemetry/baggage/__init__.py +++ b/opentelemetry-api/src/opentelemetry/baggage/__init__.py @@ -1,10 +1,10 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 +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 @@ -23,7 +23,7 @@ def get_all( - context: Optional[Context] = None, + context: Context | None = None, ) -> Mapping[str, object]: """Returns the name/value pairs in the Baggage @@ -36,9 +36,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 @@ -54,7 +52,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 @@ -71,7 +69,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: @@ -87,7 +85,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: @@ -99,7 +97,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 ab68bf573f..1d873c5f3c 100644 --- a/opentelemetry-api/src/opentelemetry/baggage/propagation/__init__.py +++ b/opentelemetry-api/src/opentelemetry/baggage/propagation/__init__.py @@ -1,9 +1,9 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 # +from collections.abc import Iterable, Iterator, Mapping from logging import getLogger from re import split -from typing import Iterable, Iterator, Mapping, Optional, Set from urllib.parse import quote_plus, unquote_plus from opentelemetry.baggage import _is_valid_pair, get_all, set_baggage @@ -79,7 +79,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. @@ -139,7 +139,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. @@ -164,7 +164,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} @@ -178,8 +178,8 @@ def _encode_baggage_pairs( 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 c9ccd80e96..6518f03835 100644 --- a/opentelemetry-api/src/opentelemetry/context/__init__.py +++ b/opentelemetry-api/src/opentelemetry/context/__init__.py @@ -4,7 +4,6 @@ from __future__ import annotations import logging -import typing from contextvars import Token from os import environ from uuid import uuid4 @@ -71,7 +70,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. @@ -87,7 +86,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 0100b21f31..c8d87a422d 100644 --- a/opentelemetry-api/src/opentelemetry/context/context.py +++ b/opentelemetry-api/src/opentelemetry/context/context.py @@ -3,12 +3,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 1344c30d87..9df55291fa 100644 --- a/opentelemetry-api/src/opentelemetry/metrics/_internal/__init__.py +++ b/opentelemetry-api/src/opentelemetry/metrics/_internal/__init__.py @@ -31,11 +31,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 ( @@ -73,15 +74,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): @@ -93,9 +94,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. @@ -132,9 +133,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) @@ -143,15 +144,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: @@ -175,7 +176,7 @@ class _InstrumentRegistrationStatus: instrument_id: str already_registered: bool conflict: bool - current_advisory: Optional[_MetricsHistogramAdvisory] + current_advisory: _MetricsHistogramAdvisory | None class Meter(ABC): @@ -188,16 +189,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 @@ -208,14 +207,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 """ @@ -227,7 +226,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 @@ -320,7 +319,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: @@ -420,7 +419,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 @@ -451,7 +450,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: @@ -471,7 +470,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: @@ -492,13 +491,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 @@ -548,7 +547,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: @@ -569,7 +568,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: @@ -601,7 +600,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: @@ -619,7 +618,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: @@ -706,7 +705,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: @@ -735,7 +734,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( @@ -765,7 +764,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: @@ -791,7 +790,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: @@ -816,16 +815,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 9ab819f299..79bdfa4e67 100644 --- a/opentelemetry-api/src/opentelemetry/metrics/_internal/instrument.py +++ b/opentelemetry-api/src/opentelemetry/metrics/_internal/instrument.py @@ -5,19 +5,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 @@ -36,7 +30,7 @@ @dataclass(frozen=True) class _MetricsHistogramAdvisory: - explicit_bucket_boundaries: Optional[Sequence[float]] = None + explicit_bucket_boundaries: Sequence[float] | None = None @dataclass(frozen=True) @@ -53,10 +47,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): @@ -74,7 +68,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. @@ -85,7 +79,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 @@ -117,7 +111,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""" @@ -136,7 +130,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: @@ -155,7 +149,7 @@ class Asynchronous(Instrument): def __init__( self, name: str, - callbacks: Optional[Sequence[CallbackT]] = None, + callbacks: Sequence[CallbackT] | None = None, unit: str = "", description: str = "", ) -> None: @@ -168,9 +162,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. @@ -195,9 +189,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) @@ -205,9 +199,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) @@ -226,9 +220,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. @@ -257,9 +251,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) @@ -267,9 +261,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) @@ -294,7 +288,7 @@ class NoOpObservableCounter(ObservableCounter): def __init__( self, name: str, - callbacks: Optional[Sequence[CallbackT]] = None, + callbacks: Sequence[CallbackT] | None = None, unit: str = "", description: str = "", ) -> None: @@ -333,7 +327,7 @@ class NoOpObservableUpDownCounter(ObservableUpDownCounter): def __init__( self, name: str, - callbacks: Optional[Sequence[CallbackT]] = None, + callbacks: Sequence[CallbackT] | None = None, unit: str = "", description: str = "", ) -> None: @@ -372,16 +366,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. @@ -407,7 +401,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, @@ -418,9 +412,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) @@ -431,7 +425,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 = ( @@ -440,9 +434,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) @@ -469,7 +463,7 @@ class NoOpObservableGauge(ObservableGauge): def __init__( self, name: str, - callbacks: Optional[Sequence[CallbackT]] = None, + callbacks: Sequence[CallbackT] | None = None, unit: str = "", description: str = "", ) -> None: @@ -502,9 +496,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. @@ -533,9 +527,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) @@ -546,9 +540,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 608ac4fe79..26f2e07914 100644 --- a/opentelemetry-api/src/opentelemetry/metrics/_internal/observation.py +++ b/opentelemetry-api/src/opentelemetry/metrics/_internal/observation.py @@ -1,7 +1,6 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 -from typing import Optional, Union from opentelemetry.context import Context from opentelemetry.util.types import Attributes @@ -20,16 +19,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 @@ -37,7 +36,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 fe6fa3aca7..207f639a3f 100644 --- a/opentelemetry-api/src/opentelemetry/propagate/__init__.py +++ b/opentelemetry-api/src/opentelemetry/propagate/__init__.py @@ -59,7 +59,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 @@ -71,7 +70,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. @@ -92,7 +91,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. @@ -110,7 +109,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 2bf83b7738..5cb8d50e77 100644 --- a/opentelemetry-api/src/opentelemetry/propagators/_envcarrier.py +++ b/opentelemetry-api/src/opentelemetry/propagators/_envcarrier.py @@ -27,13 +27,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: @@ -50,7 +50,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 e56e38fe07..f6d864d818 100644 --- a/opentelemetry-api/src/opentelemetry/propagators/composite.py +++ b/opentelemetry-api/src/opentelemetry/propagators/composite.py @@ -27,7 +27,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. @@ -44,7 +44,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. @@ -58,7 +58,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 db7d0f6655..de37e65ce0 100644 --- a/opentelemetry-api/src/opentelemetry/propagators/textmap.py +++ b/opentelemetry-api/src/opentelemetry/propagators/textmap.py @@ -8,7 +8,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]): @@ -17,9 +17,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. @@ -33,7 +31,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: @@ -64,7 +62,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: @@ -80,9 +78,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()) @@ -123,7 +119,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. @@ -151,7 +147,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. @@ -174,7 +170,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 5d8c30d38f..996576c3ee 100644 --- a/opentelemetry-api/src/opentelemetry/trace/__init__.py +++ b/opentelemetry-api/src/opentelemetry/trace/__init__.py @@ -63,11 +63,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 @@ -145,7 +145,7 @@ def dropped_attributes(self) -> int: return 0 -_Links = Optional[Sequence[Link]] +_Links = Sequence[Link] | None class SpanKind(Enum): @@ -182,9 +182,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. @@ -225,9 +225,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() @@ -247,9 +247,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( @@ -277,11 +277,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": @@ -332,11 +332,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, @@ -408,15 +408,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 @@ -452,11 +452,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": @@ -480,11 +480,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, @@ -517,16 +517,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 721320308d..93a09160a8 100644 --- a/opentelemetry-api/src/opentelemetry/trace/propagation/__init__.py +++ b/opentelemetry-api/src/opentelemetry/trace/propagation/__init__.py @@ -1,6 +1,5 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 -from typing import Optional from opentelemetry.context import create_key, get_value, set_value from opentelemetry.context.context import Context @@ -10,9 +9,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: @@ -24,7 +21,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 1cf1945080..97c64d9373 100644 --- a/opentelemetry-api/src/opentelemetry/trace/propagation/tracecontext.py +++ b/opentelemetry-api/src/opentelemetry/trace/propagation/tracecontext.py @@ -2,7 +2,6 @@ # SPDX-License-Identifier: Apache-2.0 # import re -import typing from opentelemetry import trace from opentelemetry.context.context import Context @@ -25,7 +24,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. @@ -78,7 +77,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. @@ -98,7 +97,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 2ada379282..f714a1ae94 100644 --- a/opentelemetry-api/src/opentelemetry/trace/span.py +++ b/opentelemetry-api/src/opentelemetry/trace/span.py @@ -60,7 +60,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. @@ -111,7 +111,7 @@ def add_event( self, name: str, attributes: types.Attributes = None, - timestamp: typing.Optional[int] = None, + timestamp: int | None = None, ) -> None: """Adds an `Event`. @@ -162,8 +162,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. @@ -174,7 +174,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.""" @@ -188,9 +188,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`.""" @@ -237,9 +237,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: @@ -368,7 +366,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: @@ -386,7 +384,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: @@ -398,7 +396,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: @@ -425,9 +423,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 @@ -466,7 +462,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, @@ -528,7 +524,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( @@ -543,7 +539,7 @@ def add_event( self, name: str, attributes: types.Attributes = None, - timestamp: typing.Optional[int] = None, + timestamp: int | None = None, ) -> None: pass @@ -559,8 +555,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 @@ -568,7 +564,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 e7023f5e6b..1a81426536 100644 --- a/opentelemetry-api/src/opentelemetry/trace/status.py +++ b/opentelemetry-api/src/opentelemetry/trace/status.py @@ -3,7 +3,6 @@ import enum import logging -import typing logger = logging.getLogger(__name__) @@ -33,7 +32,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 @@ -56,7 +55,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 5f7c26a7e3..b724b9f93f 100644 --- a/opentelemetry-api/src/opentelemetry/util/_decorator.py +++ b/opentelemetry-api/src/opentelemetry/util/_decorator.py @@ -4,7 +4,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 a9b4dbb2cb..59f562385e 100644 --- a/opentelemetry-api/src/opentelemetry/util/_once.py +++ b/opentelemetry-api/src/opentelemetry/util/_once.py @@ -1,8 +1,8 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 +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 42a2577efd..5ac7813341 100644 --- a/opentelemetry-api/src/opentelemetry/util/re.py +++ b/opentelemetry-api/src/opentelemetry/util/re.py @@ -1,9 +1,9 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 +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 @@ -64,8 +64,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 4234b9756d..b8a753871b 100644 --- a/opentelemetry-api/src/opentelemetry/util/types.py +++ b/opentelemetry-api/src/opentelemetry/util/types.py @@ -1,46 +1,44 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 -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 2279318f64..fb6259f8c4 100644 --- a/opentelemetry-api/tests/attributes/test_attributes.py +++ b/opentelemetry-api/tests/attributes/test_attributes.py @@ -6,7 +6,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 c6a8ad45ed..562fb28d31 100644 --- a/opentelemetry-api/tests/events/test_proxy_event.py +++ b/opentelemetry-api/tests/events/test_proxy_event.py @@ -2,7 +2,6 @@ # SPDX-License-Identifier: Apache-2.0 # pylint: disable=W0212,W0222,W0221 -import typing import unittest import opentelemetry._events as events @@ -14,9 +13,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 dc3afedb33..71772eb5a7 100644 --- a/opentelemetry-api/tests/logs/test_proxy.py +++ b/opentelemetry-api/tests/logs/test_proxy.py @@ -2,7 +2,6 @@ # SPDX-License-Identifier: Apache-2.0 # pylint: disable=W0212,W0222,W0221 -import typing import unittest from unittest.mock import Mock @@ -16,9 +15,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) @@ -26,7 +25,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, @@ -36,7 +35,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 812c59c3f5..f5f9a93d43 100644 --- a/opentelemetry-api/tests/metrics/test_subclass_instantiation.py +++ b/opentelemetry-api/tests/metrics/test_subclass_instantiation.py @@ -8,7 +8,6 @@ # pylint: disable=useless-parent-delegation,arguments-differ -from typing import Optional from opentelemetry.metrics import ( Asynchronous, @@ -30,8 +29,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 f622c62428..87d410c5be 100644 --- a/opentelemetry-api/tests/trace/propagation/test_tracecontexthttptextformat.py +++ b/opentelemetry-api/tests/trace/propagation/test_tracecontexthttptextformat.py @@ -3,7 +3,6 @@ # type: ignore -import typing import unittest from unittest.mock import Mock, patch @@ -28,7 +27,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) @@ -55,7 +54,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) @@ -134,7 +133,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) ) @@ -166,7 +165,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 6d16860538..13f380c761 100644 --- a/opentelemetry-api/tests/trace/test_proxy.py +++ b/opentelemetry-api/tests/trace/test_proxy.py @@ -2,7 +2,6 @@ # SPDX-License-Identifier: Apache-2.0 # pylint: disable=W0212,W0222,W0221 -import typing import unittest from opentelemetry import trace @@ -20,9 +19,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 77003c848c..692168d5a3 100644 --- a/opentelemetry-api/tests/util/test_contextmanager.py +++ b/opentelemetry-api/tests/util/test_contextmanager.py @@ -3,7 +3,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 ed3bd757d7..3b6e2ba9e9 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py @@ -13,10 +13,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 ( @@ -97,12 +96,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], ] @@ -121,7 +118,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: @@ -231,7 +228,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, @@ -263,9 +260,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, @@ -294,7 +289,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, @@ -444,9 +439,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 e7e63c6d28..f70358b151 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_common.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_common.py @@ -6,7 +6,6 @@ import dataclasses import inspect import logging -from typing import Optional, Type from opentelemetry.sdk._configuration._exceptions import ConfigurationError from opentelemetry.util._importlib_metadata import entry_points @@ -48,7 +47,7 @@ def _init(self, **kwargs): return cls -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 @@ -74,9 +73,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 7ab07badd0..26c9e226c4 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_logger_provider.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_logger_provider.py @@ -4,7 +4,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 @@ -49,8 +48,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 @@ -205,8 +204,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. @@ -240,8 +239,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 ee43ab0956..2bfd11b422 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_meter_provider.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_meter_provider.py @@ -4,7 +4,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 @@ -84,7 +83,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, @@ -96,7 +95,7 @@ def _map_temporality( - pref: Optional[ExporterTemporalityPreference], + pref: ExporterTemporalityPreference | None, ) -> dict[type, AggregationTemporality]: """Map a temporality preference to an explicit preferred_temporality dict. @@ -137,7 +136,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. @@ -212,7 +211,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( @@ -255,8 +254,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 @@ -415,8 +414,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. @@ -456,8 +455,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 44e931841e..3d223363af 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_propagator.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_propagator.py @@ -3,8 +3,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 @@ -43,7 +41,7 @@ def _propagators_from_textmap_config( def create_propagator( - config: Optional[PropagatorConfig], + config: PropagatorConfig | None, ) -> CompositePropagator: """Create a CompositePropagator from declarative config. @@ -80,7 +78,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 4a7cd25e3f..fa8e7cf816 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_resource.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_resource.py @@ -7,7 +7,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 ( @@ -82,7 +82,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 @@ -187,7 +187,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 2d83c4c921..8d831f16be 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_tracer_provider.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_tracer_provider.py @@ -4,7 +4,6 @@ from __future__ import annotations import logging -from typing import Optional from opentelemetry import trace from opentelemetry.sdk._configuration._common import _parse_headers @@ -94,8 +93,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 @@ -251,8 +250,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. @@ -298,8 +297,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 c9e0e51cfa..d56ce3461a 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/file/_loader.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/file/_loader.py @@ -84,7 +84,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 3d069ac84e..5ec8d86403 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_events/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_events/__init__.py @@ -3,7 +3,6 @@ import logging from time import time_ns -from typing import Optional from typing_extensions import deprecated @@ -32,9 +31,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, @@ -71,15 +70,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 8583355630..8c2cb0a479 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py @@ -658,10 +658,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 400829b6bd..ec1a2927c6 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/__init__.py @@ -6,8 +6,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 @@ -315,7 +316,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 86a0228898..5a6a0495bd 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 @@ -30,7 +30,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 8d78ddf6e4..1a558d9c2a 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_shared_internal/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_shared_internal/__init__.py @@ -14,7 +14,6 @@ from abc import abstractmethod from typing import ( Generic, - Optional, Protocol, TypeVar, ) @@ -238,7 +237,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 1698318008..a514be735d 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/__init__.py @@ -3,12 +3,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 @@ -93,7 +93,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, @@ -227,7 +227,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 @@ -470,12 +470,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() @@ -643,9 +643,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 606f3714d0..7e5eef49b9 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 @@ -2,10 +2,11 @@ # SPDX-License-Identifier: Apache-2.0 +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, @@ -27,11 +28,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 @@ -132,8 +133,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 6e97f35763..dea213f428 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/aggregation.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/aggregation.py @@ -5,18 +5,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, ) @@ -107,7 +103,7 @@ def collect( self, collection_aggregation_temporality: AggregationTemporality, collection_start_nano: int, - ) -> Optional[_DataPointVarT]: + ) -> _DataPointVarT | None: pass def _collect_exemplars(self) -> Sequence[Exemplar]: @@ -148,7 +144,7 @@ def collect( self, collection_aggregation_temporality: AggregationTemporality, collection_start_nano: int, - ) -> Optional[_DataPointVarT]: + ) -> _DataPointVarT | None: pass @@ -189,7 +185,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. @@ -414,7 +410,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. """ @@ -461,7 +457,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: @@ -494,7 +490,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( @@ -520,7 +516,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. """ @@ -815,7 +811,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. """ @@ -1201,7 +1197,7 @@ def _create_aggregation( instrument: _Instrument, attributes: Attributes, reservoir_factory: Callable[ - [Type[_Aggregation]], ExemplarReservoirBuilder + [type[_Aggregation]], ExemplarReservoirBuilder ], start_time_unix_nano: int, ) -> _Aggregation: @@ -1232,7 +1228,7 @@ def _create_aggregation( instrument: _Instrument, attributes: Attributes, reservoir_factory: Callable[ - [Type[_Aggregation]], ExemplarReservoirBuilder + [type[_Aggregation]], ExemplarReservoirBuilder ], start_time_unix_nano: int, ) -> _Aggregation: @@ -1324,7 +1320,7 @@ def _create_aggregation( instrument: _Instrument, attributes: Attributes, reservoir_factory: Callable[ - [Type[_Aggregation]], ExemplarReservoirBuilder + [type[_Aggregation]], ExemplarReservoirBuilder ], start_time_unix_nano: int, ) -> _Aggregation: @@ -1362,7 +1358,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 @@ -1373,7 +1369,7 @@ def _create_aggregation( instrument: _Instrument, attributes: Attributes, reservoir_factory: Callable[ - [Type[_Aggregation]], ExemplarReservoirBuilder + [type[_Aggregation]], ExemplarReservoirBuilder ], start_time_unix_nano: int, ) -> _Aggregation: @@ -1417,7 +1413,7 @@ def _create_aggregation( instrument: _Instrument, attributes: Attributes, reservoir_factory: Callable[ - [Type[_Aggregation]], ExemplarReservoirBuilder + [type[_Aggregation]], ExemplarReservoirBuilder ], start_time_unix_nano: int, ) -> _Aggregation: @@ -1451,7 +1447,7 @@ def _create_aggregation( instrument: _Instrument, attributes: Attributes, reservoir_factory: Callable[ - [Type[_Aggregation]], ExemplarReservoirBuilder + [type[_Aggregation]], ExemplarReservoirBuilder ], start_time_unix_nano: int, ) -> _Aggregation: @@ -1469,7 +1465,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 a5d8579bd1..e864529238 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/exemplar/exemplar.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/exemplar/exemplar.py @@ -2,7 +2,6 @@ # SPDX-License-Identifier: Apache-2.0 import dataclasses -from typing import Optional, Union from opentelemetry.util.types import Attributes @@ -28,7 +27,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 48c488023e..28f0adc747 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 @@ -2,7 +2,6 @@ # SPDX-License-Identifier: Apache-2.0 from abc import ABC, abstractmethod -from typing import Union from opentelemetry import trace from opentelemetry.context import Context @@ -24,7 +23,7 @@ class ExemplarFilter(ABC): @abstractmethod def should_sample( self, - value: Union[int, float], + value: int | float, time_unix_nano: int, attributes: Attributes, context: Context, @@ -51,7 +50,7 @@ class AlwaysOnExemplarFilter(ExemplarFilter): def should_sample( self, - value: Union[int, float], + value: int | float, time_unix_nano: int, attributes: Attributes, context: Context, @@ -78,7 +77,7 @@ class AlwaysOffExemplarFilter(ExemplarFilter): def should_sample( self, - value: Union[int, float], + value: int | float, time_unix_nano: int, attributes: Attributes, context: Context, @@ -104,7 +103,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 7f219c34f5..afe2dcba38 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 @@ -3,16 +3,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 @@ -38,7 +32,7 @@ class ExemplarReservoir(ABC): @abstractmethod def offer( self, - value: Union[int, float], + value: int | float, time_unix_nano: int, attributes: Attributes, context: Context, @@ -54,7 +48,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 @@ -73,16 +67,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, @@ -106,7 +100,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 @@ -158,7 +152,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 @@ -183,7 +177,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, @@ -211,7 +205,7 @@ def offer( @abstractmethod def _find_bucket_index( self, - value: Union[int, float], + value: int | float, time_unix_nano: int, attributes: Attributes, context: Context, @@ -256,7 +250,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, @@ -287,7 +281,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, @@ -302,7 +296,7 @@ def offer( def _find_bucket_index( self, - value: Union[int, float], + value: int | float, time_unix_nano: int, attributes: Attributes, context: Context, @@ -313,9 +307,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 62e73f96b3..25cfd8a835 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/__init__.py @@ -6,13 +6,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 @@ -425,7 +426,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() @@ -459,8 +460,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 9cf2a58825..946cdf1df1 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/instrument.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/instrument.py @@ -4,16 +4,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, ) @@ -135,7 +131,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: @@ -188,7 +184,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, ): @@ -221,7 +217,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, ): @@ -290,7 +286,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, ): @@ -324,7 +320,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 61c8bca8c8..cd81c39f41 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/measurement.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/measurement.py @@ -4,7 +4,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 @@ -26,7 +26,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 f8ed81c48e..64d996787c 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/measurement_consumer.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/measurement_consumer.py @@ -4,9 +4,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 @@ -40,7 +40,7 @@ def collect( self, metric_reader: "opentelemetry.sdk.metrics.export.MetricReader", timeout_millis: float = 10_000, - ) -> Optional[MetricsData]: + ) -> MetricsData | None: pass @@ -62,7 +62,7 @@ def __init__( ) for reader in sdk_config.metric_readers } - self._async_instruments: List[ + self._async_instruments: list[ opentelemetry.sdk.metrics._internal.instrument._Asynchronous ] = [] @@ -93,7 +93,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 b43607ffd1..7c409430bf 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 @@ -4,7 +4,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, @@ -53,20 +52,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 @@ -112,7 +111,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 @@ -128,7 +127,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 ] = {} @@ -144,7 +143,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( @@ -243,7 +242,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 b7a11b33b3..4f7df8a5d0 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/point.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/point.py @@ -3,9 +3,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 @@ -24,10 +24,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) @@ -41,14 +41,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) @@ -69,7 +69,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 @@ -79,7 +79,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) @@ -94,7 +94,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": [ @@ -118,7 +118,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": [ @@ -140,7 +140,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": [ @@ -162,7 +162,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": [ @@ -176,10 +176,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) @@ -188,11 +188,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, @@ -212,7 +212,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)), @@ -234,7 +234,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)), @@ -254,7 +254,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 b9368579dd..6c2b8de25c 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/sdk_configuration.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/sdk_configuration.py @@ -3,8 +3,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 9dcd164fbf..7eb1fcc728 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/view.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/view.py @@ -2,9 +2,9 @@ # SPDX-License-Identifier: Apache-2.0 +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 ( @@ -25,7 +25,7 @@ def _default_reservoir_factory( - aggregation_type: Type[_Aggregation], + aggregation_type: type[_Aggregation], ) -> ExemplarReservoirBuilder: """Default reservoir factory per aggregation.""" if issubclass(aggregation_type, _ExplicitBucketHistogramAggregation): @@ -95,19 +95,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 3e08437506..c559390903 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py @@ -60,7 +60,7 @@ from json import dumps from os import environ from types import ModuleType -from typing import Optional, cast +from typing import cast from urllib import parse from opentelemetry.attributes import BoundedAttributes @@ -75,7 +75,7 @@ from opentelemetry.semconv.resource import ResourceAttributes from opentelemetry.util.types import AttributeValue -psutil: Optional[ModuleType] = None +psutil: ModuleType | None = None try: import psutil as psutil_module @@ -154,9 +154,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 = "" @@ -164,8 +162,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. @@ -189,7 +187,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: @@ -259,7 +257,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), @@ -533,7 +531,7 @@ def _build_resource_detectors() -> list["ResourceDetector"]: def get_aggregated_resources( detectors: Sequence["ResourceDetector"], - initial_resource: typing.Optional[Resource] = None, + 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 5ff90224a4..bdbfd245b2 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py @@ -12,22 +12,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 @@ -95,7 +92,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. @@ -169,7 +166,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) @@ -273,7 +270,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 @@ -321,7 +318,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() @@ -357,8 +354,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 @@ -406,18 +403,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 @@ -458,7 +455,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 @@ -470,15 +467,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 @@ -505,14 +502,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)}" @@ -550,7 +547,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)}", @@ -560,13 +557,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, @@ -579,7 +576,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 @@ -640,14 +637,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( @@ -716,8 +713,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 @@ -796,22 +793,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({}) @@ -899,7 +896,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, @@ -957,8 +954,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: @@ -970,7 +967,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.") @@ -996,8 +993,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 @@ -1025,9 +1022,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(): @@ -1051,7 +1048,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.""" @@ -1105,16 +1102,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 @@ -1139,11 +1135,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, @@ -1169,11 +1165,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: @@ -1284,17 +1280,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() @@ -1361,9 +1357,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 3e9ad3b7e5..7c5c4e10d0 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 @@ -3,7 +3,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 581a1b5609..fd2dbdb4b7 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 @@ -3,7 +3,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 4a0d7fb790..2651599284 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_composable.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_composable.py @@ -3,8 +3,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 2fb13ed3d1..69e10f58ad 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 @@ -3,7 +3,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 c25f59fe88..747c73aa7d 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 @@ -3,7 +3,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 f0ef137550..7a9ec41684 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_sampler.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_sampler.py @@ -3,7 +3,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 8816bcfbb1..ea0a4fb569 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 @@ -3,8 +3,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 e382630a2c..951d305d38 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 @@ -3,7 +3,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 a88af539bc..703a0b087b 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py @@ -98,7 +98,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 @@ -214,7 +214,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 071d9f6458..25a6629465 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 @@ -17,7 +17,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() @@ -26,7 +26,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 77dfcec2ba..27cd4a0d62 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/sampling.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/sampling.py @@ -124,9 +124,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 @@ -191,9 +192,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 @@ -214,9 +215,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: @@ -275,9 +276,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 @@ -330,9 +331,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( @@ -434,7 +435,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 a76a66f5ca..c753a78d53 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/util/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/util/__init__.py @@ -6,7 +6,6 @@ import threading from collections import deque from collections.abc import MutableMapping, Sequence -from typing import Optional from typing_extensions import deprecated @@ -40,7 +39,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() @@ -99,7 +98,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 00d1e7cfd5..53d372afba 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 da9d65690f..d431495588 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/util/_configurator.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/util/_configurator.py @@ -1,6 +1,7 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 -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 d46701f7d8..fc408e431e 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/util/instrumentation.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/util/instrumentation.py @@ -1,13 +1,17 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 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 ( # TODO: see if we can remove F401 when using new sphinx version # noqa: F401 # pylint: disable=unused-import + AnyValue, + Attributes, + _ExtendedAttributes, +) class InstrumentationInfo: @@ -25,8 +29,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 @@ -57,11 +61,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 @@ -82,9 +86,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 @@ -130,11 +134,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 @@ -145,7 +149,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 4efc84549f..07cae278b0 100644 --- a/opentelemetry-sdk/tests/logs/test_export.py +++ b/opentelemetry-sdk/tests/logs/test_export.py @@ -8,10 +8,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 e4e947e83f..a0fedc371c 100644 --- a/opentelemetry-sdk/tests/metrics/integration_test/test_cpu_time.py +++ b/opentelemetry-sdk/tests/metrics/integration_test/test_cpu_time.py @@ -3,7 +3,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 @@ -41,7 +41,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 642f621fe9..e8eda4dec1 100644 --- a/opentelemetry-sdk/tests/metrics/integration_test/test_provider_shutdown.py +++ b/opentelemetry-sdk/tests/metrics/integration_test/test_provider_shutdown.py @@ -4,7 +4,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 333fdd090b..1f11393cee 100644 --- a/opentelemetry-sdk/tests/metrics/test_aggregation.py +++ b/opentelemetry-sdk/tests/metrics/test_aggregation.py @@ -5,7 +5,6 @@ from math import inf from time import sleep, time_ns -from typing import Union from unittest import TestCase from unittest.mock import Mock @@ -44,7 +43,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 835031c6e1..f205c253aa 100644 --- a/opentelemetry-sdk/tests/metrics/test_backward_compat.py +++ b/opentelemetry-sdk/tests/metrics/test_backward_compat.py @@ -14,7 +14,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 2f6d6c1b7b..48fd681045 100644 --- a/opentelemetry-sdk/tests/metrics/test_metric_reader.py +++ b/opentelemetry-sdk/tests/metrics/test_metric_reader.py @@ -3,7 +3,7 @@ # pylint: disable=protected-access -from typing import Dict, Iterable +from collections.abc import Iterable from unittest import TestCase from unittest.mock import patch @@ -43,8 +43,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 89573734dd..beb8dbb2f2 100644 --- a/opentelemetry-sdk/tests/metrics/test_metrics.py +++ b/opentelemetry-sdk/tests/metrics/test_metrics.py @@ -4,11 +4,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 4122664755..2ced7feae8 100644 --- a/opentelemetry-sdk/tests/metrics/test_periodic_exporting_metric_reader.py +++ b/opentelemetry-sdk/tests/metrics/test_periodic_exporting_metric_reader.py @@ -8,7 +8,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 @@ -80,8 +80,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 718bd45c1d..729a04486f 100644 --- a/opentelemetry-sdk/tests/metrics/test_view_instrument_match.py +++ b/opentelemetry-sdk/tests/metrics/test_view_instrument_match.py @@ -4,8 +4,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 @@ -41,9 +41,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 0d3587f23c..668bd8e577 100644 --- a/opentelemetry-sdk/tests/test_configurator.py +++ b/opentelemetry-sdk/tests/test_configurator.py @@ -7,9 +7,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 @@ -262,7 +262,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 482d52e1f4..1d33a1a2c2 100644 --- a/opentelemetry-sdk/tests/trace/test_sampling.py +++ b/opentelemetry-sdk/tests/trace/test_sampling.py @@ -3,7 +3,6 @@ import contextlib import sys -import typing import unittest from opentelemetry import context as context_api @@ -56,7 +55,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 00106d29cd..6a80f83160 100644 --- a/opentelemetry-sdk/tests/trace/test_span_processor.py +++ b/opentelemetry-sdk/tests/trace/test_span_processor.py @@ -6,11 +6,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 @@ -40,7 +38,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)) @@ -262,9 +260,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 e2c40adac8..b98587da97 100644 --- a/opentelemetry-sdk/tests/trace/test_trace.py +++ b/opentelemetry-sdk/tests/trace/test_trace.py @@ -13,7 +13,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 @@ -1561,7 +1560,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 f6c45ef1ca..3c4de0cbf0 100644 --- a/propagator/opentelemetry-propagator-b3/src/opentelemetry/propagators/b3/__init__.py +++ b/propagator/opentelemetry-propagator-b3/src/opentelemetry/propagators/b3/__init__.py @@ -38,7 +38,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: @@ -119,7 +119,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) @@ -140,7 +140,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, @@ -158,7 +158,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) @@ -178,7 +178,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} @@ -192,7 +192,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 069f751a82..5255169522 100644 --- a/propagator/opentelemetry-propagator-jaeger/src/opentelemetry/propagators/jaeger/__init__.py +++ b/propagator/opentelemetry-propagator-jaeger/src/opentelemetry/propagators/jaeger/__init__.py @@ -30,7 +30,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: @@ -61,7 +61,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) @@ -98,7 +98,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): @@ -123,7 +123,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) @@ -131,7 +131,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) @@ -152,9 +152,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 4e4257ceac..4d7cadd057 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 5c3c4d2fae..c4d66e13da 100644 --- a/shim/opentelemetry-opencensus-shim/src/opentelemetry/shim/opencensus/_patch.py +++ b/shim/opentelemetry-opencensus-shim/src/opentelemetry/shim/opencensus/_patch.py @@ -3,7 +3,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 @@ -17,7 +16,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 81bfdb7ab8..3a3ab12611 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 @@ -77,7 +77,7 @@ import logging from types import TracebackType -from typing import Type, TypeVar +from typing import TypeVar from opentracing import ( Format, @@ -414,7 +414,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 3d7f781b59..25f6f35cf4 100644 --- a/tests/opentelemetry-test-utils/src/opentelemetry/test/concurrency_test.py +++ b/tests/opentelemetry-test-utils/src/opentelemetry/test/concurrency_test.py @@ -4,8 +4,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") @@ -55,11 +56,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 e2e003b6bb..c2de0b7c65 100644 --- a/tests/opentelemetry-test-utils/src/opentelemetry/test/metrictestutil.py +++ b/tests/opentelemetry-test-utils/src/opentelemetry/test/metrictestutil.py @@ -2,8 +2,6 @@ # SPDX-License-Identifier: Apache-2.0 -from typing import Optional - from opentelemetry.attributes import BoundedAttributes from opentelemetry.sdk.metrics.export import ( AggregationTemporality, @@ -97,8 +95,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 937bcb441f..09378aa1fe 100644 --- a/tests/opentelemetry-test-utils/src/opentelemetry/test/mock_textmap.py +++ b/tests/opentelemetry-test-utils/src/opentelemetry/test/mock_textmap.py @@ -1,7 +1,6 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 -import typing from opentelemetry import trace from opentelemetry.context import Context @@ -25,7 +24,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() @@ -33,7 +32,7 @@ def extract( def inject( self, carrier: CarrierT, - context: typing.Optional[Context] = None, + context: Context | None = None, setter: Setter = default_setter, ) -> None: return None @@ -52,7 +51,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: @@ -77,7 +76,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 ef4399f2df..3cd1b93837 100644 --- a/tests/opentelemetry-test-utils/src/opentelemetry/test/test_base.py +++ b/tests/opentelemetry-test-utils/src/opentelemetry/test/test_base.py @@ -3,8 +3,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 @@ -107,7 +107,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: @@ -131,7 +131,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: @@ -166,7 +166,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) @@ -181,7 +181,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 @@ -219,7 +219,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: