Skip to content

Commit ebcf317

Browse files
author
Puskar Deb
committed
Adds support OTEL_SDK_DISABLED environment variable
1 parent 975733c commit ebcf317

File tree

7 files changed

+55
-2
lines changed

7 files changed

+55
-2
lines changed

opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/__init__.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
from opentelemetry.sdk.environment_variables import (
3838
OTEL_ATTRIBUTE_COUNT_LIMIT,
3939
OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT,
40+
OTEL_SDK_DISABLED,
4041
)
4142
from opentelemetry.sdk.resources import Resource
4243
from opentelemetry.sdk.util import ns_to_iso_str
@@ -596,6 +597,10 @@ def __init__(
596597
self._multi_log_record_processor = (
597598
multi_log_record_processor or SynchronousMultiLogRecordProcessor()
598599
)
600+
disabled = environ.get(OTEL_SDK_DISABLED)
601+
if disabled is None:
602+
disabled = "false"
603+
self._disabled = disabled.lower().strip() == "true"
599604
self._at_exit_handler = None
600605
if shutdown_on_exit:
601606
self._at_exit_handler = atexit.register(self.shutdown)
@@ -610,6 +615,9 @@ def get_logger(
610615
version: Optional[str] = None,
611616
schema_url: Optional[str] = None,
612617
) -> Logger:
618+
if self._disabled:
619+
_logger.warning("SDK is disabled.")
620+
return NoOpLogger(name)
613621
return Logger(
614622
self._resource,
615623
self._multi_log_record_processor,

opentelemetry-sdk/src/opentelemetry/sdk/environment_variables.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,14 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15+
OTEL_SDK_DISABLED = "OTEL_SDK_DISABLED"
16+
"""
17+
.. envvar:: OTEL_SDK_DISABLED
18+
19+
The :envvar:`OTEL_SDK_DISABLED` environment variable disables the SDK for all signals
20+
Default: "false"
21+
"""
22+
1523
OTEL_RESOURCE_ATTRIBUTES = "OTEL_RESOURCE_ATTRIBUTES"
1624
"""
1725
.. envvar:: OTEL_RESOURCE_ATTRIBUTES

opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/__init__.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
from atexit import register, unregister
1616
from logging import getLogger
17+
from os import environ
1718
from threading import Lock
1819
from time import time_ns
1920
from typing import Optional, Sequence
@@ -31,6 +32,7 @@
3132
ObservableUpDownCounter as APIObservableUpDownCounter,
3233
)
3334
from opentelemetry.metrics import UpDownCounter as APIUpDownCounter
35+
from opentelemetry.sdk.environment_variables import OTEL_SDK_DISABLED
3436
from opentelemetry.sdk.metrics._internal.exceptions import MetricsTimeoutError
3537
from opentelemetry.sdk.metrics._internal.instrument import (
3638
_Counter,
@@ -358,6 +360,10 @@ def __init__(
358360
self._measurement_consumer = SynchronousMeasurementConsumer(
359361
sdk_config=self._sdk_config
360362
)
363+
disabled = environ.get(OTEL_SDK_DISABLED)
364+
if disabled is None:
365+
disabled = "false"
366+
self._disabled = disabled.lower().strip() == "true"
361367

362368
if shutdown_on_exit:
363369
self._atexit_handler = register(self.shutdown)
@@ -476,6 +482,10 @@ def get_meter(
476482
schema_url: Optional[str] = None,
477483
) -> Meter:
478484

485+
if self._disabled:
486+
_logger.warning("SDK is disabled.")
487+
return NoOpMeter(name)
488+
479489
if self._shutdown:
480490
_logger.warning(
481491
"A shutdown `MeterProvider` can not provide a `Meter`"

opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT,
5151
OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT,
5252
OTEL_LINK_ATTRIBUTE_COUNT_LIMIT,
53+
OTEL_SDK_DISABLED,
5354
OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT,
5455
OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT,
5556
OTEL_SPAN_EVENT_COUNT_LIMIT,
@@ -63,7 +64,7 @@
6364
InstrumentationInfo,
6465
InstrumentationScope,
6566
)
66-
from opentelemetry.trace import SpanContext
67+
from opentelemetry.trace import NoOpTracer, SpanContext
6768
from opentelemetry.trace.status import Status, StatusCode
6869
from opentelemetry.util import types
6970

@@ -1152,6 +1153,10 @@ def __init__(
11521153
sampler = sampling._get_from_env_or_default()
11531154
self.sampler = sampler
11541155
self._span_limits = span_limits or SpanLimits()
1156+
disabled = environ.get(OTEL_SDK_DISABLED)
1157+
if disabled is None:
1158+
disabled = "false"
1159+
self._disabled = disabled.lower().strip() == "true"
11551160
self._atexit_handler = None
11561161

11571162
if shutdown_on_exit:
@@ -1167,6 +1172,9 @@ def get_tracer(
11671172
instrumenting_library_version: typing.Optional[str] = None,
11681173
schema_url: typing.Optional[str] = None,
11691174
) -> "trace_api.Tracer":
1175+
if self._disabled:
1176+
logger.warning("SDK is disabled.")
1177+
return NoOpTracer()
11701178
if not instrumenting_module_name: # Reject empty strings too.
11711179
instrumenting_module_name = ""
11721180
logger.error("get_tracer called with missing module name.")

opentelemetry-sdk/tests/logs/test_logs.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@
1515
# pylint: disable=protected-access
1616

1717
import unittest
18-
from unittest.mock import patch
18+
from unittest.mock import Mock, patch
1919

2020
from opentelemetry.sdk._logs import LoggerProvider
2121
from opentelemetry.sdk._logs._internal import (
22+
NoOpLogger,
2223
SynchronousMultiLogRecordProcessor,
2324
)
25+
from opentelemetry.sdk.environment_variables import OTEL_SDK_DISABLED
2426
from opentelemetry.sdk.resources import Resource
2527

2628

@@ -61,6 +63,11 @@ def test_get_logger(self):
6163
logger._instrumentation_scope.schema_url, "schema_url"
6264
)
6365

66+
@patch.dict("os.environ", {OTEL_SDK_DISABLED: "true"})
67+
def test_get_logger_with_sdk_disabled(self):
68+
logger = LoggerProvider().get_logger(Mock())
69+
self.assertIsInstance(logger, NoOpLogger)
70+
6471
@patch.object(Resource, "create")
6572
def test_logger_provider_init(self, resource_patch):
6673
logger_provider = LoggerProvider()

opentelemetry-sdk/tests/metrics/test_metrics.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from unittest.mock import MagicMock, Mock, patch
2121

2222
from opentelemetry.metrics import NoOpMeter
23+
from opentelemetry.sdk.environment_variables import OTEL_SDK_DISABLED
2324
from opentelemetry.sdk.metrics import (
2425
Counter,
2526
Histogram,
@@ -445,6 +446,11 @@ def test_create_observable_up_down_counter(self):
445446
observable_up_down_counter, ObservableUpDownCounter
446447
)
447448
self.assertEqual(observable_up_down_counter.name, "name")
449+
450+
@patch.dict("os.environ", {OTEL_SDK_DISABLED: "true"})
451+
def test_get_meter_with_sdk_disabled(self):
452+
meter_provider = MeterProvider()
453+
self.assertIsInstance(meter_provider.get_meter(Mock()), NoOpMeter)
448454

449455

450456
class InMemoryMetricExporter(MetricExporter):

opentelemetry-sdk/tests/trace/test_trace.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT,
3838
OTEL_SPAN_EVENT_COUNT_LIMIT,
3939
OTEL_SPAN_LINK_COUNT_LIMIT,
40+
OTEL_SDK_DISABLED,
4041
OTEL_TRACES_SAMPLER,
4142
OTEL_TRACES_SAMPLER_ARG,
4243
)
@@ -162,6 +163,11 @@ def test_tracer_provider_accepts_concurrent_multi_span_processor(self):
162163
span_processor, tracer_provider._active_span_processor
163164
)
164165

166+
@mock.patch.dict("os.environ", {OTEL_SDK_DISABLED: "true"})
167+
def test_get_tracer_with_sdk_disabled(self):
168+
tracer_provider = trace.TracerProvider()
169+
self.assertIsInstance(tracer_provider.get_tracer(Mock()), trace_api.NoOpTracer)
170+
165171

166172
class TestTracerSampling(unittest.TestCase):
167173
def tearDown(self):

0 commit comments

Comments
 (0)