diff --git a/CHANGELOG.md b/CHANGELOG.md index d3781c7fb0e..09d23866d2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +- Enabled the flake8-type-checking plugin rules for ruff linter. These rules do not allow the import of python objects outside the type-checking block, if they are only used for type annotations and are not used at runtime. ([#5029](https://github.com/open-telemetry/opentelemetry-python/pull/5029)) - `opentelemetry-sdk`: Add `process` resource detector support to declarative file configuration via `detection_development.detectors[].process` ([#5001](https://github.com/open-telemetry/opentelemetry-python/pull/5001)) - `opentelemetry-sdk`: Add shared `_parse_headers` helper for declarative config OTLP exporters 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 5893dbd4453..eadd2961ce8 100644 --- a/codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/generator.py +++ b/codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/generator.py @@ -18,9 +18,8 @@ import logging from collections import defaultdict -from collections.abc import Iterable from pathlib import Path -from typing import Callable, Final, Optional, Set +from typing import TYPE_CHECKING, Callable, Final, Optional, Set from google.protobuf import descriptor_pb2 as descriptor from google.protobuf.compiler import plugin_pb2 as plugin @@ -37,6 +36,9 @@ from opentelemetry.codegen.json.version import __version__ as GENERATOR_VERSION from opentelemetry.codegen.json.writer import CodeWriter +if TYPE_CHECKING: + from collections.abc import Iterable + _logger = logging.getLogger(__name__) CODEC_MODULE_NAME: Final[str] = "_json_codec" diff --git a/codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/writer.py b/codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/writer.py index 687de172d5b..aafc287d35d 100644 --- a/codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/writer.py +++ b/codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/writer.py @@ -14,9 +14,11 @@ from __future__ import annotations -from collections.abc import Iterable from contextlib import contextmanager -from typing import Any, Generator, Optional, Union +from typing import TYPE_CHECKING, Any, Generator, Optional, Union + +if TYPE_CHECKING: + from collections.abc import Iterable # pylint: disable-next=too-many-public-methods diff --git a/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_internal/__init__.py b/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_internal/__init__.py index f1abcfc80af..5da0b750d43 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 @@ -18,6 +18,7 @@ import logging from collections.abc import Sequence from typing import ( + TYPE_CHECKING, Any, Callable, Dict, @@ -41,9 +42,11 @@ from opentelemetry.proto.resource.v1.resource_pb2 import ( Resource as PB2Resource, ) -from opentelemetry.sdk.trace import Resource -from opentelemetry.sdk.util.instrumentation import InstrumentationScope -from opentelemetry.util.types import _ExtendedAttributes + +if TYPE_CHECKING: + from opentelemetry.sdk.trace import Resource + from opentelemetry.sdk.util.instrumentation import InstrumentationScope + from opentelemetry.util.types import _ExtendedAttributes _logger = logging.getLogger(__name__) 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 af77f6d1239..bded41e9636 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 @@ -16,10 +16,9 @@ from dataclasses import replace from logging import getLogger from os import environ -from typing import Iterable, List, Tuple, Union +from typing import TYPE_CHECKING, Iterable, List, Tuple, Union from typing import Sequence as TypingSequence -from grpc import ChannelCredentials, Compression from opentelemetry.exporter.otlp.proto.common._internal.metrics_encoder import ( OTLPMetricExporterMixin, ) @@ -53,7 +52,6 @@ OTEL_EXPORTER_OTLP_METRICS_INSECURE, OTEL_EXPORTER_OTLP_METRICS_TIMEOUT, ) -from opentelemetry.sdk.metrics._internal.aggregation import Aggregation from opentelemetry.sdk.metrics.export import ( # noqa: F401 AggregationTemporality, DataPointT, @@ -73,6 +71,10 @@ Histogram as HistogramType, ) +if TYPE_CHECKING: + from grpc import ChannelCredentials, Compression + from opentelemetry.sdk.metrics._internal.aggregation import Aggregation + _logger = getLogger(__name__) 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 c1d51e3fd36..cc5fa9b55e5 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 @@ -21,6 +21,7 @@ from os import environ from time import time from typing import ( # noqa: F401 + TYPE_CHECKING, Any, Callable, Dict, @@ -62,9 +63,6 @@ ) from opentelemetry.proto.metrics.v1 import metrics_pb2 as pb2 from opentelemetry.proto.resource.v1.resource_pb2 import Resource # noqa: F401 -from opentelemetry.proto.resource.v1.resource_pb2 import ( - Resource as PB2Resource, -) from opentelemetry.sdk.environment_variables import ( _OTEL_PYTHON_EXPORTER_OTLP_HTTP_METRICS_CREDENTIAL_PROVIDER, OTEL_EXPORTER_OTLP_CERTIFICATE, @@ -82,7 +80,6 @@ OTEL_EXPORTER_OTLP_METRICS_TIMEOUT, OTEL_EXPORTER_OTLP_TIMEOUT, ) -from opentelemetry.sdk.metrics._internal.aggregation import Aggregation from opentelemetry.sdk.metrics.export import ( # noqa: F401 AggregationTemporality, Gauge, @@ -94,9 +91,15 @@ from opentelemetry.sdk.metrics.export import ( # noqa: F401 Histogram as HistogramType, ) -from opentelemetry.sdk.resources import Resource as SDKResource from opentelemetry.util.re import parse_env_headers +if TYPE_CHECKING: + from opentelemetry.proto.resource.v1.resource_pb2 import ( + Resource as PB2Resource, + ) + from opentelemetry.sdk.metrics._internal.aggregation import Aggregation + from opentelemetry.sdk.resources import Resource as SDKResource + _logger = logging.getLogger(__name__) diff --git a/exporter/opentelemetry-exporter-prometheus/src/opentelemetry/exporter/prometheus/__init__.py b/exporter/opentelemetry-exporter-prometheus/src/opentelemetry/exporter/prometheus/__init__.py index 608d8f6d302..a73ffb8e14c 100644 --- a/exporter/opentelemetry-exporter-prometheus/src/opentelemetry/exporter/prometheus/__init__.py +++ b/exporter/opentelemetry-exporter-prometheus/src/opentelemetry/exporter/prometheus/__init__.py @@ -67,7 +67,7 @@ from json import dumps from logging import getLogger from os import environ -from typing import Deque, Dict, Iterable, Sequence, Tuple, Union +from typing import TYPE_CHECKING, Deque, Dict, Iterable, Sequence, Tuple, Union from prometheus_client import start_http_server from prometheus_client.core import ( @@ -108,7 +108,9 @@ from opentelemetry.semconv._incubating.attributes.otel_attributes import ( OtelComponentTypeValues, ) -from opentelemetry.util.types import Attributes + +if TYPE_CHECKING: + from opentelemetry.util.types import Attributes _logger = getLogger(__name__) diff --git a/opentelemetry-api/src/opentelemetry/_events/__init__.py b/opentelemetry-api/src/opentelemetry/_events/__init__.py index d86fd12721d..f7ef8833092 100644 --- a/opentelemetry-api/src/opentelemetry/_events/__init__.py +++ b/opentelemetry-api/src/opentelemetry/_events/__init__.py @@ -15,7 +15,7 @@ from abc import ABC, abstractmethod from logging import getLogger from os import environ -from typing import Optional, cast +from typing import TYPE_CHECKING, Optional, cast from typing_extensions import deprecated @@ -24,11 +24,13 @@ from opentelemetry.environment_variables import ( _OTEL_PYTHON_EVENT_LOGGER_PROVIDER, ) -from opentelemetry.trace.span import TraceFlags from opentelemetry.util._once import Once from opentelemetry.util._providers import _load_provider from opentelemetry.util.types import AnyValue, _ExtendedAttributes +if TYPE_CHECKING: + from opentelemetry.trace.span import TraceFlags + _logger = getLogger(__name__) diff --git a/opentelemetry-api/src/opentelemetry/_logs/_internal/__init__.py b/opentelemetry-api/src/opentelemetry/_logs/_internal/__init__.py index 780bcb4843d..f67cff67694 100644 --- a/opentelemetry-api/src/opentelemetry/_logs/_internal/__init__.py +++ b/opentelemetry-api/src/opentelemetry/_logs/_internal/__init__.py @@ -39,19 +39,21 @@ from logging import getLogger from os import environ from time import time_ns -from typing import Optional, cast, overload +from typing import TYPE_CHECKING, Optional, cast, overload from typing_extensions import deprecated -from opentelemetry._logs.severity import SeverityNumber from opentelemetry.context import get_current -from opentelemetry.context.context import Context from opentelemetry.environment_variables import _OTEL_PYTHON_LOGGER_PROVIDER from opentelemetry.trace import get_current_span -from opentelemetry.trace.span import TraceFlags from opentelemetry.util._once import Once from opentelemetry.util._providers import _load_provider -from opentelemetry.util.types import AnyValue, _ExtendedAttributes + +if TYPE_CHECKING: + from opentelemetry._logs.severity import SeverityNumber + from opentelemetry.context.context import Context + from opentelemetry.trace.span import TraceFlags + from opentelemetry.util.types import AnyValue, _ExtendedAttributes _logger = getLogger(__name__) diff --git a/opentelemetry-api/src/opentelemetry/context/__init__.py b/opentelemetry-api/src/opentelemetry/context/__init__.py index 9287d5b401e..a36e5ca5ab4 100644 --- a/opentelemetry-api/src/opentelemetry/context/__init__.py +++ b/opentelemetry-api/src/opentelemetry/context/__init__.py @@ -16,7 +16,6 @@ import logging import typing -from contextvars import Token from os import environ from uuid import uuid4 @@ -25,6 +24,9 @@ from opentelemetry.environment_variables import OTEL_PYTHON_CONTEXT from opentelemetry.util._importlib_metadata import entry_points +if typing.TYPE_CHECKING: + from contextvars import Token + logger = logging.getLogger(__name__) diff --git a/opentelemetry-api/src/opentelemetry/context/context.py b/opentelemetry-api/src/opentelemetry/context/context.py index c1ef9cfbb6b..32593b2fd05 100644 --- a/opentelemetry-api/src/opentelemetry/context/context.py +++ b/opentelemetry-api/src/opentelemetry/context/context.py @@ -16,7 +16,9 @@ import typing from abc import ABC, abstractmethod -from contextvars import Token + +if typing.TYPE_CHECKING: + from contextvars import Token class Context(typing.Dict[str, object]): diff --git a/opentelemetry-api/src/opentelemetry/metrics/_internal/instrument.py b/opentelemetry-api/src/opentelemetry/metrics/_internal/instrument.py index cfd7a1526c6..0efea702661 100644 --- a/opentelemetry-api/src/opentelemetry/metrics/_internal/instrument.py +++ b/opentelemetry-api/src/opentelemetry/metrics/_internal/instrument.py @@ -20,6 +20,7 @@ from logging import getLogger from re import compile as re_compile from typing import ( + TYPE_CHECKING, Callable, Dict, Generator, @@ -32,13 +33,15 @@ ) # pylint: disable=unused-import; needed for typing and sphinx -from opentelemetry import metrics from opentelemetry.context import Context from opentelemetry.metrics._internal.observation import Observation from opentelemetry.util.types import ( Attributes, ) +if TYPE_CHECKING: + from opentelemetry import metrics + _logger = getLogger(__name__) _name_regex = re_compile(r"[a-zA-Z][-_./a-zA-Z0-9]{0,254}") diff --git a/opentelemetry-api/src/opentelemetry/util/_providers.py b/opentelemetry-api/src/opentelemetry/util/_providers.py index b748eadfe0a..030ad4a2a5d 100644 --- a/opentelemetry-api/src/opentelemetry/util/_providers.py +++ b/opentelemetry-api/src/opentelemetry/util/_providers.py @@ -32,12 +32,12 @@ def _load_provider( ) -> Provider: # type: ignore[type-var] try: provider_name = cast( - str, + "str", environ.get(provider_environment_variable, f"default_{provider}"), ) return cast( - Provider, + "Provider", next( # type: ignore iter( # type: ignore entry_points( # type: ignore diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py index a982b9de71c..786cc137fbf 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py @@ -25,7 +25,16 @@ import warnings from abc import ABC, abstractmethod from os import environ -from typing import Any, Callable, Mapping, Protocol, Sequence, Type, Union +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Mapping, + Protocol, + Sequence, + Type, + Union, +) from typing_extensions import Literal @@ -77,6 +86,10 @@ from opentelemetry.trace import set_tracer_provider from opentelemetry.util._importlib_metadata import entry_points +if TYPE_CHECKING: + from opentelemetry.sdk.metrics._internal import _MeterConfiguratorT + + _EXPORTER_OTLP = "otlp" _EXPORTER_OTLP_PROTO_GRPC = "otlp_proto_grpc" _EXPORTER_OTLP_PROTO_HTTP = "otlp_proto_http" diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_propagator.py b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_propagator.py index 60cc904f137..7e6c8312249 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_propagator.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_configuration/_propagator.py @@ -14,24 +14,26 @@ from __future__ import annotations -from typing import Optional +from typing import TYPE_CHECKING, Optional from opentelemetry.baggage.propagation import W3CBaggagePropagator from opentelemetry.propagate import set_global_textmap from opentelemetry.propagators.composite import CompositePropagator -from opentelemetry.propagators.textmap import TextMapPropagator from opentelemetry.sdk._configuration._exceptions import ConfigurationError -from opentelemetry.sdk._configuration.models import ( - Propagator as PropagatorConfig, -) -from opentelemetry.sdk._configuration.models import ( - TextMapPropagator as TextMapPropagatorConfig, -) from opentelemetry.trace.propagation.tracecontext import ( TraceContextTextMapPropagator, ) from opentelemetry.util._importlib_metadata import entry_points +if TYPE_CHECKING: + from opentelemetry.propagators.textmap import TextMapPropagator + from opentelemetry.sdk._configuration.models import ( + Propagator as PropagatorConfig, + ) + from opentelemetry.sdk._configuration.models import ( + TextMapPropagator as TextMapPropagatorConfig, + ) + def _load_entry_point_propagator(name: str) -> TextMapPropagator: """Load a propagator by name from the opentelemetry_propagator entry point group.""" diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py index d6a4aa16ab0..b26f268a902 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py @@ -26,7 +26,15 @@ from os import environ from threading import Lock from time import time_ns -from typing import Any, Callable, Tuple, Union, cast, overload # noqa +from typing import ( # noqa + TYPE_CHECKING, + Any, + Callable, + Tuple, + Union, + cast, + overload, +) from typing_extensions import deprecated @@ -41,7 +49,6 @@ ) from opentelemetry.attributes import _VALID_ANY_VALUE_TYPES, BoundedAttributes from opentelemetry.context import get_current -from opentelemetry.context.context import Context from opentelemetry.metrics import MeterProvider, get_meter_provider from opentelemetry.sdk._logs._internal._logger_metrics import LoggerMetrics from opentelemetry.sdk.environment_variables import ( @@ -58,7 +65,10 @@ format_span_id, format_trace_id, ) -from opentelemetry.util.types import AnyValue, _ExtendedAttributes + +if TYPE_CHECKING: + from opentelemetry.context.context import Context + from opentelemetry.util.types import AnyValue, _ExtendedAttributes _DEFAULT_OTEL_ATTRIBUTE_COUNT_LIMIT = 128 _ENV_VALUE_UNSET = "" diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/__init__.py index 5ba1fd22f34..321d98c15c4 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/__init__.py @@ -19,10 +19,9 @@ from os import environ from threading import Lock from time import time_ns -from typing import Callable, Optional, Sequence +from typing import TYPE_CHECKING, Callable, Optional, Sequence # This kind of import is needed to avoid Sphinx errors. -import opentelemetry.sdk.metrics from opentelemetry.metrics import Counter as APICounter from opentelemetry.metrics import Histogram as APIHistogram from opentelemetry.metrics import Meter as APIMeter @@ -72,6 +71,9 @@ Attributes, ) +if TYPE_CHECKING: + import opentelemetry.sdk.metrics + _logger = getLogger(__name__) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/__init__.py index 66f327306a6..7f71b3bdb72 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/__init__.py @@ -23,12 +23,11 @@ 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, TYPE_CHECKING, Callable, Iterable, Optional from typing_extensions import final # This kind of import is needed to avoid Sphinx errors. -import opentelemetry.sdk.metrics._internal from opentelemetry.context import ( _SUPPRESS_INSTRUMENTATION_KEY, attach, @@ -61,7 +60,6 @@ _ObservableUpDownCounter, _UpDownCounter, ) -from opentelemetry.sdk.metrics._internal.point import MetricsData from opentelemetry.semconv._incubating.attributes.otel_attributes import ( OtelComponentTypeValues, ) @@ -69,6 +67,10 @@ from ._metric_reader_metrics import MetricReaderMetrics +if TYPE_CHECKING: + import opentelemetry.sdk.metrics._internal + from opentelemetry.sdk.metrics._internal.point import MetricsData + _logger = getLogger(__name__) 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 287e505b040..49c310f00a1 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/measurement_consumer.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/measurement_consumer.py @@ -17,12 +17,11 @@ from abc import ABC, abstractmethod from threading import Lock from time import time_ns -from typing import List, Mapping, Optional +from typing import TYPE_CHECKING, List, Mapping, Optional # This kind of import is needed to avoid Sphinx errors. import opentelemetry.sdk.metrics import opentelemetry.sdk.metrics._internal.instrument -import opentelemetry.sdk.metrics._internal.sdk_configuration from opentelemetry.metrics._internal.instrument import CallbackOptions from opentelemetry.sdk.metrics._internal.exceptions import MetricsTimeoutError from opentelemetry.sdk.metrics._internal.measurement import Measurement @@ -31,6 +30,9 @@ ) from opentelemetry.sdk.metrics._internal.point import MetricsData +if TYPE_CHECKING: + import opentelemetry.sdk.metrics._internal.sdk_configuration + class MeasurementConsumer(ABC): @abstractmethod 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 317fda0b420..739ba6ca7cb 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/metric_reader_storage.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/metric_reader_storage.py @@ -15,7 +15,7 @@ from logging import getLogger from threading import RLock from time import time_ns -from typing import Dict, List, Optional +from typing import TYPE_CHECKING, Dict, List, Optional from opentelemetry.metrics import ( Asynchronous, @@ -51,7 +51,9 @@ SdkConfiguration, ) from opentelemetry.sdk.metrics._internal.view import View -from opentelemetry.sdk.util.instrumentation import InstrumentationScope + +if TYPE_CHECKING: + from opentelemetry.sdk.util.instrumentation import InstrumentationScope _logger = getLogger(__name__) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/point.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/point.py index 8c7e3469772..044f2d8785e 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/point.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/point.py @@ -16,15 +16,17 @@ from dataclasses import asdict, dataclass, field from json import dumps, loads -from typing import Optional, Sequence, Union +from typing import TYPE_CHECKING, Optional, Sequence, Union # This kind of import is needed to avoid Sphinx errors. -import opentelemetry.sdk.metrics._internal from opentelemetry.sdk.metrics._internal.exemplar import Exemplar from opentelemetry.sdk.resources import Resource from opentelemetry.sdk.util.instrumentation import InstrumentationScope from opentelemetry.util.types import Attributes +if TYPE_CHECKING: + import opentelemetry.sdk.metrics._internal + @dataclass(frozen=True) class NumberDataPoint: 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 3d88facb0c3..09002f31c55 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/sdk_configuration.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/sdk_configuration.py @@ -15,11 +15,13 @@ # pylint: disable=unused-import from dataclasses import dataclass -from typing import Sequence +from typing import TYPE_CHECKING, Sequence # This kind of import is needed to avoid Sphinx errors. import opentelemetry.sdk.metrics -import opentelemetry.sdk.resources + +if TYPE_CHECKING: + import opentelemetry.sdk.resources @dataclass diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py index a04d27e9ab1..3485e4e461a 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/resources/__init__.py @@ -237,7 +237,7 @@ def create( if not resource.attributes.get(SERVICE_NAME, None): default_service_name = "unknown_service" process_executable_name = cast( - Optional[str], + "Optional[str]", resource.attributes.get(PROCESS_EXECUTABLE_NAME, None), ) if process_executable_name: diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py index 2599f23fe78..2a876ade90e 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py @@ -884,7 +884,7 @@ def _new_links(self, links: Sequence[trace_api.Link]): return BoundedList.from_seq(self._limits.max_links, valid_links) def get_span_context(self) -> trace_api.SpanContext: - return typing.cast(trace_api.SpanContext, self._context) + return typing.cast("trace_api.SpanContext", self._context) def set_attributes( self, attributes: Mapping[str, types.AttributeValue] diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_always_off.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_always_off.py index eaafe164161..e86a42a57ed 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_always_off.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_always_off.py @@ -14,15 +14,16 @@ from __future__ import annotations -from typing import Sequence - -from opentelemetry.context import Context -from opentelemetry.trace import Link, SpanKind, TraceState -from opentelemetry.util.types import Attributes +from typing import TYPE_CHECKING, Sequence from ._composable import ComposableSampler, SamplingIntent from ._util import INVALID_THRESHOLD +if TYPE_CHECKING: + from opentelemetry.context import Context + from opentelemetry.trace import Link, SpanKind, TraceState + from opentelemetry.util.types import Attributes + _intent = SamplingIntent(threshold=INVALID_THRESHOLD, threshold_reliable=False) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_always_on.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_always_on.py index 88ac61c5d37..ae8ceac579e 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_always_on.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_always_on.py @@ -14,15 +14,16 @@ from __future__ import annotations -from typing import Sequence - -from opentelemetry.context import Context -from opentelemetry.trace import Link, SpanKind, TraceState -from opentelemetry.util.types import Attributes +from typing import TYPE_CHECKING, Sequence from ._composable import ComposableSampler, SamplingIntent from ._util import MIN_THRESHOLD +if TYPE_CHECKING: + from opentelemetry.context import Context + from opentelemetry.trace import Link, SpanKind, TraceState + from opentelemetry.util.types import Attributes + _intent = SamplingIntent(threshold=MIN_THRESHOLD) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_composable.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_composable.py index 5829601e30d..1e6081e18b6 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_composable.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_composable.py @@ -15,11 +15,12 @@ from __future__ import annotations from dataclasses import dataclass, field -from typing import Callable, Protocol, Sequence +from typing import TYPE_CHECKING, Callable, Protocol, Sequence -from opentelemetry.context import Context -from opentelemetry.trace import Link, SpanKind, TraceState -from opentelemetry.util.types import Attributes +if TYPE_CHECKING: + from opentelemetry.context import Context + from opentelemetry.trace import Link, SpanKind, TraceState + from opentelemetry.util.types import Attributes @dataclass(frozen=True) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_parent_threshold.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_parent_threshold.py index 83b7b7d3005..09c1e7ae220 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_parent_threshold.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_parent_threshold.py @@ -14,11 +14,9 @@ from __future__ import annotations -from typing import Sequence +from typing import TYPE_CHECKING, Sequence -from opentelemetry.context import Context from opentelemetry.trace import Link, SpanKind, TraceState, get_current_span -from opentelemetry.util.types import Attributes from ._composable import ComposableSampler, SamplingIntent from ._trace_state import OtelTraceState @@ -28,6 +26,10 @@ is_valid_threshold, ) +if TYPE_CHECKING: + from opentelemetry.context import Context + from opentelemetry.util.types import Attributes + class _ComposableParentThreshold(ComposableSampler): def __init__(self, root_sampler: ComposableSampler): diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_rule_based.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_rule_based.py index f03e3086527..0406f20f67f 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_rule_based.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_rule_based.py @@ -14,15 +14,16 @@ from __future__ import annotations -from typing import Protocol, Sequence - -from opentelemetry.context import Context -from opentelemetry.trace import Link, SpanKind, TraceState -from opentelemetry.util.types import AnyValue, Attributes +from typing import TYPE_CHECKING, Protocol, Sequence from ._composable import ComposableSampler, SamplingIntent from ._util import INVALID_THRESHOLD +if TYPE_CHECKING: + from opentelemetry.context import Context + from opentelemetry.trace import Link, SpanKind, TraceState + from opentelemetry.util.types import AnyValue, Attributes + class PredicateT(Protocol): def __call__( diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_sampler.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_sampler.py index 989cc36019d..3c91570e806 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_sampler.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_sampler.py @@ -14,17 +14,20 @@ from __future__ import annotations -from typing import Sequence +from typing import TYPE_CHECKING, Sequence -from opentelemetry.context import Context from opentelemetry.sdk.trace.sampling import Decision, Sampler, SamplingResult from opentelemetry.trace import Link, SpanKind, TraceState -from opentelemetry.util.types import Attributes -from ._composable import ComposableSampler, SamplingIntent from ._trace_state import OTEL_TRACE_STATE_KEY, OtelTraceState from ._util import INVALID_THRESHOLD, is_valid_random_value, is_valid_threshold +if TYPE_CHECKING: + from opentelemetry.context import Context + from opentelemetry.util.types import Attributes + + from ._composable import ComposableSampler, SamplingIntent + class _CompositeSampler(Sampler): def __init__(self, delegate: ComposableSampler): diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_trace_state.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_trace_state.py index bc06420f2a0..8cfd4abbced 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 @@ -15,9 +15,7 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Sequence - -from opentelemetry.trace import TraceState +from typing import TYPE_CHECKING, Sequence from ._util import ( INVALID_RANDOM_VALUE, @@ -27,6 +25,9 @@ is_valid_threshold, ) +if TYPE_CHECKING: + from opentelemetry.trace import TraceState + OTEL_TRACE_STATE_KEY = "ot" _TRACE_STATE_SIZE_LIMIT = 256 diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_traceid_ratio.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_traceid_ratio.py index d63b6f8a8d7..1cc85e81c52 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_traceid_ratio.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_sampling_experimental/_traceid_ratio.py @@ -14,16 +14,17 @@ from __future__ import annotations -from typing import Sequence - -from opentelemetry.context import Context -from opentelemetry.trace import Link, SpanKind, TraceState -from opentelemetry.util.types import Attributes +from typing import TYPE_CHECKING, Sequence from ._composable import ComposableSampler, SamplingIntent from ._trace_state import serialize_th from ._util import INVALID_THRESHOLD, MAX_THRESHOLD, calculate_threshold +if TYPE_CHECKING: + from opentelemetry.context import Context + from opentelemetry.trace import Link, SpanKind, TraceState + from opentelemetry.util.types import Attributes + class ComposableTraceIDRatioBased(ComposableSampler): _threshold: int diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_tracer_metrics.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_tracer_metrics.py index ad7de330c78..feebdba284f 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_tracer_metrics.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_tracer_metrics.py @@ -14,9 +14,8 @@ from __future__ import annotations -from collections.abc import Callable +from typing import TYPE_CHECKING -from opentelemetry import metrics as metrics_api from opentelemetry.sdk.trace.sampling import Decision from opentelemetry.semconv._incubating.attributes.otel_attributes import ( OTEL_SPAN_PARENT_ORIGIN, @@ -27,7 +26,12 @@ create_otel_sdk_span_live, create_otel_sdk_span_started, ) -from opentelemetry.trace.span import SpanContext + +if TYPE_CHECKING: + from collections.abc import Callable + + from opentelemetry import metrics as metrics_api + from opentelemetry.trace.span import SpanContext class TracerMetrics: diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/sampling.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/sampling.py index 68466eb1018..761771ac681 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/sampling.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/sampling.py @@ -137,7 +137,7 @@ def get_sampler(sampler_argument): import os from logging import getLogger from types import MappingProxyType -from typing import Optional, Sequence +from typing import TYPE_CHECKING, Optional, Sequence # pylint: disable=unused-import from opentelemetry.context import Context @@ -146,9 +146,11 @@ def get_sampler(sampler_argument): OTEL_TRACES_SAMPLER_ARG, ) from opentelemetry.trace import Link, SpanKind, get_current_span -from opentelemetry.trace.span import TraceState from opentelemetry.util.types import Attributes +if TYPE_CHECKING: + from opentelemetry.trace.span import TraceState + _logger = getLogger(__name__) diff --git a/opentelemetry-sdk/tests/metrics/exponential_histogram/test_exponential_bucket_histogram_aggregation.py b/opentelemetry-sdk/tests/metrics/exponential_histogram/test_exponential_bucket_histogram_aggregation.py index 820eb1070ab..6f92a1db8e2 100644 --- a/opentelemetry-sdk/tests/metrics/exponential_histogram/test_exponential_bucket_histogram_aggregation.py +++ b/opentelemetry-sdk/tests/metrics/exponential_histogram/test_exponential_bucket_histogram_aggregation.py @@ -23,6 +23,7 @@ from sys import float_info, maxsize from time import time_ns from types import MethodType +from typing import TYPE_CHECKING from unittest.mock import Mock, patch from opentelemetry.context import Context @@ -44,15 +45,17 @@ LogarithmMapping, ) from opentelemetry.sdk.metrics._internal.measurement import Measurement -from opentelemetry.sdk.metrics._internal.point import ( - ExponentialHistogramDataPoint, -) from opentelemetry.sdk.metrics._internal.view import _default_reservoir_factory from opentelemetry.sdk.metrics.view import ( ExponentialBucketHistogramAggregation, ) from opentelemetry.test import TestCase +if TYPE_CHECKING: + from opentelemetry.sdk.metrics._internal.point import ( + ExponentialHistogramDataPoint, + ) + def get_counts(buckets: Buckets) -> int: counts = [] diff --git a/opentelemetry-sdk/tests/metrics/test_periodic_exporting_metric_reader.py b/opentelemetry-sdk/tests/metrics/test_periodic_exporting_metric_reader.py index 3e47e577689..4ff5735bacb 100644 --- a/opentelemetry-sdk/tests/metrics/test_periodic_exporting_metric_reader.py +++ b/opentelemetry-sdk/tests/metrics/test_periodic_exporting_metric_reader.py @@ -348,7 +348,7 @@ def test_metric_reader_metrics(self): metric = reader_metrics[0] point = metric.data.data_points[0] - histogram = cast(HistogramDataPoint, point) + histogram = cast("HistogramDataPoint", point) self.assertEqual(histogram.count, 1) attrs = histogram.attributes assert attrs is not None diff --git a/opentelemetry-sdk/tests/test_configurator.py b/opentelemetry-sdk/tests/test_configurator.py index 720469c71f2..fba0f7eb312 100644 --- a/opentelemetry-sdk/tests/test_configurator.py +++ b/opentelemetry-sdk/tests/test_configurator.py @@ -20,14 +20,13 @@ import logging.config from logging import WARNING, getLogger from os import environ -from typing import Iterable, Optional, Sequence +from typing import TYPE_CHECKING, Iterable, Optional, Sequence from unittest import TestCase, mock from unittest.mock import Mock, patch from pytest import raises from opentelemetry import trace -from opentelemetry.context import Context from opentelemetry.environment_variables import OTEL_PYTHON_ID_GENERATOR from opentelemetry.sdk._configuration import ( _EXPORTER_OTLP, @@ -73,7 +72,6 @@ MetricExporter, MetricReader, ) -from opentelemetry.sdk.metrics.view import Aggregation from opentelemetry.sdk.resources import SERVICE_NAME, Resource from opentelemetry.sdk.trace import SpanProcessor, _RuleBasedTracerConfigurator from opentelemetry.sdk.trace.export import ( @@ -90,9 +88,13 @@ TraceIdRatioBased, ) from opentelemetry.test.mock_test_classes import IterEntryPoint -from opentelemetry.trace import Link, SpanKind -from opentelemetry.trace.span import TraceState -from opentelemetry.util.types import Attributes + +if TYPE_CHECKING: + from opentelemetry.context import Context + from opentelemetry.sdk.metrics.view import Aggregation + from opentelemetry.trace import Link, SpanKind + from opentelemetry.trace.span import TraceState + from opentelemetry.util.types import Attributes class Provider: diff --git a/pyproject.toml b/pyproject.toml index d6121f141b8..12f108901fa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -85,6 +85,7 @@ select = [ "PLE", # pylint error "Q", # flake8-quotes "G", # https://docs.astral.sh/ruff/rules/#flake8-logging-format-g + "TCH", # flake8-type-checking "UP011", # lru-cache-without-parameters "UP015", # redundant-open-modes "UP032", # f-string @@ -94,6 +95,14 @@ select = [ ignore = [ "E501", # line-too-long + + # flake8-type-checking rules: + # This rule enforces to add quotes for type aliases. + # This rule is unsafe as no static type checker can determine + # the exact behavior of runtime typing libraries. + "TC007", + # This rule is unstable and in preview + "TC008", ] [tool.ruff.lint.per-file-ignores] 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 7a3804acc81..79904031ce7 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 @@ -87,8 +87,7 @@ from __future__ import annotations import logging -from types import TracebackType -from typing import Type, TypeVar +from typing import TYPE_CHECKING, Type, TypeVar from opentracing import ( Format, @@ -124,7 +123,11 @@ ) from opentelemetry.trace import SpanContext as OtelSpanContext from opentelemetry.trace import Tracer as OtelTracer -from opentelemetry.util.types import Attributes + +if TYPE_CHECKING: + from types import TracebackType + + from opentelemetry.util.types import Attributes ValueT = TypeVar("ValueT", int, float, bool, str) logger = logging.getLogger(__name__)