Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 6fac795

Browse files
authored
Protect access to Span implementation (open-telemetry#1188)
1 parent 8ccc5cf commit 6fac795

File tree

15 files changed

+71
-45
lines changed

15 files changed

+71
-45
lines changed

.pylintrc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,8 @@ exclude-protected=_asdict,
441441
_fields,
442442
_replace,
443443
_source,
444-
_make
444+
_make,
445+
_Span
445446

446447
# List of valid names for the first argument in a class method.
447448
valid-classmethod-first-arg=cls

exporter/opentelemetry-exporter-datadog/tests/test_datadog_exporter.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -188,22 +188,22 @@ def test_translate_to_datadog(self):
188188
instrumentation_info = InstrumentationInfo(__name__, "0")
189189

190190
otel_spans = [
191-
trace.Span(
191+
trace._Span(
192192
name=span_names[0],
193193
context=span_context,
194194
parent=parent_context,
195195
kind=trace_api.SpanKind.CLIENT,
196196
instrumentation_info=instrumentation_info,
197197
resource=Resource({}),
198198
),
199-
trace.Span(
199+
trace._Span(
200200
name=span_names[1],
201201
context=parent_context,
202202
parent=None,
203203
instrumentation_info=instrumentation_info,
204204
resource=resource_without_service,
205205
),
206-
trace.Span(
206+
trace._Span(
207207
name=span_names[2],
208208
context=other_context,
209209
parent=None,
@@ -289,7 +289,7 @@ def test_export(self):
289289
is_remote=False,
290290
)
291291

292-
test_span = trace.Span("test_span", context=context)
292+
test_span = trace._Span("test_span", context=context)
293293
test_span.start()
294294
test_span.end()
295295

@@ -492,8 +492,8 @@ def test_origin(self):
492492
),
493493
)
494494

495-
root_span = trace.Span(name="root", context=context, parent=None)
496-
child_span = trace.Span(
495+
root_span = trace._Span(name="root", context=context, parent=None)
496+
child_span = trace._Span(
497497
name="child", context=context, parent=root_span
498498
)
499499
root_span.start()
@@ -528,7 +528,7 @@ def test_sampling_rate(self):
528528
)
529529
sampler = sampling.TraceIdRatioBased(0.5)
530530

531-
span = trace.Span(
531+
span = trace._Span(
532532
name="sampled", context=context, parent=None, sampler=sampler
533533
)
534534
span.start()

exporter/opentelemetry-exporter-datadog/tests/test_datadog_format.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ def test_context_propagation(self):
104104
)
105105
self.assertTrue(parent_context.is_remote)
106106

107-
child = trace.Span(
107+
child = trace._Span(
108108
"child",
109109
trace_api.SpanContext(
110110
parent_context.trace_id,
@@ -149,7 +149,7 @@ def test_sampling_priority_auto_reject(self):
149149

150150
self.assertEqual(parent_context.trace_flags, constants.AUTO_REJECT)
151151

152-
child = trace.Span(
152+
child = trace._Span(
153153
"child",
154154
trace_api.SpanContext(
155155
parent_context.trace_id,

exporter/opentelemetry-exporter-jaeger/tests/test_jaeger_exporter.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def setUp(self):
3636
is_remote=False,
3737
)
3838

39-
self._test_span = trace.Span("test_span", context=context)
39+
self._test_span = trace._Span("test_span", context=context)
4040
self._test_span.start()
4141
self._test_span.end()
4242

@@ -187,18 +187,20 @@ def test_translate_to_jaeger(self):
187187
]
188188

189189
otel_spans = [
190-
trace.Span(
190+
trace._Span(
191191
name=span_names[0],
192192
context=span_context,
193193
parent=parent_context,
194194
events=(event,),
195195
links=(link,),
196196
kind=trace_api.SpanKind.CLIENT,
197197
),
198-
trace.Span(
198+
trace._Span(
199199
name=span_names[1], context=parent_context, parent=None
200200
),
201-
trace.Span(name=span_names[2], context=other_context, parent=None),
201+
trace._Span(
202+
name=span_names[2], context=other_context, parent=None
203+
),
202204
]
203205

204206
otel_spans[0].start(start_time=start_times[0])

exporter/opentelemetry-exporter-opencensus/tests/test_otcollector_trace_exporter.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,21 +120,21 @@ def test_translate_to_collector(self):
120120
link_2 = trace_api.Link(
121121
context=parent_context, attributes=link_attributes
122122
)
123-
span_1 = trace.Span(
123+
span_1 = trace._Span(
124124
name="test1",
125125
context=span_context,
126126
parent=parent_context,
127127
events=(event,),
128128
links=(link_1,),
129129
kind=trace_api.SpanKind.CLIENT,
130130
)
131-
span_2 = trace.Span(
131+
span_2 = trace._Span(
132132
name="test2",
133133
context=parent_context,
134134
parent=None,
135135
kind=trace_api.SpanKind.SERVER,
136136
)
137-
span_3 = trace.Span(
137+
span_3 = trace._Span(
138138
name="test3",
139139
context=other_context,
140140
links=(link_2,),
@@ -302,7 +302,7 @@ def test_export(self):
302302
trace_flags=TraceFlags(TraceFlags.SAMPLED),
303303
)
304304
otel_spans = [
305-
trace.Span(
305+
trace._Span(
306306
name="test1",
307307
context=span_context,
308308
kind=trace_api.SpanKind.CLIENT,

exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
from opentelemetry.proto.trace.v1.trace_pb2 import Span as OTLPSpan
4646
from opentelemetry.proto.trace.v1.trace_pb2 import Status
4747
from opentelemetry.sdk.resources import Resource as SDKResource
48-
from opentelemetry.sdk.trace import Span, TracerProvider
48+
from opentelemetry.sdk.trace import TracerProvider, _Span
4949
from opentelemetry.sdk.trace.export import (
5050
SimpleExportSpanProcessor,
5151
SpanExportResult,
@@ -123,7 +123,7 @@ def setUp(self):
123123

124124
type(event_mock).name = PropertyMock(return_value="a")
125125

126-
self.span = Span(
126+
self.span = _Span(
127127
"a",
128128
context=Mock(
129129
**{

exporter/opentelemetry-exporter-zipkin/tests/test_zipkin_exporter.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def setUp(self):
4242
is_remote=False,
4343
)
4444

45-
self._test_span = trace.Span("test_span", context=context)
45+
self._test_span = trace._Span("test_span", context=context)
4646
self._test_span.start()
4747
self._test_span.end()
4848

@@ -154,18 +154,22 @@ def test_export(self):
154154
)
155155

156156
otel_spans = [
157-
trace.Span(
157+
trace._Span(
158158
name=span_names[0],
159159
context=span_context,
160160
parent=parent_context,
161161
events=(event,),
162162
links=(link,),
163163
),
164-
trace.Span(
164+
trace._Span(
165165
name=span_names[1], context=parent_context, parent=None
166166
),
167-
trace.Span(name=span_names[2], context=other_context, parent=None),
168-
trace.Span(name=span_names[3], context=other_context, parent=None),
167+
trace._Span(
168+
name=span_names[2], context=other_context, parent=None
169+
),
170+
trace._Span(
171+
name=span_names[3], context=other_context, parent=None
172+
),
169173
]
170174

171175
otel_spans[0].start(start_time=start_times[0])
@@ -328,7 +332,7 @@ def test_zero_padding(self):
328332
trace_id, parent_id, is_remote=False
329333
)
330334

331-
otel_span = trace.Span(
335+
otel_span = trace._Span(
332336
name=span_names[0], context=span_context, parent=parent_context,
333337
)
334338

@@ -387,7 +391,7 @@ def test_max_tag_length(self):
387391
trace_flags=TraceFlags(TraceFlags.SAMPLED),
388392
)
389393

390-
span = trace.Span(name="test-span", context=span_context,)
394+
span = trace._Span(name="test-span", context=span_context,)
391395

392396
span.start()
393397
span.resource = Resource({})

instrumentation/opentelemetry-instrumentation-celery/tests/test_utils.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def test_set_attributes_from_context(self):
4242
"routing_key": "celery",
4343
}
4444

45-
span = trace.Span("name", mock.Mock(spec=trace_api.SpanContext))
45+
span = trace._Span("name", mock.Mock(spec=trace_api.SpanContext))
4646
utils.set_attributes_from_context(span, context)
4747

4848
self.assertEqual(
@@ -78,7 +78,7 @@ def test_set_attributes_from_context_empty_keys(self):
7878
"retries": 0,
7979
}
8080

81-
span = trace.Span("name", mock.Mock(spec=trace_api.SpanContext))
81+
span = trace._Span("name", mock.Mock(spec=trace_api.SpanContext))
8282
utils.set_attributes_from_context(span, context)
8383

8484
self.assertEqual(len(span.attributes), 0)
@@ -99,7 +99,7 @@ def fn_task():
9999

100100
# propagate and retrieve a Span
101101
task_id = "7c6731af-9533-40c3-83a9-25b58f0d837f"
102-
span = trace.Span("name", mock.Mock(spec=trace_api.SpanContext))
102+
span = trace._Span("name", mock.Mock(spec=trace_api.SpanContext))
103103
utils.attach_span(fn_task, task_id, span)
104104
span_after = utils.retrieve_span(fn_task, task_id)
105105
self.assertIs(span, span_after)
@@ -112,7 +112,7 @@ def fn_task():
112112

113113
# propagate a Span
114114
task_id = "7c6731af-9533-40c3-83a9-25b58f0d837f"
115-
span = trace.Span("name", mock.Mock(spec=trace_api.SpanContext))
115+
span = trace._Span("name", mock.Mock(spec=trace_api.SpanContext))
116116
utils.attach_span(fn_task, task_id, span)
117117
# delete the Span
118118
utils.detach_span(fn_task, task_id)

opentelemetry-sdk/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
([#1153](https://github.com/open-telemetry/opentelemetry-python/pull/1153))
1313
- Renaming metrics Batcher to Processor
1414
([#1203](https://github.com/open-telemetry/opentelemetry-python/pull/1203))
15+
- Protect access to Span implementation
16+
([#1188](https://github.com/open-telemetry/opentelemetry-python/pull/1188))
1517

1618
## Version 0.13b0
1719

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,11 @@ class Span(trace_api.Span):
357357
this `Span`.
358358
"""
359359

360+
def __new__(cls, *args, **kwargs):
361+
if cls is Span:
362+
raise TypeError("Span must be instantiated via a tracer.")
363+
return super().__new__(cls)
364+
360365
def __init__(
361366
self,
362367
name: str,
@@ -663,6 +668,13 @@ def record_exception(self, exception: Exception) -> None:
663668
)
664669

665670

671+
class _Span(Span):
672+
"""Protected implementation of `opentelemetry.trace.Span`.
673+
674+
This constructor should only be used internally.
675+
"""
676+
677+
666678
class Tracer(trace_api.Tracer):
667679
"""See `opentelemetry.trace.Tracer`.
668680
@@ -748,7 +760,7 @@ def start_span( # pylint: disable=too-many-locals
748760
# Only record if is_recording() is true
749761
if sampling_result.decision.is_recording():
750762
# pylint:disable=protected-access
751-
span = Span(
763+
span = _Span(
752764
name=name,
753765
context=context,
754766
parent=parent_context,

opentelemetry-sdk/tests/trace/export/test_export.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ def test_simple_span_processor_not_sampled(self):
121121

122122

123123
def _create_start_and_end_span(name, span_processor):
124-
span = trace.Span(
124+
span = trace._Span(
125125
name,
126126
trace_api.SpanContext(
127127
0xDEADBEEF,
@@ -403,7 +403,7 @@ def test_export(self): # pylint: disable=no-self-use
403403

404404
# Mocking stdout interferes with debugging and test reporting, mock on
405405
# the exporter instance instead.
406-
span = trace.Span("span name", trace_api.INVALID_SPAN_CONTEXT)
406+
span = trace._Span("span name", trace_api.INVALID_SPAN_CONTEXT)
407407
with mock.patch.object(exporter, "out") as mock_stdout:
408408
exporter.export([span])
409409
mock_stdout.write.assert_called_once_with(span.to_json() + os.linesep)
@@ -421,5 +421,5 @@ def formatter(span): # pylint: disable=unused-argument
421421
exporter = export.ConsoleSpanExporter(
422422
out=mock_stdout, formatter=formatter
423423
)
424-
exporter.export([trace.Span("span name", mock.Mock())])
424+
exporter.export([trace._Span("span name", mock.Mock())])
425425
mock_stdout.write.assert_called_once_with(mock_span_str)

opentelemetry-sdk/tests/trace/export/test_in_memory_span_exporter.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def test_shutdown(self):
6161
self.assertEqual(len(span_list), 3)
6262

6363
def test_return_code(self):
64-
span = trace.Span("name", mock.Mock(spec=trace_api.SpanContext))
64+
span = trace._Span("name", mock.Mock(spec=trace_api.SpanContext))
6565
span_list = (span,)
6666
memory_exporter = InMemorySpanExporter()
6767

opentelemetry-sdk/tests/trace/propagation/test_b3_format.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ def get_child_parent_new_carrier(old_carrier):
3333
ctx = FORMAT.extract(get_as_list, old_carrier)
3434
parent_context = trace_api.get_current_span(ctx).get_context()
3535

36-
parent = trace.Span("parent", parent_context)
37-
child = trace.Span(
36+
parent = trace._Span("parent", parent_context)
37+
child = trace._Span(
3838
"child",
3939
trace_api.SpanContext(
4040
parent_context.trace_id,

opentelemetry-sdk/tests/trace/test_implementation.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,8 @@ def test_tracer(self):
4040
def test_span(self):
4141
with self.assertRaises(Exception):
4242
# pylint: disable=no-value-for-parameter
43-
span = trace.Span()
43+
span = trace._Span()
4444

45-
span = trace.Span("name", INVALID_SPAN_CONTEXT)
45+
span = trace._Span("name", INVALID_SPAN_CONTEXT)
4646
self.assertEqual(span.get_context(), INVALID_SPAN_CONTEXT)
4747
self.assertIs(span.is_recording(), True)

0 commit comments

Comments
 (0)