diff --git a/.pylintrc b/.pylintrc index 5daedb0139..6ddaf0e9fb 100644 --- a/.pylintrc +++ b/.pylintrc @@ -445,8 +445,7 @@ exclude-protected=_asdict, _fields, _replace, _source, - _make, - _Span + _make # List of valid names for the first argument in a class method. valid-classmethod-first-arg=cls diff --git a/exporter/opentelemetry-exporter-jaeger/tests/test_jaeger_exporter.py b/exporter/opentelemetry-exporter-jaeger/tests/test_jaeger_exporter.py index 75ab622c95..cce662b09f 100644 --- a/exporter/opentelemetry-exporter-jaeger/tests/test_jaeger_exporter.py +++ b/exporter/opentelemetry-exporter-jaeger/tests/test_jaeger_exporter.py @@ -22,8 +22,7 @@ from opentelemetry import trace as trace_api from opentelemetry.configuration import Configuration from opentelemetry.exporter.jaeger.gen.jaeger import ttypes as jaeger -from opentelemetry.sdk import trace -from opentelemetry.sdk.trace import Resource +from opentelemetry.sdk.trace import _ReadWriteSpan, Resource from opentelemetry.sdk.util.instrumentation import InstrumentationInfo from opentelemetry.trace import SpanKind from opentelemetry.trace.status import Status, StatusCode @@ -38,7 +37,7 @@ def setUp(self): is_remote=False, ) - self._test_span = trace._Span("test_span", context=context) + self._test_span = _ReadWriteSpan("test_span", context=context) self._test_span.start() self._test_span.end() # pylint: disable=protected-access @@ -230,7 +229,7 @@ def test_translate_to_jaeger(self): ] otel_spans = [ - trace._Span( + _ReadWriteSpan( name=span_names[0], context=span_context, parent=parent_span_context, @@ -238,10 +237,10 @@ def test_translate_to_jaeger(self): links=(link,), kind=trace_api.SpanKind.CLIENT, ), - trace._Span( + _ReadWriteSpan( name=span_names[1], context=parent_span_context, parent=None ), - trace._Span( + _ReadWriteSpan( name=span_names[2], context=other_context, parent=None ), ] diff --git a/exporter/opentelemetry-exporter-opencensus/tests/test_otcollector_trace_exporter.py b/exporter/opentelemetry-exporter-opencensus/tests/test_otcollector_trace_exporter.py index b61cf333cc..0d835e2ff9 100644 --- a/exporter/opentelemetry-exporter-opencensus/tests/test_otcollector_trace_exporter.py +++ b/exporter/opentelemetry-exporter-opencensus/tests/test_otcollector_trace_exporter.py @@ -25,7 +25,7 @@ OpenCensusSpanExporter, translate_to_collector, ) -from opentelemetry.sdk import trace +from opentelemetry.sdk.trace import _ReadWriteSpan, Event from opentelemetry.sdk.trace.export import SpanExportResult from opentelemetry.trace import TraceFlags @@ -108,7 +108,7 @@ def test_translate_to_collector(self): "key_float": 0.3, } event_timestamp = base_time + 50 * 10 ** 6 - event = trace.Event( + event = Event( name="event0", timestamp=event_timestamp, attributes=event_attributes, @@ -120,7 +120,7 @@ def test_translate_to_collector(self): link_2 = trace_api.Link( context=parent_span_context, attributes=link_attributes ) - span_1 = trace._Span( + span_1 = _ReadWriteSpan( name="test1", context=span_context, parent=parent_span_context, @@ -128,13 +128,13 @@ def test_translate_to_collector(self): links=(link_1,), kind=trace_api.SpanKind.CLIENT, ) - span_2 = trace._Span( + span_2 = _ReadWriteSpan( name="test2", context=parent_span_context, parent=None, kind=trace_api.SpanKind.SERVER, ) - span_3 = trace._Span( + span_3 = _ReadWriteSpan( name="test3", context=other_context, links=(link_2,), @@ -300,7 +300,7 @@ def test_export(self): trace_flags=TraceFlags(TraceFlags.SAMPLED), ) otel_spans = [ - trace._Span( + _ReadWriteSpan( name="test1", context=span_context, kind=trace_api.SpanKind.CLIENT, diff --git a/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py b/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py index b691e85849..5fd5691e81 100644 --- a/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py +++ b/exporter/opentelemetry-exporter-otlp/tests/test_otlp_trace_exporter.py @@ -47,7 +47,7 @@ from opentelemetry.proto.trace.v1.trace_pb2 import Span as OTLPSpan from opentelemetry.proto.trace.v1.trace_pb2 import Status from opentelemetry.sdk.resources import Resource as SDKResource -from opentelemetry.sdk.trace import TracerProvider, _Span +from opentelemetry.sdk.trace import _ReadWriteSpan, TracerProvider from opentelemetry.sdk.trace.export import ( SimpleExportSpanProcessor, SpanExportResult, @@ -127,7 +127,7 @@ def setUp(self): type(event_mock).name = PropertyMock(return_value="a") - self.span = _Span( + self.span = _ReadWriteSpan( "a", context=Mock( **{ diff --git a/exporter/opentelemetry-exporter-zipkin/tests/test_zipkin_exporter.py b/exporter/opentelemetry-exporter-zipkin/tests/test_zipkin_exporter.py index eb3f4894c1..a1368c3292 100644 --- a/exporter/opentelemetry-exporter-zipkin/tests/test_zipkin_exporter.py +++ b/exporter/opentelemetry-exporter-zipkin/tests/test_zipkin_exporter.py @@ -28,8 +28,7 @@ nsec_to_usec_round, ) from opentelemetry.exporter.zipkin.gen import zipkin_pb2 -from opentelemetry.sdk import trace -from opentelemetry.sdk.trace import Resource +from opentelemetry.sdk.trace import _ReadWriteSpan, Event, Resource from opentelemetry.sdk.trace.export import SpanExportResult from opentelemetry.sdk.util.instrumentation import InstrumentationInfo from opentelemetry.trace import SpanKind, TraceFlags @@ -51,7 +50,7 @@ def setUp(self): is_remote=False, ) - self._test_span = trace._Span("test_span", context=context) + self._test_span = _ReadWriteSpan("test_span", context=context) self._test_span.start() self._test_span.end() @@ -166,7 +165,7 @@ def test_export_json(self): } event_timestamp = base_time + 50 * 10 ** 6 - event = trace.Event( + event = Event( name="event0", timestamp=event_timestamp, attributes=event_attributes, @@ -179,20 +178,20 @@ def test_export_json(self): ) otel_spans = [ - trace._Span( + _ReadWriteSpan( name=span_names[0], context=span_context, parent=parent_span_context, events=(event,), links=(link,), ), - trace._Span( + _ReadWriteSpan( name=span_names[1], context=parent_span_context, parent=None ), - trace._Span( + _ReadWriteSpan( name=span_names[2], context=other_context, parent=None ), - trace._Span( + _ReadWriteSpan( name=span_names[3], context=other_context, parent=None ), ] @@ -354,7 +353,7 @@ def test_export_json_zero_padding(self): trace_id, parent_id, is_remote=False ) - otel_span = trace._Span( + otel_span = _ReadWriteSpan( name=span_names[0], context=span_context, parent=parent_span_context, @@ -415,7 +414,7 @@ def test_export_json_max_tag_length(self): trace_flags=TraceFlags(TraceFlags.SAMPLED), ) - span = trace._Span(name="test-span", context=span_context,) + span = _ReadWriteSpan(name="test-span", context=span_context,) span.start() span.resource = Resource({}) @@ -686,7 +685,7 @@ def test_export_protobuf(self): } event_timestamp = base_time + 50 * 10 ** 6 - event = trace.Event( + event = Event( name="event0", timestamp=event_timestamp, attributes=event_attributes, @@ -699,20 +698,20 @@ def test_export_protobuf(self): ) otel_spans = [ - trace._Span( + _ReadWriteSpan( name=span_names[0], context=span_context, parent=parent_span_context, events=(event,), links=(link,), ), - trace._Span( + _ReadWriteSpan( name=span_names[1], context=parent_span_context, parent=None ), - trace._Span( + _ReadWriteSpan( name=span_names[2], context=other_context, parent=None ), - trace._Span( + _ReadWriteSpan( name=span_names[3], context=other_context, parent=None ), ] @@ -871,7 +870,7 @@ def test_export_protobuf_max_tag_length(self): trace_flags=TraceFlags(TraceFlags.SAMPLED), ) - span = trace._Span(name="test-span", context=span_context,) + span = _ReadWriteSpan(name="test-span", context=span_context,) span.start() span.resource = Resource({}) diff --git a/instrumentation/opentelemetry-instrumentation-opentracing-shim/tests/test_shim.py b/instrumentation/opentelemetry-instrumentation-opentracing-shim/tests/test_shim.py index 151ca07ba9..5d412254ab 100644 --- a/instrumentation/opentelemetry-instrumentation-opentracing-shim/tests/test_shim.py +++ b/instrumentation/opentelemetry-instrumentation-opentracing-shim/tests/test_shim.py @@ -404,9 +404,9 @@ def test_tags(self): tags = {"foo": "bar"} with self.shim.start_active_span("TestSetTag", tags=tags) as scope: scope.span.set_tag("baz", "qux") - - self.assertEqual(scope.span.unwrap().attributes["foo"], "bar") - self.assertEqual(scope.span.unwrap().attributes["baz"], "qux") + span = scope.span.unwrap()._data # pylint: disable=protected-access + self.assertEqual(span.attributes["foo"], "bar") + self.assertEqual(span.attributes["baz"], "qux") def test_span_tracer(self): """Test the `tracer` property on `Span` objects.""" @@ -479,7 +479,7 @@ def test_span_on_error(self): raise Exception # Verify exception details have been added to span. - self.assertEqual(scope.span.unwrap().attributes["error"], True) + self.assertEqual(scope.span.unwrap()._data.attributes["error"], True) # pylint: disable=protected-access def test_inject_http_headers(self): """Test `inject()` method for Format.HTTP_HEADERS.""" diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py index cd087a7314..e3a96d7e18 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py @@ -385,11 +385,11 @@ def wrapper(self, *args, **kwargs): return wrapper -class Span(trace_api.Span): +class _ReadWriteSpan(trace_api.Span): """See `opentelemetry.trace.Span`. - Users should create `Span` objects via the `Tracer` instead of this - constructor. + Span implementation with ReadWrite access specific use cases. + This constructor should only be used internally. Args: name: The name of the operation this span represents @@ -405,12 +405,6 @@ class Span(trace_api.Span): span_processor: `SpanProcessor` to invoke when starting and ending this `Span`. """ - - def __new__(cls, *args, **kwargs): - if cls is Span: - raise TypeError("Span must be instantiated via a tracer.") - return super().__new__(cls) - # pylint: disable=too-many-locals def __init__( self, @@ -519,7 +513,9 @@ def _format_events(events): f_event = OrderedDict() f_event["name"] = event.name f_event["timestamp"] = util.ns_to_iso_str(event.timestamp) - f_event["attributes"] = Span._format_attributes(event.attributes) + f_event["attributes"] = _ReadWriteSpan._format_attributes( + event.attributes + ) f_events.append(f_event) return f_events @@ -528,8 +524,10 @@ def _format_links(links): f_links = [] for link in links: f_link = OrderedDict() - f_link["context"] = Span._format_context(link.context) - f_link["attributes"] = Span._format_attributes(link.attributes) + f_link["context"] = _ReadWriteSpan._format_context(link.context) + f_link["attributes"] = _ReadWriteSpan._format_attributes( + link.attributes + ) f_links.append(f_link) return f_links @@ -715,6 +713,89 @@ def record_exception( ) +class Span(trace_api.Span): + """See `opentelemetry.trace.Span`. + + Users should create `Span` objects via the `Tracer` instead of this + constructor. + + Args: + read_write_span: inherent _ReadWriteSpan contained within `Span` which is WriteOnly + """ + + def __new__(cls, *args, **kwargs): + if cls is Span: + raise TypeError("Span must be instantiated via a tracer.") + return super().__new__(cls) + + def __init__( + self, + read_write_span: _ReadWriteSpan + ) -> None: + self._data = read_write_span + + @property + def start_time(self): + return self._data.start_time + + @property + def end_time(self): + return self._data.end_time + + def __repr__(self): + return '{}(name="{}", context={})'.format( + type(self).__name__, self._data.name, self._data.context + ) + + def to_json(self, indent=4): + return self._data.to_json() + + def get_span_context(self): + return self._data.context + + def set_attribute(self, key: str, value: types.AttributeValue) -> None: + self._data.set_attribute(key, value) + + def add_event( + self, + name: str, + attributes: types.Attributes = None, + timestamp: Optional[int] = None, + ) -> None: + self._data.add_event(name, attributes, timestamp) + + def start( + self, + start_time: Optional[int] = None, + parent_context: Optional[context_api.Context] = None, + ) -> None: + self._data.start(start_time, parent_context) + + def end(self, end_time: Optional[int] = None) -> None: + self._data.end(end_time) + + @_check_span_ended + def update_name(self, name: str) -> None: + self._data.update_name(name) + + def is_recording(self) -> bool: + return self._data.is_recording() + + @_check_span_ended + def set_status(self, status: trace_api.Status) -> None: + self._data.set_status(status) + + def record_exception( + self, + exception: Exception, + attributes: types.Attributes = None, + timestamp: Optional[int] = None, + escaped: bool = False, + ) -> None: + """Records an exception as a span event.""" + self._data.record_exception(exception, attributes, timestamp, escaped) + + class _Span(Span): """Protected implementation of `opentelemetry.trace.Span`. @@ -823,20 +904,21 @@ def start_span( # pylint: disable=too-many-locals # Only record if is_recording() is true if sampling_result.decision.is_recording(): - # pylint:disable=protected-access span = _Span( - name=name, - context=span_context, - parent=parent_span_context, - sampler=self.sampler, - resource=self.resource, - attributes=sampling_result.attributes.copy(), - span_processor=self.span_processor, - kind=kind, - links=links, - instrumentation_info=self.instrumentation_info, - record_exception=record_exception, - set_status_on_exception=set_status_on_exception, + _ReadWriteSpan( + name=name, + context=span_context, + parent=parent_span_context, + sampler=self.sampler, + resource=self.resource, + attributes=sampling_result.attributes.copy(), + span_processor=self.span_processor, + kind=kind, + links=links, + instrumentation_info=self.instrumentation_info, + record_exception=record_exception, + set_status_on_exception=set_status_on_exception, + ) ) span.start(start_time=start_time, parent_context=context) else: diff --git a/opentelemetry-sdk/tests/trace/export/test_export.py b/opentelemetry-sdk/tests/trace/export/test_export.py index 92d4f65d13..2c884c7eb8 100644 --- a/opentelemetry-sdk/tests/trace/export/test_export.py +++ b/opentelemetry-sdk/tests/trace/export/test_export.py @@ -24,7 +24,7 @@ from opentelemetry.configuration import Configuration from opentelemetry.context import Context from opentelemetry.sdk import trace -from opentelemetry.sdk.trace import export +from opentelemetry.sdk.trace import _ReadWriteSpan, export class MySpanExporter(export.SpanExporter): @@ -140,7 +140,7 @@ def test_simple_span_processor_not_sampled(self): def _create_start_and_end_span(name, span_processor): - span = trace._Span( + span = _ReadWriteSpan( name, trace_api.SpanContext( 0xDEADBEEF, @@ -481,7 +481,7 @@ def test_export(self): # pylint: disable=no-self-use exporter = export.ConsoleSpanExporter() # Mocking stdout interferes with debugging and test reporting, mock on # the exporter instance instead. - span = trace._Span("span name", trace_api.INVALID_SPAN_CONTEXT) + span = _ReadWriteSpan("span name", trace_api.INVALID_SPAN_CONTEXT) with mock.patch.object(exporter, "out") as mock_stdout: exporter.export([span]) mock_stdout.write.assert_called_once_with(span.to_json() + os.linesep) @@ -500,5 +500,5 @@ def formatter(span): # pylint: disable=unused-argument exporter = export.ConsoleSpanExporter( out=mock_stdout, formatter=formatter ) - exporter.export([trace._Span("span name", mock.Mock())]) + exporter.export([_ReadWriteSpan("span name", mock.Mock())]) mock_stdout.write.assert_called_once_with(mock_span_str) diff --git a/opentelemetry-sdk/tests/trace/export/test_in_memory_span_exporter.py b/opentelemetry-sdk/tests/trace/export/test_in_memory_span_exporter.py index e45e8ee8fd..0d836963ec 100644 --- a/opentelemetry-sdk/tests/trace/export/test_in_memory_span_exporter.py +++ b/opentelemetry-sdk/tests/trace/export/test_in_memory_span_exporter.py @@ -17,7 +17,7 @@ from opentelemetry import trace as trace_api from opentelemetry.sdk import trace -from opentelemetry.sdk.trace import export +from opentelemetry.sdk.trace import _ReadWriteSpan, export from opentelemetry.sdk.trace.export.in_memory_span_exporter import ( InMemorySpanExporter, ) @@ -61,7 +61,7 @@ def test_shutdown(self): self.assertEqual(len(span_list), 3) def test_return_code(self): - span = trace._Span("name", mock.Mock(spec=trace_api.SpanContext)) + span = _ReadWriteSpan("name", mock.Mock(spec=trace_api.SpanContext)) span_list = (span,) memory_exporter = InMemorySpanExporter() diff --git a/opentelemetry-sdk/tests/trace/propagation/test_b3_format.py b/opentelemetry-sdk/tests/trace/propagation/test_b3_format.py index 93d5bbe56e..0e8255fcfe 100644 --- a/opentelemetry-sdk/tests/trace/propagation/test_b3_format.py +++ b/opentelemetry-sdk/tests/trace/propagation/test_b3_format.py @@ -19,6 +19,7 @@ import opentelemetry.sdk.trace.propagation.b3_format as b3_format import opentelemetry.trace as trace_api from opentelemetry.context import get_current +from opentelemetry.sdk.trace import _ReadWriteSpan from opentelemetry.trace.propagation.textmap import DictGetter FORMAT = b3_format.B3Format() @@ -32,8 +33,8 @@ def get_child_parent_new_carrier(old_carrier): ctx = FORMAT.extract(carrier_getter, old_carrier) parent_span_context = trace_api.get_current_span(ctx).get_span_context() - parent = trace._Span("parent", parent_span_context) - child = trace._Span( + parent = _ReadWriteSpan("parent", parent_span_context) + child = _ReadWriteSpan( "child", trace_api.SpanContext( parent_span_context.trace_id, diff --git a/opentelemetry-sdk/tests/trace/propagation/test_jaeger_propagator.py b/opentelemetry-sdk/tests/trace/propagation/test_jaeger_propagator.py index bd80770368..ed350b892c 100644 --- a/opentelemetry-sdk/tests/trace/propagation/test_jaeger_propagator.py +++ b/opentelemetry-sdk/tests/trace/propagation/test_jaeger_propagator.py @@ -16,6 +16,7 @@ from unittest.mock import Mock import opentelemetry.sdk.trace as trace +from opentelemetry.sdk.trace import _ReadWriteSpan import opentelemetry.sdk.trace.propagation.jaeger_propagator as jaeger import opentelemetry.trace as trace_api from opentelemetry import baggage @@ -35,8 +36,8 @@ def get_context_new_carrier(old_carrier, carrier_baggage=None): ctx = baggage.set_baggage(key, value, ctx) parent_span_context = trace_api.get_current_span(ctx).get_span_context() - parent = trace._Span("parent", parent_span_context) - child = trace._Span( + parent = _ReadWriteSpan("parent", parent_span_context) + child = _ReadWriteSpan( "child", trace_api.SpanContext( parent_span_context.trace_id, diff --git a/opentelemetry-sdk/tests/trace/test_implementation.py b/opentelemetry-sdk/tests/trace/test_implementation.py index 961e68d986..0a8a809926 100644 --- a/opentelemetry-sdk/tests/trace/test_implementation.py +++ b/opentelemetry-sdk/tests/trace/test_implementation.py @@ -14,7 +14,7 @@ import unittest -from opentelemetry.sdk import trace +from opentelemetry.sdk.trace import _ReadWriteSpan from opentelemetry.trace import INVALID_SPAN, INVALID_SPAN_CONTEXT @@ -42,8 +42,8 @@ def test_tracer(self): def test_span(self): with self.assertRaises(Exception): # pylint: disable=no-value-for-parameter - span = trace._Span() + span = _ReadWriteSpan() - span = trace._Span("name", INVALID_SPAN_CONTEXT) + span = _ReadWriteSpan("name", INVALID_SPAN_CONTEXT) self.assertEqual(span.get_span_context(), INVALID_SPAN_CONTEXT) self.assertIs(span.is_recording(), True) diff --git a/opentelemetry-sdk/tests/trace/test_trace.py b/opentelemetry-sdk/tests/trace/test_trace.py index 6879b6390d..7d354c5ddc 100644 --- a/opentelemetry-sdk/tests/trace/test_trace.py +++ b/opentelemetry-sdk/tests/trace/test_trace.py @@ -27,7 +27,7 @@ from opentelemetry.configuration import Configuration from opentelemetry.context import Context from opentelemetry.sdk import resources, trace -from opentelemetry.sdk.trace import Resource, sampling +from opentelemetry.sdk.trace import _ReadWriteSpan, Resource, sampling from opentelemetry.sdk.util import ns_to_iso_str from opentelemetry.sdk.util.instrumentation import InstrumentationInfo from opentelemetry.trace.status import StatusCode @@ -297,7 +297,7 @@ def test_start_span_implicit(self): def test_start_span_explicit(self): tracer = new_tracer() - other_parent = trace._Span( + other_parent = _ReadWriteSpan( "name", trace_api.SpanContext( trace_id=0x000000000000000000000000DEADBEEF, @@ -378,7 +378,7 @@ def test_start_as_current_span_implicit(self): def test_start_as_current_span_explicit(self): tracer = new_tracer() - other_parent = trace._Span( + other_parent = _ReadWriteSpan( "name", trace_api.SpanContext( trace_id=0x000000000000000000000000DEADBEEF, @@ -447,7 +447,7 @@ def setUp(self): self.tracer = new_tracer() def test_basic_span(self): - span = trace._Span("name", mock.Mock(spec=trace_api.SpanContext)) + span = _ReadWriteSpan("name", mock.Mock(spec=trace_api.SpanContext)) self.assertEqual(span.name, "name") def test_attributes(self): @@ -726,7 +726,7 @@ def test_update_name(self): def test_start_span(self): """Start twice, end a not started""" - span = trace._Span("name", mock.Mock(spec=trace_api.SpanContext)) + span = _ReadWriteSpan("name", mock.Mock(spec=trace_api.SpanContext)) # end not started span self.assertRaises(RuntimeError, span.end) @@ -755,7 +755,7 @@ def test_start_span(self): def test_start_accepts_context(self): # pylint: disable=no-self-use span_processor = mock.Mock(spec=trace.SpanProcessor) - span = trace._Span( + span = _ReadWriteSpan( "name", mock.Mock(spec=trace_api.SpanContext), span_processor=span_processor, @@ -768,7 +768,7 @@ def test_start_accepts_context(self): def test_span_override_start_and_end_time(self): """Span sending custom start_time and end_time values""" - span = trace._Span("name", mock.Mock(spec=trace_api.SpanContext)) + span = _ReadWriteSpan("name", mock.Mock(spec=trace_api.SpanContext)) start_time = 123 span.start(start_time) self.assertEqual(start_time, span.start_time) @@ -860,7 +860,7 @@ def error_status_test(context): ) def test_record_exception(self): - span = trace._Span("name", mock.Mock(spec=trace_api.SpanContext)) + span = _ReadWriteSpan("name", mock.Mock(spec=trace_api.SpanContext)) try: raise ValueError("invalid") except ValueError as err: @@ -879,7 +879,7 @@ def test_record_exception(self): ) def test_record_exception_with_attributes(self): - span = trace._Span("name", mock.Mock(spec=trace_api.SpanContext)) + span = _ReadWriteSpan("name", mock.Mock(spec=trace_api.SpanContext)) try: raise RuntimeError("error") except RuntimeError as err: @@ -908,7 +908,7 @@ def test_record_exception_with_attributes(self): ) def test_record_exception_escaped(self): - span = trace._Span("name", mock.Mock(spec=trace_api.SpanContext)) + span = _ReadWriteSpan("name", mock.Mock(spec=trace_api.SpanContext)) try: raise RuntimeError("error") except RuntimeError as err: @@ -930,7 +930,7 @@ def test_record_exception_escaped(self): ) def test_record_exception_with_timestamp(self): - span = trace._Span("name", mock.Mock(spec=trace_api.SpanContext)) + span = _ReadWriteSpan("name", mock.Mock(spec=trace_api.SpanContext)) try: raise RuntimeError("error") except RuntimeError as err: @@ -953,7 +953,7 @@ def test_record_exception_with_timestamp(self): ) def test_record_exception_with_attributes_and_timestamp(self): - span = trace._Span("name", mock.Mock(spec=trace_api.SpanContext)) + span = _ReadWriteSpan("name", mock.Mock(spec=trace_api.SpanContext)) try: raise RuntimeError("error") except RuntimeError as err: @@ -1138,7 +1138,7 @@ def test_to_json(self): is_remote=False, trace_flags=trace_api.TraceFlags(trace_api.TraceFlags.SAMPLED), ) - span = trace._Span("span-name", context) + span = _ReadWriteSpan("span-name", context) span.resource = Resource({}) self.assertEqual( @@ -1175,7 +1175,7 @@ def test_attributes_to_json(self): is_remote=False, trace_flags=trace_api.TraceFlags(trace_api.TraceFlags.SAMPLED), ) - span = trace._Span("span-name", context) + span = _ReadWriteSpan("span-name", context) span.resource = Resource({}) span.set_attribute("key", "value") span.add_event("event", {"key2": "value2"}, 123)