From c3325cff131f365b1506d59baa8e193d54b2a68c Mon Sep 17 00:00:00 2001 From: Lukas Hering Date: Sun, 26 Apr 2026 23:18:39 -0400 Subject: [PATCH 1/7] feat: Add ability to selectively enable exporting of SDK internal metrics with the OTEL_PYTHON_SDK_METRIC_ENABLE environment variable --- CHANGELOG.md | 1 + .../otlp/proto/common/_exporter_metrics.py | 7 ++ .../exporter/otlp/proto/grpc/exporter.py | 7 ++ .../tests/test_otlp_exporter_mixin.py | 18 ++++- .../otlp/proto/http/_log_exporter/__init__.py | 7 ++ .../proto/http/metric_exporter/__init__.py | 10 +++ .../proto/http/trace_exporter/__init__.py | 7 ++ .../metrics/test_otlp_metrics_exporter.py | 4 + .../tests/test_proto_log_exporter.py | 3 + .../tests/test_proto_span_exporter.py | 14 ++++ .../sdk/_logs/_internal/_logger_metrics.py | 11 +++ .../_shared_internal/_processor_metrics.py | 19 ++++- .../sdk/environment_variables/__init__.py | 9 +++ .../sdk/environment_variables/_internal.py | 39 ++++++++++ .../export/_metric_reader_metrics.py | 11 +++ .../sdk/trace/_tracer_metrics.py | 14 ++++ opentelemetry-sdk/tests/logs/test_export.py | 3 + .../tests/logs/test_sdk_metrics.py | 18 +++++ .../test_periodic_exporting_metric_reader.py | 6 +- .../test_environment_variables_internal.py | 73 +++++++++++++++++++ .../tests/trace/export/test_export.py | 3 + .../tests/trace/test_sdk_metrics.py | 22 ++++++ 22 files changed, 300 insertions(+), 6 deletions(-) create mode 100644 opentelemetry-sdk/src/opentelemetry/sdk/environment_variables/_internal.py create mode 100644 opentelemetry-sdk/tests/test_environment_variables_internal.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 614f240d4ee..c401da3bf90 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#5120](https://github.com/open-telemetry/opentelemetry-python/pull/5120)) - Add WeaverLiveCheck test util ([#5088](https://github.com/open-telemetry/opentelemetry-python/pull/5088)) +- Add ability to configure exporting of SDK internal metrics with the `OTEL_PYTHON_SDK_METRICS_ENABLED` environment variable. ## Version 1.41.0/0.62b0 (2026-04-09) diff --git a/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_exporter_metrics.py b/exporter/opentelemetry-exporter-otlp-proto-common/src/opentelemetry/exporter/otlp/proto/common/_exporter_metrics.py index 96d12a8857d..55686a66e61 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 @@ -63,6 +63,8 @@ def __init__( signal: Literal["traces", "metrics", "logs"], endpoint: UrlParseResult, meter_provider: MeterProvider | None, + *, + disabled: bool = False, ) -> None: if signal == "traces": create_exported = create_otel_sdk_exporter_span_exported @@ -104,9 +106,14 @@ def __init__( self._inflight = create_inflight(meter) self._exported = create_exported(meter) self._duration = create_otel_sdk_exporter_operation_duration(meter) + self._disabled = disabled @contextmanager def export_operation(self, num_items: int) -> Iterator[ExportResult]: + if self._disabled: + yield ExportResult() + return + start_time = perf_counter() self._inflight.add(num_items, self._standard_attrs) diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/exporter.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/src/opentelemetry/exporter/otlp/proto/grpc/exporter.py index 3627db70581..971967a16de 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 @@ -103,6 +103,10 @@ OTEL_EXPORTER_OTLP_HEADERS, OTEL_EXPORTER_OTLP_INSECURE, OTEL_EXPORTER_OTLP_TIMEOUT, + OTEL_PYTHON_SDK_METRICS_ENABLED, +) +from opentelemetry.sdk.environment_variables._internal import ( + parse_boolean_environment_variable, ) from opentelemetry.sdk.metrics.export import MetricExportResult, MetricsData from opentelemetry.sdk.resources import Resource as SDKResource @@ -392,6 +396,9 @@ def __init__( signal, parsed_url, meter_provider, + disabled=not parse_boolean_environment_variable( + OTEL_PYTHON_SDK_METRICS_ENABLED + ), ) self._initialize_channel_and_stub() diff --git a/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/test_otlp_exporter_mixin.py b/exporter/opentelemetry-exporter-otlp-proto-grpc/tests/test_otlp_exporter_mixin.py index 87bd72c5550..ab609bff152 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 @@ -54,6 +54,7 @@ from opentelemetry.sdk.environment_variables import ( _OTEL_PYTHON_EXPORTER_OTLP_GRPC_CREDENTIAL_PROVIDER, OTEL_EXPORTER_OTLP_COMPRESSION, + OTEL_PYTHON_SDK_METRICS_ENABLED, ) from opentelemetry.sdk.metrics import MeterProvider from opentelemetry.sdk.metrics.export import InMemoryMetricReader @@ -387,13 +388,17 @@ def test_otlp_exporter_otlp_compression_envvar( ), ) + @patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) def test_shutdown(self): add_TraceServiceServicer_to_server( TraceServiceServicerWithExportParams(StatusCode.OK), self.server, ) + exporter = OTLPSpanExporterForTesting( + insecure=True, meter_provider=self.meter_provider + ) self.assertEqual( - self.exporter.export([self.span]), SpanExportResult.SUCCESS + exporter.export([self.span]), SpanExportResult.SUCCESS ) metrics_data = self.metric_reader.get_metrics_data() scope_metrics = metrics_data.resource_metrics[0].scope_metrics[0] @@ -415,10 +420,10 @@ def test_shutdown(self): metrics[2].data.data_points[0].attributes ) - self.exporter.shutdown() + exporter.shutdown() with self.assertLogs(level=WARNING) as warning: self.assertEqual( - self.exporter.export([self.span]), SpanExportResult.FAILURE + exporter.export([self.span]), SpanExportResult.FAILURE ) self.assertEqual( warning.records[0].message, @@ -480,6 +485,7 @@ def test_export_over_closed_grpc_channel(self): system() == "Windows", "For gRPC + windows there's some added delay in the RPCs which breaks the assertion over amount of time passed.", ) + @patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) def test_retry_info_is_respected(self): mock_trace_service = TraceServiceServicerWithExportParams( StatusCode.UNAVAILABLE, @@ -622,7 +628,11 @@ def test_otlp_headers_from_env(self): (), ) + @patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) def test_permanent_failure(self): + exporter = OTLPSpanExporterForTesting( + insecure=True, meter_provider=self.meter_provider + ) with self.assertLogs(level=WARNING) as warning: add_TraceServiceServicer_to_server( TraceServiceServicerWithExportParams( @@ -631,7 +641,7 @@ def test_permanent_failure(self): self.server, ) self.assertEqual( - self.exporter.export([self.span]), SpanExportResult.FAILURE + exporter.export([self.span]), SpanExportResult.FAILURE ) self.assertEqual( warning.records[-1].message, diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/_log_exporter/__init__.py b/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/_log_exporter/__init__.py index 6032433dd12..fb46ce36a38 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 @@ -61,6 +61,10 @@ OTEL_EXPORTER_OTLP_LOGS_HEADERS, OTEL_EXPORTER_OTLP_LOGS_TIMEOUT, OTEL_EXPORTER_OTLP_TIMEOUT, + OTEL_PYTHON_SDK_METRICS_ENABLED, +) +from opentelemetry.sdk.environment_variables._internal import ( + parse_boolean_environment_variable, ) from opentelemetry.semconv._incubating.attributes.otel_attributes import ( OtelComponentTypeValues, @@ -157,6 +161,9 @@ def __init__( "logs", urlparse(self._endpoint), meter_provider, + disabled=not parse_boolean_environment_variable( + OTEL_PYTHON_SDK_METRICS_ENABLED + ), ) def _export( diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/metric_exporter/__init__.py b/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/metric_exporter/__init__.py index efd63b45438..5b45c34e1be 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 @@ -86,6 +86,10 @@ OTEL_EXPORTER_OTLP_METRICS_HEADERS, OTEL_EXPORTER_OTLP_METRICS_TIMEOUT, OTEL_EXPORTER_OTLP_TIMEOUT, + OTEL_PYTHON_SDK_METRICS_ENABLED, +) +from opentelemetry.sdk.environment_variables._internal import ( + parse_boolean_environment_variable, ) from opentelemetry.sdk.metrics._internal.aggregation import Aggregation from opentelemetry.sdk.metrics.export import ( # noqa: F401 @@ -222,6 +226,9 @@ def __init__( "metrics", urlparse(self._endpoint), meter_provider, + disabled=not parse_boolean_environment_variable( + OTEL_PYTHON_SDK_METRICS_ENABLED + ), ) def _export( @@ -404,6 +411,9 @@ def set_meter_provider(self, meter_provider: MeterProvider) -> None: "metrics", urlparse(self._endpoint), meter_provider, + disabled=not parse_boolean_environment_variable( + OTEL_PYTHON_SDK_METRICS_ENABLED + ), ) diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/trace_exporter/__init__.py b/exporter/opentelemetry-exporter-otlp-proto-http/src/opentelemetry/exporter/otlp/proto/http/trace_exporter/__init__.py index 018d89df1ee..cc0285f30ca 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 @@ -57,6 +57,10 @@ OTEL_EXPORTER_OTLP_TRACES_ENDPOINT, OTEL_EXPORTER_OTLP_TRACES_HEADERS, OTEL_EXPORTER_OTLP_TRACES_TIMEOUT, + OTEL_PYTHON_SDK_METRICS_ENABLED, +) +from opentelemetry.sdk.environment_variables._internal import ( + parse_boolean_environment_variable, ) from opentelemetry.sdk.trace import ReadableSpan from opentelemetry.sdk.trace.export import SpanExporter, SpanExportResult @@ -152,6 +156,9 @@ def __init__( "traces", urlparse(self._endpoint), meter_provider, + disabled=not parse_boolean_environment_variable( + OTEL_PYTHON_SDK_METRICS_ENABLED + ), ) def _export( diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/tests/metrics/test_otlp_metrics_exporter.py b/exporter/opentelemetry-exporter-otlp-proto-http/tests/metrics/test_otlp_metrics_exporter.py index 5f7ae2afa9b..aeda4504d45 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 @@ -69,6 +69,7 @@ OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE, OTEL_EXPORTER_OTLP_METRICS_TIMEOUT, OTEL_EXPORTER_OTLP_TIMEOUT, + OTEL_PYTHON_SDK_METRICS_ENABLED, ) from opentelemetry.sdk.metrics import ( Counter, @@ -334,6 +335,7 @@ def test_headers_parse_from_env(self): ), ) + @patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) @patch.object(Session, "post") def test_success(self, mock_post): resp = Response() @@ -372,6 +374,7 @@ def test_success(self, mock_post): metrics[2].data.data_points[0].attributes ) + @patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) @patch.object(Session, "post") def test_failure(self, mock_post): resp = Response() @@ -1291,6 +1294,7 @@ def test_preferred_aggregation_override(self): exporter._preferred_aggregation[Histogram], histogram_aggregation ) + @patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) @patch.object(Session, "post") def test_retry_timeout(self, mock_post): exporter = OTLPMetricExporter( diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py b/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_log_exporter.py index 7981b0bc821..3929e9df826 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 @@ -58,6 +58,7 @@ OTEL_EXPORTER_OTLP_LOGS_HEADERS, OTEL_EXPORTER_OTLP_LOGS_TIMEOUT, OTEL_EXPORTER_OTLP_TIMEOUT, + OTEL_PYTHON_SDK_METRICS_ENABLED, ) from opentelemetry.sdk.metrics import MeterProvider from opentelemetry.sdk.metrics.export import InMemoryMetricReader @@ -467,6 +468,7 @@ def test_2xx_status_code(self, mock_otlp_metric_exporter): LogRecordExportResult.SUCCESS, ) + @patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) @patch.object(Session, "post") def test_retry_timeout(self, mock_post): exporter = OTLPLogExporter( @@ -555,6 +557,7 @@ def test_export_no_collector_available_retryable(self, mock_post): warning.records[0].message, ) + @patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) @patch.object(Session, "post") def test_export_no_collector_available(self, mock_post): exporter = OTLPLogExporter( diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_span_exporter.py b/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_span_exporter.py index 0df471aa693..66e291a8b43 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_span_exporter.py +++ b/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_span_exporter.py @@ -48,6 +48,7 @@ OTEL_EXPORTER_OTLP_TRACES_ENDPOINT, OTEL_EXPORTER_OTLP_TRACES_HEADERS, OTEL_EXPORTER_OTLP_TRACES_TIMEOUT, + OTEL_PYTHON_SDK_METRICS_ENABLED, ) from opentelemetry.sdk.metrics import MeterProvider from opentelemetry.sdk.metrics.export import InMemoryMetricReader @@ -287,6 +288,18 @@ def test_2xx_status_code(self, mock_otlp_metric_exporter): OTLPSpanExporter().export(MagicMock()), SpanExportResult.SUCCESS ) + @patch.dict("os.environ", {}, clear=True) + @patch.object(OTLPSpanExporter, "_export", return_value=Mock(ok=True)) + def test_exporter_metrics_disabled_by_default(self, _mock_export): + exporter = OTLPSpanExporter(meter_provider=self.meter_provider) + + self.assertEqual( + exporter.export([BASIC_SPAN]), SpanExportResult.SUCCESS + ) + + self.assertIsNone(self.metric_reader.get_metrics_data()) + + @patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) @patch.object(Session, "post") def test_retry_timeout(self, mock_post): exporter = OTLPSpanExporter( @@ -375,6 +388,7 @@ def test_export_no_collector_available_retryable(self, mock_post): warning.records[0].message, ) + @patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) @patch.object(Session, "post") def test_export_no_collector_available(self, mock_post): exporter = OTLPSpanExporter( diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/_logger_metrics.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/_logger_metrics.py index 92a4c76a450..339d77121cb 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/_logger_metrics.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/_logger_metrics.py @@ -13,6 +13,12 @@ # limitations under the License. from opentelemetry import metrics as metrics_api +from opentelemetry.sdk.environment_variables import ( + OTEL_PYTHON_SDK_METRICS_ENABLED, +) +from opentelemetry.sdk.environment_variables._internal import ( + parse_boolean_environment_variable, +) from opentelemetry.semconv._incubating.metrics.otel_metrics import ( create_otel_sdk_log_created, ) @@ -22,6 +28,11 @@ class LoggerMetrics: def __init__(self, meter_provider: metrics_api.MeterProvider) -> None: meter = meter_provider.get_meter("opentelemetry-sdk") self._created_logs = create_otel_sdk_log_created(meter) + self._enabled = parse_boolean_environment_variable( + OTEL_PYTHON_SDK_METRICS_ENABLED + ) def emit_log(self) -> None: + if not self._enabled: + return self._created_logs.add(1) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_shared_internal/_processor_metrics.py b/opentelemetry-sdk/src/opentelemetry/sdk/_shared_internal/_processor_metrics.py index 47f90c28522..82faedac8a5 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_shared_internal/_processor_metrics.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_shared_internal/_processor_metrics.py @@ -19,6 +19,12 @@ from typing import Literal from opentelemetry.metrics import CallbackOptions, MeterProvider, Observation +from opentelemetry.sdk.environment_variables import ( + OTEL_PYTHON_SDK_METRICS_ENABLED, +) +from opentelemetry.sdk.environment_variables._internal import ( + parse_boolean_environment_variable, +) from opentelemetry.semconv._incubating.attributes.otel_attributes import ( OTEL_COMPONENT_NAME, OTEL_COMPONENT_TYPE, @@ -75,12 +81,19 @@ def __init__( ) self._processed = create_processed(meter) + self._enabled = parse_boolean_environment_variable( + OTEL_PYTHON_SDK_METRICS_ENABLED + ) if capacity is not None: self._queue_capacity = create_queue_capacity(meter) - self._queue_capacity.add(capacity, self._standard_attrs) + if self._enabled: + self._queue_capacity.add(capacity, self._standard_attrs) def register_queue_size(self, get_queue_size: Callable[[], int]) -> None: + if not self._enabled: + return + def record_queue_size( _options: CallbackOptions, ) -> tuple[Observation]: @@ -103,9 +116,13 @@ def record_queue_size( ) def drop_items(self, count: int) -> None: + if not self._enabled: + return self._processed.add(count, self._dropped_attrs) def finish_items(self, count: int, error: Exception | None) -> None: + if not self._enabled: + return if not error: self._processed.add(count, self._standard_attrs) return diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/environment_variables/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/environment_variables/__init__.py index 2e5f350512b..a56004b0f93 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/environment_variables/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/environment_variables/__init__.py @@ -845,3 +845,12 @@ def channel_credential_provider() -> grpc.ChannelCredentials: This is an experimental environment variable and the name of this variable and its behavior can change in a non-backwards compatible way. """ + +OTEL_PYTHON_SDK_METRICS_ENABLED = "OTEL_PYTHON_SDK_METRICS_ENABLED" +""" +.. envvar:: OTEL_PYTHON_SDK_METRICS_ENABLED + +The :envvar:`OTEL_PYTHON_SDK_METRICS_ENABLED` environment variable enables +metrics emitted by the SDK about its own internal state. +Default: "false" +""" diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/environment_variables/_internal.py b/opentelemetry-sdk/src/opentelemetry/sdk/environment_variables/_internal.py new file mode 100644 index 00000000000..0e59c57aa4f --- /dev/null +++ b/opentelemetry-sdk/src/opentelemetry/sdk/environment_variables/_internal.py @@ -0,0 +1,39 @@ +# Copyright The OpenTelemetry Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from logging import getLogger +from os import environ + +_logger = getLogger(__name__) + + +def parse_boolean_environment_variable( + environment_variable: str, default: bool = False +) -> bool: + value = environ.get(environment_variable) + if value is None: + return default + + match value.strip().lower(): + case "true": + return True + case "false": + return False + case _: + _logger.warning( + "Invalid value for %s: %r. Expected 'true' or 'false'.", + environment_variable, + value, + ) + return default diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/_metric_reader_metrics.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/_metric_reader_metrics.py index 435d9c2da7b..5b5862fc98b 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/_metric_reader_metrics.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/_metric_reader_metrics.py @@ -1,6 +1,12 @@ from collections import Counter from opentelemetry.metrics import MeterProvider +from opentelemetry.sdk.environment_variables import ( + OTEL_PYTHON_SDK_METRICS_ENABLED, +) +from opentelemetry.sdk.environment_variables._internal import ( + parse_boolean_environment_variable, +) from opentelemetry.semconv._incubating.attributes.otel_attributes import ( OTEL_COMPONENT_NAME, OTEL_COMPONENT_TYPE, @@ -29,6 +35,11 @@ def __init__( self._collection_duration = ( create_otel_sdk_metric_reader_collection_duration(meter) ) + self._enabled = parse_boolean_environment_variable( + OTEL_PYTHON_SDK_METRICS_ENABLED + ) def record_collection(self, duration: float) -> None: + if not self._enabled: + return self._collection_duration.record(duration, self._standard_attrs) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_tracer_metrics.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_tracer_metrics.py index ad7de330c78..cd701f1b947 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_tracer_metrics.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_tracer_metrics.py @@ -17,6 +17,12 @@ from collections.abc import Callable from opentelemetry import metrics as metrics_api +from opentelemetry.sdk.environment_variables import ( + OTEL_PYTHON_SDK_METRICS_ENABLED, +) +from opentelemetry.sdk.environment_variables._internal import ( + parse_boolean_environment_variable, +) from opentelemetry.sdk.trace.sampling import Decision from opentelemetry.semconv._incubating.attributes.otel_attributes import ( OTEL_SPAN_PARENT_ORIGIN, @@ -36,12 +42,18 @@ def __init__(self, meter_provider: metrics_api.MeterProvider) -> None: self._started_spans = create_otel_sdk_span_started(meter) self._live_spans = create_otel_sdk_span_live(meter) + self._enabled = parse_boolean_environment_variable( + OTEL_PYTHON_SDK_METRICS_ENABLED + ) def start_span( self, parent_span_context: SpanContext | None, sampling_decision: Decision, ) -> Callable[[], None]: + if not self._enabled: + return noop + sampling_result_value = sampling_result(sampling_decision) self._started_spans.add( 1, @@ -60,6 +72,8 @@ def start_span( self._live_spans.add(1, live_span_attrs) def end_span() -> None: + if not self._enabled: + return self._live_spans.add(-1, live_span_attrs) return end_span diff --git a/opentelemetry-sdk/tests/logs/test_export.py b/opentelemetry-sdk/tests/logs/test_export.py index c36eeccfdc8..4fdcb90eb3f 100644 --- a/opentelemetry-sdk/tests/logs/test_export.py +++ b/opentelemetry-sdk/tests/logs/test_export.py @@ -51,6 +51,7 @@ OTEL_BLRP_MAX_EXPORT_BATCH_SIZE, OTEL_BLRP_MAX_QUEUE_SIZE, OTEL_BLRP_SCHEDULE_DELAY, + OTEL_PYTHON_SDK_METRICS_ENABLED, ) from opentelemetry.sdk.metrics import MeterProvider from opentelemetry.sdk.metrics.export import InMemoryMetricReader @@ -406,6 +407,7 @@ def test_simple_log_record_processor_different_msg_types_with_formatter( ] self.assertEqual(expected, emitted) + @patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) def test_metrics(self): # pylint: disable=too-many-locals metric_reader = InMemoryMetricReader() meter_provider = MeterProvider(metric_readers=[metric_reader]) @@ -695,6 +697,7 @@ def test_validation_negative_max_queue_size(self): max_export_batch_size=101, ) + @patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) def test_metrics(self): # pylint: disable=too-many-locals,too-many-statements metric_reader = InMemoryMetricReader() meter_provider = MeterProvider(metric_readers=[metric_reader]) diff --git a/opentelemetry-sdk/tests/logs/test_sdk_metrics.py b/opentelemetry-sdk/tests/logs/test_sdk_metrics.py index 5a0e18c4fb9..b1e37099754 100644 --- a/opentelemetry-sdk/tests/logs/test_sdk_metrics.py +++ b/opentelemetry-sdk/tests/logs/test_sdk_metrics.py @@ -13,12 +13,17 @@ # limitations under the License. from unittest import TestCase +from unittest.mock import patch from opentelemetry.sdk._logs import LoggerProvider +from opentelemetry.sdk.environment_variables import ( + OTEL_PYTHON_SDK_METRICS_ENABLED, +) from opentelemetry.sdk.metrics import MeterProvider from opentelemetry.sdk.metrics.export import InMemoryMetricReader +@patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) class TestLoggerProviderMetrics(TestCase): def setUp(self): self.metric_reader = InMemoryMetricReader() @@ -57,3 +62,16 @@ def test_create_logs(self): 2, {}, ) + + +class TestLoggerProviderMetricsDisabled(TestCase): + def test_disabled_by_default(self): + metric_reader = InMemoryMetricReader() + meter_provider = MeterProvider(metric_readers=[metric_reader]) + logger_provider = LoggerProvider(meter_provider=meter_provider) + logger = logger_provider.get_logger("test") + + logger.emit(body="log1") + + self.assertIsNone(metric_reader.get_metrics_data()) + meter_provider.shutdown() 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..6b294037294 100644 --- a/opentelemetry-sdk/tests/metrics/test_periodic_exporting_metric_reader.py +++ b/opentelemetry-sdk/tests/metrics/test_periodic_exporting_metric_reader.py @@ -20,10 +20,13 @@ from logging import WARNING from time import sleep, time_ns from typing import Optional, cast -from unittest.mock import Mock +from unittest.mock import Mock, patch import pytest +from opentelemetry.sdk.environment_variables import ( + OTEL_PYTHON_SDK_METRICS_ENABLED, +) from opentelemetry.sdk.metrics import ( Counter, MeterProvider, @@ -315,6 +318,7 @@ def test_metric_exporer_gc(self): "The PeriodicExportingMetricReader object created by this test wasn't garbage collected", ) + @patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) def test_metric_reader_metrics(self): exporter = FakeMetricsExporter() pmr = PeriodicExportingMetricReader( diff --git a/opentelemetry-sdk/tests/test_environment_variables_internal.py b/opentelemetry-sdk/tests/test_environment_variables_internal.py new file mode 100644 index 00000000000..ab340585ed2 --- /dev/null +++ b/opentelemetry-sdk/tests/test_environment_variables_internal.py @@ -0,0 +1,73 @@ +# Copyright The OpenTelemetry Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from unittest import TestCase +from unittest.mock import patch + +from opentelemetry.sdk.environment_variables._internal import ( + parse_boolean_environment_variable, +) + + +class TestParseBooleanEnvironmentVariable(TestCase): + def test_unset_returns_default(self): + for default, expected in ( + (False, False), + (True, True), + ): + with self.subTest(default=default): + with patch.dict("os.environ", {}, clear=True): + self.assertEqual( + parse_boolean_environment_variable( + "TEST_BOOL", default=default + ), + expected, + ) + + def test_valid_values(self): + for value, expected in ( + ("true", True), + (" TrUe ", True), + ("false", False), + (" FaLsE ", False), + ): + with self.subTest(value=value): + with patch.dict("os.environ", {"TEST_BOOL": value}): + self.assertEqual( + parse_boolean_environment_variable("TEST_BOOL"), + expected, + ) + + def test_invalid_value_warns_and_returns_default(self): + for default, expected in ( + (False, False), + (True, True), + ): + with self.subTest(default=default): + with patch.dict("os.environ", {"TEST_BOOL": "yes"}): + with self.assertLogs( + "opentelemetry.sdk.environment_variables._internal", + level="WARNING", + ) as logs: + self.assertEqual( + parse_boolean_environment_variable( + "TEST_BOOL", default=default + ), + expected, + ) + + self.assertIn( + "Invalid value for TEST_BOOL", + logs.records[0].message, + ) diff --git a/opentelemetry-sdk/tests/trace/export/test_export.py b/opentelemetry-sdk/tests/trace/export/test_export.py index 2d1321df81b..9cb3e83cdec 100644 --- a/opentelemetry-sdk/tests/trace/export/test_export.py +++ b/opentelemetry-sdk/tests/trace/export/test_export.py @@ -28,6 +28,7 @@ OTEL_BSP_MAX_EXPORT_BATCH_SIZE, OTEL_BSP_MAX_QUEUE_SIZE, OTEL_BSP_SCHEDULE_DELAY, + OTEL_PYTHON_SDK_METRICS_ENABLED, ) from opentelemetry.sdk.metrics import MeterProvider from opentelemetry.sdk.metrics.export import InMemoryMetricReader @@ -146,6 +147,7 @@ def test_simple_span_processor_not_sampled(self): self.assertListEqual([], spans_names_list) + @mock.patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) def test_metrics(self): metric_reader = InMemoryMetricReader() meter_provider = MeterProvider(metric_readers=[metric_reader]) @@ -397,6 +399,7 @@ def test_batch_span_processor_parameters(self): max_export_batch_size=512, ) + @mock.patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) def test_metrics(self): # pylint: disable=too-many-locals,too-many-statements metric_reader = InMemoryMetricReader() meter_provider = MeterProvider(metric_readers=[metric_reader]) diff --git a/opentelemetry-sdk/tests/trace/test_sdk_metrics.py b/opentelemetry-sdk/tests/trace/test_sdk_metrics.py index 2baa967f8ad..b48845cb8de 100644 --- a/opentelemetry-sdk/tests/trace/test_sdk_metrics.py +++ b/opentelemetry-sdk/tests/trace/test_sdk_metrics.py @@ -13,8 +13,12 @@ # limitations under the License. from unittest import TestCase +from unittest.mock import patch from opentelemetry import trace as trace_api +from opentelemetry.sdk.environment_variables import ( + OTEL_PYTHON_SDK_METRICS_ENABLED, +) from opentelemetry.sdk.metrics import MeterProvider from opentelemetry.sdk.metrics.export import InMemoryMetricReader from opentelemetry.sdk.trace import TracerProvider @@ -27,6 +31,7 @@ from opentelemetry.trace.span import SpanContext +@patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) class TestTracerProviderMetrics(TestCase): def setUp(self): self.metric_reader = InMemoryMetricReader() @@ -159,6 +164,7 @@ def test_dropped(self): }, ) self.assert_live_spans(metric_data, None, {}) + span.end() metric_data = self.metric_reader.get_metrics_data() self.assert_started_spans( @@ -242,3 +248,19 @@ def test_dropped_local_parent(self): }, ) self.assert_live_spans(metric_data, None, {}) + + +class TestTracerProviderMetricsDisabled(TestCase): + def test_disabled_by_default(self): + metric_reader = InMemoryMetricReader() + meter_provider = MeterProvider(metric_readers=[metric_reader]) + tracer_provider = TracerProvider( + sampler=ALWAYS_ON, meter_provider=meter_provider + ) + tracer = tracer_provider.get_tracer("test") + + with tracer.start_as_current_span("span"): + pass + + self.assertIsNone(metric_reader.get_metrics_data()) + meter_provider.shutdown() From 39e05ab5708e9d6fbed2d417d51585df8107a790 Mon Sep 17 00:00:00 2001 From: Lukas Hering Date: Sun, 26 Apr 2026 23:23:50 -0400 Subject: [PATCH 2/7] update CHANGELOG.md message --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c401da3bf90..19367bb4b16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,7 +36,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#5120](https://github.com/open-telemetry/opentelemetry-python/pull/5120)) - Add WeaverLiveCheck test util ([#5088](https://github.com/open-telemetry/opentelemetry-python/pull/5088)) -- Add ability to configure exporting of SDK internal metrics with the `OTEL_PYTHON_SDK_METRICS_ENABLED` environment variable. +- Add ability to selectively enable exporting of SDK internal metrics with the `OTEL_PYTHON_SDK_METRICS_ENABLED` environment variable. ## Version 1.41.0/0.62b0 (2026-04-09) From d2c17b52bdb568ff23a715fda83a65fa0c929199 Mon Sep 17 00:00:00 2001 From: Lukas Hering Date: Sun, 26 Apr 2026 23:26:59 -0400 Subject: [PATCH 3/7] add link to PR in CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19367bb4b16..24ce9f73d37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add WeaverLiveCheck test util ([#5088](https://github.com/open-telemetry/opentelemetry-python/pull/5088)) - Add ability to selectively enable exporting of SDK internal metrics with the `OTEL_PYTHON_SDK_METRICS_ENABLED` environment variable. + ([#5151](https://github.com/open-telemetry/opentelemetry-python/pull/5151)) ## Version 1.41.0/0.62b0 (2026-04-09) From 08265a25a64e997548b1d6d79d432cb9072ea3f6 Mon Sep 17 00:00:00 2001 From: Lukas Hering Date: Sun, 26 Apr 2026 23:50:55 -0400 Subject: [PATCH 4/7] refactor ProcessorMetrics --- .../sdk/_logs/_internal/export/__init__.py | 10 ++++++++++ .../_shared_internal/_processor_metrics.py | 20 +++++++------------ .../sdk/trace/export/__init__.py | 10 ++++++++++ 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/__init__.py index 1c0f82ac055..cf8b936dda4 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/__init__.py @@ -46,6 +46,10 @@ OTEL_BLRP_MAX_EXPORT_BATCH_SIZE, OTEL_BLRP_MAX_QUEUE_SIZE, OTEL_BLRP_SCHEDULE_DELAY, + OTEL_PYTHON_SDK_METRICS_ENABLED, +) +from opentelemetry.sdk.environment_variables._internal import ( + parse_boolean_environment_variable, ) from opentelemetry.sdk.resources import Resource from opentelemetry.semconv._incubating.attributes.otel_attributes import ( @@ -190,6 +194,9 @@ def __init__( "logs", OtelComponentTypeValues.SIMPLE_LOG_PROCESSOR, meter_provider or get_meter_provider(), + disabled=not parse_boolean_environment_variable( + OTEL_PYTHON_SDK_METRICS_ENABLED + ), ) def on_emit(self, log_record: ReadWriteLogRecord): @@ -304,6 +311,9 @@ def __init__( OtelComponentTypeValues.BATCHING_LOG_PROCESSOR, meter_provider or get_meter_provider(), capacity=max_queue_size, + disabled=not parse_boolean_environment_variable( + OTEL_PYTHON_SDK_METRICS_ENABLED + ), ), ) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_shared_internal/_processor_metrics.py b/opentelemetry-sdk/src/opentelemetry/sdk/_shared_internal/_processor_metrics.py index 82faedac8a5..13654143267 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_shared_internal/_processor_metrics.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_shared_internal/_processor_metrics.py @@ -19,12 +19,6 @@ from typing import Literal from opentelemetry.metrics import CallbackOptions, MeterProvider, Observation -from opentelemetry.sdk.environment_variables import ( - OTEL_PYTHON_SDK_METRICS_ENABLED, -) -from opentelemetry.sdk.environment_variables._internal import ( - parse_boolean_environment_variable, -) from opentelemetry.semconv._incubating.attributes.otel_attributes import ( OTEL_COMPONENT_NAME, OTEL_COMPONENT_TYPE, @@ -51,8 +45,10 @@ def __init__( meter_provider: MeterProvider, *, capacity: int | None = None, + disabled: bool = False, ) -> None: self._signal = signal + self._enabled = not disabled meter = meter_provider.get_meter("opentelemetry-sdk") self._meter = meter @@ -81,17 +77,15 @@ def __init__( ) self._processed = create_processed(meter) - self._enabled = parse_boolean_environment_variable( - OTEL_PYTHON_SDK_METRICS_ENABLED - ) + self._disabled = disabled if capacity is not None: self._queue_capacity = create_queue_capacity(meter) - if self._enabled: + if not self._disabled: self._queue_capacity.add(capacity, self._standard_attrs) def register_queue_size(self, get_queue_size: Callable[[], int]) -> None: - if not self._enabled: + if self._disabled: return def record_queue_size( @@ -116,12 +110,12 @@ def record_queue_size( ) def drop_items(self, count: int) -> None: - if not self._enabled: + if self._disabled: return self._processed.add(count, self._dropped_attrs) def finish_items(self, count: int, error: Exception | None) -> None: - if not self._enabled: + if self._disabled: return if not error: self._processed.add(count, self._standard_attrs) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py index 8cf9c5e922d..0a80696de45 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py @@ -33,6 +33,10 @@ OTEL_BSP_MAX_EXPORT_BATCH_SIZE, OTEL_BSP_MAX_QUEUE_SIZE, OTEL_BSP_SCHEDULE_DELAY, + OTEL_PYTHON_SDK_METRICS_ENABLED, +) +from opentelemetry.sdk.environment_variables._internal import ( + parse_boolean_environment_variable, ) from opentelemetry.sdk.trace import ReadableSpan, Span, SpanProcessor from opentelemetry.semconv._incubating.attributes.otel_attributes import ( @@ -106,6 +110,9 @@ def __init__( "traces", OtelComponentTypeValues.SIMPLE_SPAN_PROCESSOR, meter_provider or get_meter_provider(), + disabled=not parse_boolean_environment_variable( + OTEL_PYTHON_SDK_METRICS_ENABLED + ), ) def on_start( @@ -201,6 +208,9 @@ def __init__( OtelComponentTypeValues.BATCHING_SPAN_PROCESSOR, meter_provider or get_meter_provider(), capacity=max_queue_size, + disabled=not parse_boolean_environment_variable( + OTEL_PYTHON_SDK_METRICS_ENABLED + ), ), ) From e3edee5d54d853d3e502d7501e4940f680f067c5 Mon Sep 17 00:00:00 2001 From: Lukas Hering Date: Sun, 26 Apr 2026 23:52:46 -0400 Subject: [PATCH 5/7] remove unused instance variable --- .../src/opentelemetry/sdk/_shared_internal/_processor_metrics.py | 1 - 1 file changed, 1 deletion(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_shared_internal/_processor_metrics.py b/opentelemetry-sdk/src/opentelemetry/sdk/_shared_internal/_processor_metrics.py index 13654143267..d5703733ae0 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_shared_internal/_processor_metrics.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_shared_internal/_processor_metrics.py @@ -48,7 +48,6 @@ def __init__( disabled: bool = False, ) -> None: self._signal = signal - self._enabled = not disabled meter = meter_provider.get_meter("opentelemetry-sdk") self._meter = meter From 22afc5aae121174e7ad6f1d50f44bf609b3e75b9 Mon Sep 17 00:00:00 2001 From: Lukas Hering Date: Sun, 26 Apr 2026 23:58:23 -0400 Subject: [PATCH 6/7] minor refactor --- .../opentelemetry/sdk/_logs/_internal/_logger_metrics.py | 4 ++-- .../sdk/metrics/_internal/export/_metric_reader_metrics.py | 4 ++-- .../src/opentelemetry/sdk/trace/_tracer_metrics.py | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/_logger_metrics.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/_logger_metrics.py index 339d77121cb..f9b5201b726 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/_logger_metrics.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/_logger_metrics.py @@ -28,11 +28,11 @@ class LoggerMetrics: def __init__(self, meter_provider: metrics_api.MeterProvider) -> None: meter = meter_provider.get_meter("opentelemetry-sdk") self._created_logs = create_otel_sdk_log_created(meter) - self._enabled = parse_boolean_environment_variable( + self._disabled = not parse_boolean_environment_variable( OTEL_PYTHON_SDK_METRICS_ENABLED ) def emit_log(self) -> None: - if not self._enabled: + if self._disabled: return self._created_logs.add(1) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/_metric_reader_metrics.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/_metric_reader_metrics.py index 5b5862fc98b..b91b89820e8 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/_metric_reader_metrics.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/_metric_reader_metrics.py @@ -35,11 +35,11 @@ def __init__( self._collection_duration = ( create_otel_sdk_metric_reader_collection_duration(meter) ) - self._enabled = parse_boolean_environment_variable( + self._disabled = not parse_boolean_environment_variable( OTEL_PYTHON_SDK_METRICS_ENABLED ) def record_collection(self, duration: float) -> None: - if not self._enabled: + if self._disabled: return self._collection_duration.record(duration, self._standard_attrs) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_tracer_metrics.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_tracer_metrics.py index cd701f1b947..1e0ff46dc2c 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_tracer_metrics.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_tracer_metrics.py @@ -42,7 +42,7 @@ def __init__(self, meter_provider: metrics_api.MeterProvider) -> None: self._started_spans = create_otel_sdk_span_started(meter) self._live_spans = create_otel_sdk_span_live(meter) - self._enabled = parse_boolean_environment_variable( + self._disabled = not parse_boolean_environment_variable( OTEL_PYTHON_SDK_METRICS_ENABLED ) @@ -51,7 +51,7 @@ def start_span( parent_span_context: SpanContext | None, sampling_decision: Decision, ) -> Callable[[], None]: - if not self._enabled: + if self._disabled: return noop sampling_result_value = sampling_result(sampling_decision) @@ -72,7 +72,7 @@ def start_span( self._live_spans.add(1, live_span_attrs) def end_span() -> None: - if not self._enabled: + if self._disabled: return self._live_spans.add(-1, live_span_attrs) From c224202f430435c997bd3d8a218784e8a1901f65 Mon Sep 17 00:00:00 2001 From: Lukas Hering Date: Mon, 27 Apr 2026 20:36:03 -0400 Subject: [PATCH 7/7] update naming of internal metric environment variable --- CHANGELOG.md | 2 +- .../exporter/otlp/proto/grpc/exporter.py | 4 ++-- .../tests/test_otlp_exporter_mixin.py | 14 ++++++++++---- .../otlp/proto/http/_log_exporter/__init__.py | 4 ++-- .../otlp/proto/http/metric_exporter/__init__.py | 6 +++--- .../otlp/proto/http/trace_exporter/__init__.py | 4 ++-- .../tests/metrics/test_otlp_metrics_exporter.py | 14 ++++++++++---- .../tests/test_proto_log_exporter.py | 10 +++++++--- .../tests/test_proto_span_exporter.py | 10 +++++++--- .../sdk/_logs/_internal/_logger_metrics.py | 4 ++-- .../sdk/_logs/_internal/export/__init__.py | 6 +++--- .../sdk/environment_variables/__init__.py | 8 +++++--- .../_internal/export/_metric_reader_metrics.py | 4 ++-- .../src/opentelemetry/sdk/trace/_tracer_metrics.py | 4 ++-- .../src/opentelemetry/sdk/trace/export/__init__.py | 6 +++--- opentelemetry-sdk/tests/logs/test_export.py | 10 +++++++--- opentelemetry-sdk/tests/logs/test_sdk_metrics.py | 4 ++-- .../test_periodic_exporting_metric_reader.py | 6 ++++-- .../tests/trace/export/test_export.py | 10 +++++++--- opentelemetry-sdk/tests/trace/test_sdk_metrics.py | 4 ++-- 20 files changed, 83 insertions(+), 51 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 24ce9f73d37..bebcda8f308 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,7 +36,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#5120](https://github.com/open-telemetry/opentelemetry-python/pull/5120)) - Add WeaverLiveCheck test util ([#5088](https://github.com/open-telemetry/opentelemetry-python/pull/5088)) -- Add ability to selectively enable exporting of SDK internal metrics with the `OTEL_PYTHON_SDK_METRICS_ENABLED` environment variable. +- Add ability to selectively enable exporting of SDK internal metrics with the `OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED` environment variable. ([#5151](https://github.com/open-telemetry/opentelemetry-python/pull/5151)) ## Version 1.41.0/0.62b0 (2026-04-09) 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 971967a16de..bd22bf75e51 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 @@ -103,7 +103,7 @@ OTEL_EXPORTER_OTLP_HEADERS, OTEL_EXPORTER_OTLP_INSECURE, OTEL_EXPORTER_OTLP_TIMEOUT, - OTEL_PYTHON_SDK_METRICS_ENABLED, + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED, ) from opentelemetry.sdk.environment_variables._internal import ( parse_boolean_environment_variable, @@ -397,7 +397,7 @@ def __init__( parsed_url, meter_provider, disabled=not parse_boolean_environment_variable( - OTEL_PYTHON_SDK_METRICS_ENABLED + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED ), ) 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 ab609bff152..de5c680381b 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 @@ -54,7 +54,7 @@ from opentelemetry.sdk.environment_variables import ( _OTEL_PYTHON_EXPORTER_OTLP_GRPC_CREDENTIAL_PROVIDER, OTEL_EXPORTER_OTLP_COMPRESSION, - OTEL_PYTHON_SDK_METRICS_ENABLED, + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED, ) from opentelemetry.sdk.metrics import MeterProvider from opentelemetry.sdk.metrics.export import InMemoryMetricReader @@ -388,7 +388,9 @@ def test_otlp_exporter_otlp_compression_envvar( ), ) - @patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) + @patch.dict( + "os.environ", {OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED: "true"} + ) def test_shutdown(self): add_TraceServiceServicer_to_server( TraceServiceServicerWithExportParams(StatusCode.OK), @@ -485,7 +487,9 @@ def test_export_over_closed_grpc_channel(self): system() == "Windows", "For gRPC + windows there's some added delay in the RPCs which breaks the assertion over amount of time passed.", ) - @patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) + @patch.dict( + "os.environ", {OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED: "true"} + ) def test_retry_info_is_respected(self): mock_trace_service = TraceServiceServicerWithExportParams( StatusCode.UNAVAILABLE, @@ -628,7 +632,9 @@ def test_otlp_headers_from_env(self): (), ) - @patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) + @patch.dict( + "os.environ", {OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED: "true"} + ) def test_permanent_failure(self): exporter = OTLPSpanExporterForTesting( insecure=True, meter_provider=self.meter_provider 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 fb46ce36a38..115ef7c86ac 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 @@ -61,7 +61,7 @@ OTEL_EXPORTER_OTLP_LOGS_HEADERS, OTEL_EXPORTER_OTLP_LOGS_TIMEOUT, OTEL_EXPORTER_OTLP_TIMEOUT, - OTEL_PYTHON_SDK_METRICS_ENABLED, + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED, ) from opentelemetry.sdk.environment_variables._internal import ( parse_boolean_environment_variable, @@ -162,7 +162,7 @@ def __init__( urlparse(self._endpoint), meter_provider, disabled=not parse_boolean_environment_variable( - OTEL_PYTHON_SDK_METRICS_ENABLED + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED ), ) 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 5b45c34e1be..af348fe2461 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 @@ -86,7 +86,7 @@ OTEL_EXPORTER_OTLP_METRICS_HEADERS, OTEL_EXPORTER_OTLP_METRICS_TIMEOUT, OTEL_EXPORTER_OTLP_TIMEOUT, - OTEL_PYTHON_SDK_METRICS_ENABLED, + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED, ) from opentelemetry.sdk.environment_variables._internal import ( parse_boolean_environment_variable, @@ -227,7 +227,7 @@ def __init__( urlparse(self._endpoint), meter_provider, disabled=not parse_boolean_environment_variable( - OTEL_PYTHON_SDK_METRICS_ENABLED + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED ), ) @@ -412,7 +412,7 @@ def set_meter_provider(self, meter_provider: MeterProvider) -> None: urlparse(self._endpoint), meter_provider, disabled=not parse_boolean_environment_variable( - OTEL_PYTHON_SDK_METRICS_ENABLED + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED ), ) 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 cc0285f30ca..8977833ff87 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 @@ -57,7 +57,7 @@ OTEL_EXPORTER_OTLP_TRACES_ENDPOINT, OTEL_EXPORTER_OTLP_TRACES_HEADERS, OTEL_EXPORTER_OTLP_TRACES_TIMEOUT, - OTEL_PYTHON_SDK_METRICS_ENABLED, + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED, ) from opentelemetry.sdk.environment_variables._internal import ( parse_boolean_environment_variable, @@ -157,7 +157,7 @@ def __init__( urlparse(self._endpoint), meter_provider, disabled=not parse_boolean_environment_variable( - OTEL_PYTHON_SDK_METRICS_ENABLED + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED ), ) 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 aeda4504d45..39128e3187f 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 @@ -69,7 +69,7 @@ OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE, OTEL_EXPORTER_OTLP_METRICS_TIMEOUT, OTEL_EXPORTER_OTLP_TIMEOUT, - OTEL_PYTHON_SDK_METRICS_ENABLED, + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED, ) from opentelemetry.sdk.metrics import ( Counter, @@ -335,7 +335,9 @@ def test_headers_parse_from_env(self): ), ) - @patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) + @patch.dict( + "os.environ", {OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED: "true"} + ) @patch.object(Session, "post") def test_success(self, mock_post): resp = Response() @@ -374,7 +376,9 @@ def test_success(self, mock_post): metrics[2].data.data_points[0].attributes ) - @patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) + @patch.dict( + "os.environ", {OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED: "true"} + ) @patch.object(Session, "post") def test_failure(self, mock_post): resp = Response() @@ -1294,7 +1298,9 @@ def test_preferred_aggregation_override(self): exporter._preferred_aggregation[Histogram], histogram_aggregation ) - @patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) + @patch.dict( + "os.environ", {OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED: "true"} + ) @patch.object(Session, "post") def test_retry_timeout(self, mock_post): exporter = OTLPMetricExporter( 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 3929e9df826..bdcdfbe3c74 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 @@ -58,7 +58,7 @@ OTEL_EXPORTER_OTLP_LOGS_HEADERS, OTEL_EXPORTER_OTLP_LOGS_TIMEOUT, OTEL_EXPORTER_OTLP_TIMEOUT, - OTEL_PYTHON_SDK_METRICS_ENABLED, + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED, ) from opentelemetry.sdk.metrics import MeterProvider from opentelemetry.sdk.metrics.export import InMemoryMetricReader @@ -468,7 +468,9 @@ def test_2xx_status_code(self, mock_otlp_metric_exporter): LogRecordExportResult.SUCCESS, ) - @patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) + @patch.dict( + "os.environ", {OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED: "true"} + ) @patch.object(Session, "post") def test_retry_timeout(self, mock_post): exporter = OTLPLogExporter( @@ -557,7 +559,9 @@ def test_export_no_collector_available_retryable(self, mock_post): warning.records[0].message, ) - @patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) + @patch.dict( + "os.environ", {OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED: "true"} + ) @patch.object(Session, "post") def test_export_no_collector_available(self, mock_post): exporter = OTLPLogExporter( diff --git a/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_span_exporter.py b/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_span_exporter.py index 66e291a8b43..1f671be6107 100644 --- a/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_span_exporter.py +++ b/exporter/opentelemetry-exporter-otlp-proto-http/tests/test_proto_span_exporter.py @@ -48,7 +48,7 @@ OTEL_EXPORTER_OTLP_TRACES_ENDPOINT, OTEL_EXPORTER_OTLP_TRACES_HEADERS, OTEL_EXPORTER_OTLP_TRACES_TIMEOUT, - OTEL_PYTHON_SDK_METRICS_ENABLED, + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED, ) from opentelemetry.sdk.metrics import MeterProvider from opentelemetry.sdk.metrics.export import InMemoryMetricReader @@ -299,7 +299,9 @@ def test_exporter_metrics_disabled_by_default(self, _mock_export): self.assertIsNone(self.metric_reader.get_metrics_data()) - @patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) + @patch.dict( + "os.environ", {OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED: "true"} + ) @patch.object(Session, "post") def test_retry_timeout(self, mock_post): exporter = OTLPSpanExporter( @@ -388,7 +390,9 @@ def test_export_no_collector_available_retryable(self, mock_post): warning.records[0].message, ) - @patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) + @patch.dict( + "os.environ", {OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED: "true"} + ) @patch.object(Session, "post") def test_export_no_collector_available(self, mock_post): exporter = OTLPSpanExporter( diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/_logger_metrics.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/_logger_metrics.py index f9b5201b726..1f1ca83c3d5 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/_logger_metrics.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/_logger_metrics.py @@ -14,7 +14,7 @@ from opentelemetry import metrics as metrics_api from opentelemetry.sdk.environment_variables import ( - OTEL_PYTHON_SDK_METRICS_ENABLED, + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED, ) from opentelemetry.sdk.environment_variables._internal import ( parse_boolean_environment_variable, @@ -29,7 +29,7 @@ def __init__(self, meter_provider: metrics_api.MeterProvider) -> None: meter = meter_provider.get_meter("opentelemetry-sdk") self._created_logs = create_otel_sdk_log_created(meter) self._disabled = not parse_boolean_environment_variable( - OTEL_PYTHON_SDK_METRICS_ENABLED + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED ) def emit_log(self) -> None: 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 cf8b936dda4..132dfcd2390 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/__init__.py @@ -46,7 +46,7 @@ OTEL_BLRP_MAX_EXPORT_BATCH_SIZE, OTEL_BLRP_MAX_QUEUE_SIZE, OTEL_BLRP_SCHEDULE_DELAY, - OTEL_PYTHON_SDK_METRICS_ENABLED, + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED, ) from opentelemetry.sdk.environment_variables._internal import ( parse_boolean_environment_variable, @@ -195,7 +195,7 @@ def __init__( OtelComponentTypeValues.SIMPLE_LOG_PROCESSOR, meter_provider or get_meter_provider(), disabled=not parse_boolean_environment_variable( - OTEL_PYTHON_SDK_METRICS_ENABLED + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED ), ) @@ -312,7 +312,7 @@ def __init__( meter_provider or get_meter_provider(), capacity=max_queue_size, disabled=not parse_boolean_environment_variable( - OTEL_PYTHON_SDK_METRICS_ENABLED + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED ), ), ) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/environment_variables/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/environment_variables/__init__.py index a56004b0f93..8e5bf7d3b09 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/environment_variables/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/environment_variables/__init__.py @@ -846,11 +846,13 @@ def channel_credential_provider() -> grpc.ChannelCredentials: change in a non-backwards compatible way. """ -OTEL_PYTHON_SDK_METRICS_ENABLED = "OTEL_PYTHON_SDK_METRICS_ENABLED" +OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED = ( + "OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED" +) """ -.. envvar:: OTEL_PYTHON_SDK_METRICS_ENABLED +.. envvar:: OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED -The :envvar:`OTEL_PYTHON_SDK_METRICS_ENABLED` environment variable enables +The :envvar:`OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED` environment variable enables metrics emitted by the SDK about its own internal state. Default: "false" """ diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/_metric_reader_metrics.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/_metric_reader_metrics.py index b91b89820e8..b826091ac86 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/_metric_reader_metrics.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/export/_metric_reader_metrics.py @@ -2,7 +2,7 @@ from opentelemetry.metrics import MeterProvider from opentelemetry.sdk.environment_variables import ( - OTEL_PYTHON_SDK_METRICS_ENABLED, + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED, ) from opentelemetry.sdk.environment_variables._internal import ( parse_boolean_environment_variable, @@ -36,7 +36,7 @@ def __init__( create_otel_sdk_metric_reader_collection_duration(meter) ) self._disabled = not parse_boolean_environment_variable( - OTEL_PYTHON_SDK_METRICS_ENABLED + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED ) def record_collection(self, duration: float) -> None: diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_tracer_metrics.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_tracer_metrics.py index 1e0ff46dc2c..8868a3cd4a0 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/_tracer_metrics.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/_tracer_metrics.py @@ -18,7 +18,7 @@ from opentelemetry import metrics as metrics_api from opentelemetry.sdk.environment_variables import ( - OTEL_PYTHON_SDK_METRICS_ENABLED, + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED, ) from opentelemetry.sdk.environment_variables._internal import ( parse_boolean_environment_variable, @@ -43,7 +43,7 @@ def __init__(self, meter_provider: metrics_api.MeterProvider) -> None: self._started_spans = create_otel_sdk_span_started(meter) self._live_spans = create_otel_sdk_span_live(meter) self._disabled = not parse_boolean_environment_variable( - OTEL_PYTHON_SDK_METRICS_ENABLED + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED ) def start_span( diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py index 0a80696de45..666623a746f 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/export/__init__.py @@ -33,7 +33,7 @@ OTEL_BSP_MAX_EXPORT_BATCH_SIZE, OTEL_BSP_MAX_QUEUE_SIZE, OTEL_BSP_SCHEDULE_DELAY, - OTEL_PYTHON_SDK_METRICS_ENABLED, + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED, ) from opentelemetry.sdk.environment_variables._internal import ( parse_boolean_environment_variable, @@ -111,7 +111,7 @@ def __init__( OtelComponentTypeValues.SIMPLE_SPAN_PROCESSOR, meter_provider or get_meter_provider(), disabled=not parse_boolean_environment_variable( - OTEL_PYTHON_SDK_METRICS_ENABLED + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED ), ) @@ -209,7 +209,7 @@ def __init__( meter_provider or get_meter_provider(), capacity=max_queue_size, disabled=not parse_boolean_environment_variable( - OTEL_PYTHON_SDK_METRICS_ENABLED + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED ), ), ) diff --git a/opentelemetry-sdk/tests/logs/test_export.py b/opentelemetry-sdk/tests/logs/test_export.py index 4fdcb90eb3f..bc8396b472e 100644 --- a/opentelemetry-sdk/tests/logs/test_export.py +++ b/opentelemetry-sdk/tests/logs/test_export.py @@ -51,7 +51,7 @@ OTEL_BLRP_MAX_EXPORT_BATCH_SIZE, OTEL_BLRP_MAX_QUEUE_SIZE, OTEL_BLRP_SCHEDULE_DELAY, - OTEL_PYTHON_SDK_METRICS_ENABLED, + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED, ) from opentelemetry.sdk.metrics import MeterProvider from opentelemetry.sdk.metrics.export import InMemoryMetricReader @@ -407,7 +407,9 @@ def test_simple_log_record_processor_different_msg_types_with_formatter( ] self.assertEqual(expected, emitted) - @patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) + @patch.dict( + "os.environ", {OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED: "true"} + ) def test_metrics(self): # pylint: disable=too-many-locals metric_reader = InMemoryMetricReader() meter_provider = MeterProvider(metric_readers=[metric_reader]) @@ -697,7 +699,9 @@ def test_validation_negative_max_queue_size(self): max_export_batch_size=101, ) - @patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) + @patch.dict( + "os.environ", {OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED: "true"} + ) def test_metrics(self): # pylint: disable=too-many-locals,too-many-statements metric_reader = InMemoryMetricReader() meter_provider = MeterProvider(metric_readers=[metric_reader]) diff --git a/opentelemetry-sdk/tests/logs/test_sdk_metrics.py b/opentelemetry-sdk/tests/logs/test_sdk_metrics.py index b1e37099754..8095971b9cf 100644 --- a/opentelemetry-sdk/tests/logs/test_sdk_metrics.py +++ b/opentelemetry-sdk/tests/logs/test_sdk_metrics.py @@ -17,13 +17,13 @@ from opentelemetry.sdk._logs import LoggerProvider from opentelemetry.sdk.environment_variables import ( - OTEL_PYTHON_SDK_METRICS_ENABLED, + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED, ) from opentelemetry.sdk.metrics import MeterProvider from opentelemetry.sdk.metrics.export import InMemoryMetricReader -@patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) +@patch.dict("os.environ", {OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED: "true"}) class TestLoggerProviderMetrics(TestCase): def setUp(self): self.metric_reader = InMemoryMetricReader() 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 6b294037294..06bf447e301 100644 --- a/opentelemetry-sdk/tests/metrics/test_periodic_exporting_metric_reader.py +++ b/opentelemetry-sdk/tests/metrics/test_periodic_exporting_metric_reader.py @@ -25,7 +25,7 @@ import pytest from opentelemetry.sdk.environment_variables import ( - OTEL_PYTHON_SDK_METRICS_ENABLED, + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED, ) from opentelemetry.sdk.metrics import ( Counter, @@ -318,7 +318,9 @@ def test_metric_exporer_gc(self): "The PeriodicExportingMetricReader object created by this test wasn't garbage collected", ) - @patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) + @patch.dict( + "os.environ", {OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED: "true"} + ) def test_metric_reader_metrics(self): exporter = FakeMetricsExporter() pmr = PeriodicExportingMetricReader( diff --git a/opentelemetry-sdk/tests/trace/export/test_export.py b/opentelemetry-sdk/tests/trace/export/test_export.py index 9cb3e83cdec..abae8a29b86 100644 --- a/opentelemetry-sdk/tests/trace/export/test_export.py +++ b/opentelemetry-sdk/tests/trace/export/test_export.py @@ -28,7 +28,7 @@ OTEL_BSP_MAX_EXPORT_BATCH_SIZE, OTEL_BSP_MAX_QUEUE_SIZE, OTEL_BSP_SCHEDULE_DELAY, - OTEL_PYTHON_SDK_METRICS_ENABLED, + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED, ) from opentelemetry.sdk.metrics import MeterProvider from opentelemetry.sdk.metrics.export import InMemoryMetricReader @@ -147,7 +147,9 @@ def test_simple_span_processor_not_sampled(self): self.assertListEqual([], spans_names_list) - @mock.patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) + @mock.patch.dict( + "os.environ", {OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED: "true"} + ) def test_metrics(self): metric_reader = InMemoryMetricReader() meter_provider = MeterProvider(metric_readers=[metric_reader]) @@ -399,7 +401,9 @@ def test_batch_span_processor_parameters(self): max_export_batch_size=512, ) - @mock.patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) + @mock.patch.dict( + "os.environ", {OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED: "true"} + ) def test_metrics(self): # pylint: disable=too-many-locals,too-many-statements metric_reader = InMemoryMetricReader() meter_provider = MeterProvider(metric_readers=[metric_reader]) diff --git a/opentelemetry-sdk/tests/trace/test_sdk_metrics.py b/opentelemetry-sdk/tests/trace/test_sdk_metrics.py index b48845cb8de..51fdd4c7155 100644 --- a/opentelemetry-sdk/tests/trace/test_sdk_metrics.py +++ b/opentelemetry-sdk/tests/trace/test_sdk_metrics.py @@ -17,7 +17,7 @@ from opentelemetry import trace as trace_api from opentelemetry.sdk.environment_variables import ( - OTEL_PYTHON_SDK_METRICS_ENABLED, + OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED, ) from opentelemetry.sdk.metrics import MeterProvider from opentelemetry.sdk.metrics.export import InMemoryMetricReader @@ -31,7 +31,7 @@ from opentelemetry.trace.span import SpanContext -@patch.dict("os.environ", {OTEL_PYTHON_SDK_METRICS_ENABLED: "true"}) +@patch.dict("os.environ", {OTEL_PYTHON_SDK_INTERNAL_METRICS_ENABLED: "true"}) class TestTracerProviderMetrics(TestCase): def setUp(self): self.metric_reader = InMemoryMetricReader()