Skip to content

Commit 85a2f43

Browse files
ocelotllzchen
andauthored
Stop TracerProvider from being overridden (open-telemetry#959)
Co-authored-by: Leighton Chen <[email protected]>
1 parent 590c32c commit 85a2f43

File tree

6 files changed

+61
-38
lines changed

6 files changed

+61
-38
lines changed

opentelemetry-api/CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
- Update environment variable names, prefix changed from `OPENTELEMETRY` to `OTEL`
66
([#904](https://github.com/open-telemetry/opentelemetry-python/pull/904))
7+
- Stop TracerProvider and MeterProvider from being overridden
8+
([#959](https://github.com/open-telemetry/opentelemetry-python/pull/959))
79

810
## Version 0.11b0
911

opentelemetry-api/src/opentelemetry/metrics/__init__.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,8 @@ def set_meter_provider(meter_provider: MeterProvider) -> None:
459459
global _METER_PROVIDER # pylint: disable=global-statement
460460

461461
if _METER_PROVIDER is not None:
462-
logger.warning("Overriding current MeterProvider")
462+
logger.warning("Overriding of current MeterProvider is not allowed")
463+
return
463464

464465
_METER_PROVIDER = meter_provider
465466

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

+39-33
Original file line numberDiff line numberDiff line change
@@ -70,44 +70,13 @@
7070
`set_tracer_provider`.
7171
"""
7272

73-
__all__ = [
74-
"DEFAULT_TRACE_OPTIONS",
75-
"DEFAULT_TRACE_STATE",
76-
"INVALID_SPAN",
77-
"INVALID_SPAN_CONTEXT",
78-
"INVALID_SPAN_ID",
79-
"INVALID_TRACE_ID",
80-
"DefaultSpan",
81-
"DefaultTracer",
82-
"DefaultTracerProvider",
83-
"LazyLink",
84-
"Link",
85-
"LinkBase",
86-
"ParentSpan",
87-
"Span",
88-
"SpanContext",
89-
"SpanKind",
90-
"TraceFlags",
91-
"TraceState",
92-
"TracerProvider",
93-
"Tracer",
94-
"format_span_id",
95-
"format_trace_id",
96-
"get_current_span",
97-
"get_tracer",
98-
"get_tracer_provider",
99-
"set_tracer_provider",
100-
"set_span_in_context",
101-
]
10273

10374
import abc
10475
import enum
105-
import types as python_types
10676
import typing
10777
from contextlib import contextmanager
10878
from logging import getLogger
10979

110-
from opentelemetry.configuration import Configuration
11180
from opentelemetry.trace.propagation import (
11281
get_current_span,
11382
set_span_in_context,
@@ -461,11 +430,16 @@ def get_tracer(
461430

462431

463432
def set_tracer_provider(tracer_provider: TracerProvider) -> None:
464-
"""Sets the current global :class:`~.TracerProvider` object."""
433+
"""Sets the current global :class:`~.TracerProvider` object.
434+
435+
This can only be done once, a warning will be logged if any furter attempt
436+
is made.
437+
"""
465438
global _TRACER_PROVIDER # pylint: disable=global-statement
466439

467440
if _TRACER_PROVIDER is not None:
468-
logger.warning("Overriding current TracerProvider")
441+
logger.warning("Overriding of current TracerProvider is not allowed")
442+
return
469443

470444
_TRACER_PROVIDER = tracer_provider
471445

@@ -478,3 +452,35 @@ def get_tracer_provider() -> TracerProvider:
478452
_TRACER_PROVIDER = _load_trace_provider("tracer_provider")
479453

480454
return _TRACER_PROVIDER
455+
456+
457+
__all__ = [
458+
"DEFAULT_TRACE_OPTIONS",
459+
"DEFAULT_TRACE_STATE",
460+
"INVALID_SPAN",
461+
"INVALID_SPAN_CONTEXT",
462+
"INVALID_SPAN_ID",
463+
"INVALID_TRACE_ID",
464+
"DefaultSpan",
465+
"DefaultTracer",
466+
"DefaultTracerProvider",
467+
"LazyLink",
468+
"Link",
469+
"LinkBase",
470+
"ParentSpan",
471+
"Span",
472+
"SpanContext",
473+
"SpanKind",
474+
"TraceFlags",
475+
"TraceState",
476+
"TracerProvider",
477+
"Tracer",
478+
"format_span_id",
479+
"format_trace_id",
480+
"get_current_span",
481+
"get_tracer",
482+
"get_tracer_provider",
483+
"set_tracer_provider",
484+
"set_span_in_context",
485+
"Status",
486+
]

opentelemetry-api/tests/metrics/test_globals.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ def test_meter_provider_override_warning(self):
1616
test.output,
1717
[
1818
(
19-
"WARNING:opentelemetry.metrics:Overriding current "
20-
"MeterProvider"
19+
"WARNING:opentelemetry.metrics:Overriding of current "
20+
"MeterProvider is not allowed"
2121
)
2222
],
2323
)

opentelemetry-api/tests/trace/test_globals.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,19 @@ def test_get_tracer(self):
2525
def test_tracer_provider_override_warning(self):
2626
"""trace.set_tracer_provider should throw a warning when overridden"""
2727
trace.set_tracer_provider(TracerProvider())
28+
tracer_provider = trace.get_tracer_provider()
2829
with self.assertLogs(level=WARNING) as test:
2930
trace.set_tracer_provider(TracerProvider())
3031
self.assertEqual(
3132
test.output,
3233
[
3334
(
34-
"WARNING:opentelemetry.trace:Overriding current "
35-
"TracerProvider"
35+
"WARNING:opentelemetry.trace:Overriding of current "
36+
"TracerProvider is not allowed"
3637
)
3738
],
3839
)
40+
self.assertIs(tracer_provider, trace.get_tracer_provider())
3941

4042

4143
class TestTracer(unittest.TestCase):

tests/util/src/opentelemetry/test/test_base.py

+12
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,27 @@ def setUpClass(cls):
3434
cls.original_tracer_provider = trace_api.get_tracer_provider()
3535
result = cls.create_tracer_provider()
3636
cls.tracer_provider, cls.memory_exporter = result
37+
# This is done because set_tracer_provider cannot override the
38+
# current tracer provider.
39+
trace_api._TRACER_PROVIDER = None # pylint: disable=protected-access
3740
trace_api.set_tracer_provider(cls.tracer_provider)
3841
cls.original_meter_provider = metrics_api.get_meter_provider()
3942
result = cls.create_meter_provider()
4043
cls.meter_provider, cls.memory_metrics_exporter = result
44+
# This is done because set_meter_provider cannot override the
45+
# current meter provider.
46+
metrics_api._METER_PROVIDER = None # pylint: disable=protected-access
4147
metrics_api.set_meter_provider(cls.meter_provider)
4248

4349
@classmethod
4450
def tearDownClass(cls):
51+
# This is done because set_tracer_provider cannot override the
52+
# current tracer provider.
53+
trace_api._TRACER_PROVIDER = None # pylint: disable=protected-access
4554
trace_api.set_tracer_provider(cls.original_tracer_provider)
55+
# This is done because set_meter_provider cannot override the
56+
# current meter provider.
57+
metrics_api._METER_PROVIDER = None # pylint: disable=protected-access
4658
metrics_api.set_meter_provider(cls.original_meter_provider)
4759

4860
def setUp(self):

0 commit comments

Comments
 (0)