From 4a4ef9e154d40b48a2ed8cb1e0f0f4e5f30dc37b Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Thu, 28 Nov 2019 12:51:43 -0800 Subject: [PATCH 1/9] make Meter an ABC Signed-off-by: Alex Boten --- .../src/opentelemetry/metrics/__init__.py | 32 +++++++++++++++++-- .../tests/metrics/test_metrics.py | 2 +- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/opentelemetry-api/src/opentelemetry/metrics/__init__.py b/opentelemetry-api/src/opentelemetry/metrics/__init__.py index e866aa97cfa..e8d6a23d8ec 100644 --- a/opentelemetry-api/src/opentelemetry/metrics/__init__.py +++ b/opentelemetry-api/src/opentelemetry/metrics/__init__.py @@ -26,6 +26,7 @@ """ +import abc from typing import Callable, Optional, Sequence, Tuple, Type, TypeVar from opentelemetry.util import loader @@ -164,7 +165,7 @@ def record(self, label_values: Sequence[str], value: ValueT) -> None: # pylint: disable=unused-argument -class Meter: +class Meter(abc.ABC): """An interface to allow the recording of metrics. `Metric` s are used for recording pre-defined aggregation (gauge and @@ -172,6 +173,7 @@ class Meter: for the exported metric are deferred. """ + @abc.abstractmethod def record_batch( self, label_values: Sequence[str], @@ -191,6 +193,7 @@ def record_batch( corresponding value to record for that metric. """ + @abc.abstractmethod def create_metric( self, name: str, @@ -222,6 +225,31 @@ def create_metric( return DefaultMetric() +class DefaultMeter(Meter): + """The default Meter used when no Meter implementation is available.""" + + def record_batch( + self, + label_values: Sequence[str], + record_tuples: Sequence[Tuple["Metric", ValueT]], + ) -> None: + pass + + def create_metric( + self, + name: str, + description: str, + unit: str, + value_type: Type[ValueT], + metric_type: Type[MetricT], + label_keys: Sequence[str] = None, + enabled: bool = True, + monotonic: bool = False, + ) -> "Metric": + # pylint: disable=no-self-use + return DefaultMetric() + + # Once https://github.com/python/mypy/issues/7092 is resolved, # the following type definition should be replaced with # from opentelemetry.util.loader import ImplementationFactory @@ -240,7 +268,7 @@ def meter() -> Meter: if _METER is None: # pylint:disable=protected-access - _METER = loader._load_impl(Meter, _METER_FACTORY) + _METER = loader._load_impl(DefaultMeter, _METER_FACTORY) del _METER_FACTORY return _METER diff --git a/opentelemetry-api/tests/metrics/test_metrics.py b/opentelemetry-api/tests/metrics/test_metrics.py index 758534f2356..5f0af3c7a0b 100644 --- a/opentelemetry-api/tests/metrics/test_metrics.py +++ b/opentelemetry-api/tests/metrics/test_metrics.py @@ -20,7 +20,7 @@ # pylint: disable=no-self-use class TestMeter(unittest.TestCase): def setUp(self): - self.meter = metrics.Meter() + self.meter = metrics.DefaultMeter() def test_record_batch(self): counter = metrics.Counter() From 169637212b5e1ce2b0ad6a01faec7f9642c58867 Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Mon, 2 Dec 2019 15:30:52 -0800 Subject: [PATCH 2/9] making Span an ABC Signed-off-by: Alex Boten --- .../src/opentelemetry/trace/__init__.py | 36 +++++++++++++++++-- opentelemetry-api/tests/trace/test_tracer.py | 2 +- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/opentelemetry-api/src/opentelemetry/trace/__init__.py b/opentelemetry-api/src/opentelemetry/trace/__init__.py index f2abf8ff9b7..b2bd3e02c99 100644 --- a/opentelemetry-api/src/opentelemetry/trace/__init__.py +++ b/opentelemetry-api/src/opentelemetry/trace/__init__.py @@ -59,6 +59,7 @@ .. versionadded:: 0.1.0 """ +import abc import enum import types as python_types import typing @@ -142,9 +143,10 @@ class SpanKind(enum.Enum): CONSUMER = 4 -class Span: +class Span(abc.ABC): """A span represents a single operation within a trace.""" + @abc.abstractmethod def end(self, end_time: int = None) -> None: """Sets the current time as the span's end time. @@ -154,6 +156,7 @@ def end(self, end_time: int = None) -> None: implementations are free to ignore or raise on further calls. """ + @abc.abstractmethod def get_context(self) -> "SpanContext": """Gets the span's SpanContext. @@ -164,12 +167,14 @@ def get_context(self) -> "SpanContext": A :class:`.SpanContext` with a copy of this span's immutable state. """ + @abc.abstractmethod def set_attribute(self, key: str, value: types.AttributeValue) -> None: """Sets an Attribute. Sets a single Attribute with the key and value passed as arguments. """ + @abc.abstractmethod def add_event( self, name: str, @@ -183,12 +188,14 @@ def add_event( timestamp if the `timestamp` argument is omitted. """ + @abc.abstractmethod def add_lazy_event(self, event: Event) -> None: """Adds an `Event`. Adds an `Event` that has previously been created. """ + @abc.abstractmethod def update_name(self, name: str) -> None: """Updates the `Span` name. @@ -198,6 +205,7 @@ def update_name(self, name: str) -> None: on the implementation. """ + @abc.abstractmethod def is_recording_events(self) -> bool: """Returns whether this span will be recorded. @@ -205,6 +213,7 @@ def is_recording_events(self) -> bool: events with the add_event operation and attributes using set_attribute. """ + @abc.abstractmethod def set_status(self, status: Status) -> None: """Sets the Status of the Span. If used, this will override the default Span status, which is OK. @@ -348,6 +357,29 @@ def get_context(self) -> "SpanContext": def is_recording_events(self) -> bool: return False + def end(self, end_time: int = None) -> None: + pass + + def set_attribute(self, key: str, value: types.AttributeValue) -> None: + pass + + def add_event( + self, + name: str, + attributes: types.Attributes = None, + timestamp: int = None, + ) -> None: + pass + + def add_lazy_event(self, event: Event) -> None: + pass + + def update_name(self, name: str) -> None: + pass + + def set_status(self, status: Status) -> None: + pass + INVALID_SPAN_ID = 0x0000000000000000 INVALID_TRACE_ID = 0x00000000000000000000000000000000 @@ -369,7 +401,7 @@ class Tracer: # Constant used to represent the current span being used as a parent. # This is the default behavior when creating spans. - CURRENT_SPAN = Span() + CURRENT_SPAN = DefaultSpan(INVALID_SPAN_CONTEXT) def get_current_span(self) -> "Span": """Gets the currently active span from the context. diff --git a/opentelemetry-api/tests/trace/test_tracer.py b/opentelemetry-api/tests/trace/test_tracer.py index b57f2ff6d2b..6e8a688839d 100644 --- a/opentelemetry-api/tests/trace/test_tracer.py +++ b/opentelemetry-api/tests/trace/test_tracer.py @@ -34,6 +34,6 @@ def test_start_as_current_span(self): self.assertIsInstance(span, trace.Span) def test_use_span(self): - span = trace.Span() + span = trace.DefaultSpan(trace.INVALID_SPAN_CONTEXT) with self.tracer.use_span(span): pass From 8df0d7202c76755b50ee4903a3cd2e5b66b82434 Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Mon, 2 Dec 2019 22:07:05 -0800 Subject: [PATCH 3/9] updating DefaultMeter to support LabelSet Signed-off-by: Alex Boten --- opentelemetry-api/src/opentelemetry/metrics/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentelemetry-api/src/opentelemetry/metrics/__init__.py b/opentelemetry-api/src/opentelemetry/metrics/__init__.py index a38f94ef8a3..11acf137113 100644 --- a/opentelemetry-api/src/opentelemetry/metrics/__init__.py +++ b/opentelemetry-api/src/opentelemetry/metrics/__init__.py @@ -258,7 +258,7 @@ class DefaultMeter(Meter): def record_batch( self, - label_values: Sequence[str], + label_set: LabelSet, record_tuples: Sequence[Tuple["Metric", ValueT]], ) -> None: pass From ae2b96049af08b1f5e0ca397108b7c56853bc813 Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Mon, 2 Dec 2019 22:09:45 -0800 Subject: [PATCH 4/9] make Tracer an ABC Signed-off-by: Alex Boten --- .../src/opentelemetry/trace/__init__.py | 64 ++++++++++++++++--- opentelemetry-api/tests/test_loader.py | 4 +- opentelemetry-api/tests/trace/test_tracer.py | 2 +- 3 files changed, 58 insertions(+), 12 deletions(-) diff --git a/opentelemetry-api/src/opentelemetry/trace/__init__.py b/opentelemetry-api/src/opentelemetry/trace/__init__.py index b2bd3e02c99..eb5b476f854 100644 --- a/opentelemetry-api/src/opentelemetry/trace/__init__.py +++ b/opentelemetry-api/src/opentelemetry/trace/__init__.py @@ -392,7 +392,7 @@ def set_status(self, status: Status) -> None: INVALID_SPAN = DefaultSpan(INVALID_SPAN_CONTEXT) -class Tracer: +class Tracer(abc.ABC): """Handles span creation and in-process context propagation. This class provides methods for manipulating the context, creating spans, @@ -403,6 +403,7 @@ class Tracer: # This is the default behavior when creating spans. CURRENT_SPAN = DefaultSpan(INVALID_SPAN_CONTEXT) + @abc.abstractmethod def get_current_span(self) -> "Span": """Gets the currently active span from the context. @@ -413,9 +414,8 @@ def get_current_span(self) -> "Span": The currently active :class:`.Span`, or a placeholder span with an invalid :class:`.SpanContext`. """ - # pylint: disable=no-self-use - return INVALID_SPAN + @abc.abstractmethod def start_span( self, name: str, @@ -459,10 +459,9 @@ def start_span( Returns: The newly-created span. """ - # pylint: disable=unused-argument,no-self-use - return INVALID_SPAN @contextmanager # type: ignore + @abc.abstractmethod def start_as_current_span( self, name: str, @@ -512,10 +511,8 @@ def start_as_current_span( The newly-created span. """ - # pylint: disable=unused-argument,no-self-use - yield INVALID_SPAN - @contextmanager # type: ignore + @abc.abstractmethod def use_span( self, span: "Span", end_on_exit: bool = False ) -> typing.Iterator[None]: @@ -533,6 +530,50 @@ def use_span( end_on_exit: Whether to end the span automatically when leaving the context manager. """ + + +class DefaultTracer(Tracer): + """The default Tracer that is used when no Tracer implementation is available. + + All operations are no-op. + """ + + # Constant used to represent the current span being used as a parent. + # This is the default behavior when creating spans. + CURRENT_SPAN = DefaultSpan(INVALID_SPAN_CONTEXT) + + def get_current_span(self) -> "Span": + # pylint: disable=no-self-use + return INVALID_SPAN + + def start_span( + self, + name: str, + parent: ParentSpan = CURRENT_SPAN, + kind: SpanKind = SpanKind.INTERNAL, + attributes: typing.Optional[types.Attributes] = None, + links: typing.Sequence[Link] = (), + start_time: typing.Optional[int] = None, + ) -> "Span": + # pylint: disable=unused-argument,no-self-use + return INVALID_SPAN + + @contextmanager # type: ignore + def start_as_current_span( + self, + name: str, + parent: ParentSpan = CURRENT_SPAN, + kind: SpanKind = SpanKind.INTERNAL, + attributes: typing.Optional[types.Attributes] = None, + links: typing.Sequence[Link] = (), + ) -> typing.Iterator["Span"]: + # pylint: disable=unused-argument,no-self-use + yield INVALID_SPAN + + @contextmanager # type: ignore + def use_span( + self, span: "Span", end_on_exit: bool = False + ) -> typing.Iterator[None]: # pylint: disable=unused-argument,no-self-use yield @@ -557,7 +598,12 @@ def tracer() -> Tracer: if _TRACER is None: # pylint:disable=protected-access - _TRACER = loader._load_impl(Tracer, _TRACER_FACTORY) + try: + _TRACER = loader._load_impl(Tracer, _TRACER_FACTORY) # type: ignore + except TypeError: + # if we raised an excaption trying to instantiate an + # abstract class, default to no-op tracer impl + _TRACER = DefaultTracer() del _TRACER_FACTORY return _TRACER diff --git a/opentelemetry-api/tests/test_loader.py b/opentelemetry-api/tests/test_loader.py index 970b6159630..49d6409cd99 100644 --- a/opentelemetry-api/tests/test_loader.py +++ b/opentelemetry-api/tests/test_loader.py @@ -24,7 +24,7 @@ DUMMY_TRACER = None -class DummyTracer(trace.Tracer): +class DummyTracer(trace.DefaultTracer): pass @@ -49,7 +49,7 @@ def setUp(self): def test_get_default(self): tracer = trace.tracer() - self.assertIs(type(tracer), trace.Tracer) + self.assertIs(type(tracer), trace.DefaultTracer) def test_preferred_impl(self): trace.set_preferred_tracer_implementation( diff --git a/opentelemetry-api/tests/trace/test_tracer.py b/opentelemetry-api/tests/trace/test_tracer.py index 6e8a688839d..20c218ad8f1 100644 --- a/opentelemetry-api/tests/trace/test_tracer.py +++ b/opentelemetry-api/tests/trace/test_tracer.py @@ -19,7 +19,7 @@ class TestTracer(unittest.TestCase): def setUp(self): - self.tracer = trace.Tracer() + self.tracer = trace.DefaultTracer() def test_get_current_span(self): span = self.tracer.get_current_span() From cd176046582754617d7d5618e7dd7c4ce7da6ae4 Mon Sep 17 00:00:00 2001 From: alrex Date: Tue, 3 Dec 2019 15:47:48 -0800 Subject: [PATCH 5/9] update comment Co-Authored-By: Chris Kleinknecht --- opentelemetry-api/src/opentelemetry/trace/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentelemetry-api/src/opentelemetry/trace/__init__.py b/opentelemetry-api/src/opentelemetry/trace/__init__.py index eb5b476f854..7cefb6a9981 100644 --- a/opentelemetry-api/src/opentelemetry/trace/__init__.py +++ b/opentelemetry-api/src/opentelemetry/trace/__init__.py @@ -533,7 +533,7 @@ def use_span( class DefaultTracer(Tracer): - """The default Tracer that is used when no Tracer implementation is available. + """The default Tracer, used when no Tracer implementation is available. All operations are no-op. """ From 0afd484ea703640e0ed0e24cdbcc227d40089ca5 Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Tue, 3 Dec 2019 16:33:13 -0800 Subject: [PATCH 6/9] don't need CURRENT_SPAN in the DefaultTracer Signed-off-by: Alex Boten --- opentelemetry-api/src/opentelemetry/trace/__init__.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/opentelemetry-api/src/opentelemetry/trace/__init__.py b/opentelemetry-api/src/opentelemetry/trace/__init__.py index eb5b476f854..aa235873621 100644 --- a/opentelemetry-api/src/opentelemetry/trace/__init__.py +++ b/opentelemetry-api/src/opentelemetry/trace/__init__.py @@ -538,10 +538,6 @@ class DefaultTracer(Tracer): All operations are no-op. """ - # Constant used to represent the current span being used as a parent. - # This is the default behavior when creating spans. - CURRENT_SPAN = DefaultSpan(INVALID_SPAN_CONTEXT) - def get_current_span(self) -> "Span": # pylint: disable=no-self-use return INVALID_SPAN @@ -549,7 +545,7 @@ def get_current_span(self) -> "Span": def start_span( self, name: str, - parent: ParentSpan = CURRENT_SPAN, + parent: ParentSpan = Tracer.CURRENT_SPAN, kind: SpanKind = SpanKind.INTERNAL, attributes: typing.Optional[types.Attributes] = None, links: typing.Sequence[Link] = (), @@ -562,7 +558,7 @@ def start_span( def start_as_current_span( self, name: str, - parent: ParentSpan = CURRENT_SPAN, + parent: ParentSpan = Tracer.CURRENT_SPAN, kind: SpanKind = SpanKind.INTERNAL, attributes: typing.Optional[types.Attributes] = None, links: typing.Sequence[Link] = (), From b9ffc61af95b4aef03b481519e9f49041fa6252c Mon Sep 17 00:00:00 2001 From: alrex Date: Tue, 3 Dec 2019 15:59:49 -0800 Subject: [PATCH 7/9] Adding link to docs (#312) Fixes #245 --- .../tests/test_shim.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ext/opentelemetry-ext-opentracing-shim/tests/test_shim.py b/ext/opentelemetry-ext-opentracing-shim/tests/test_shim.py index b1cefbcbb4c..0daabf199a0 100644 --- a/ext/opentelemetry-ext-opentracing-shim/tests/test_shim.py +++ b/ext/opentelemetry-ext-opentracing-shim/tests/test_shim.py @@ -132,8 +132,8 @@ def test_explicit_start_time(self): now = time.time() with self.shim.start_active_span("TestSpan", start_time=now) as scope: result = util.time_seconds_from_ns(scope.span.unwrap().start_time) - # Tolerate inaccuracies of less than a microsecond. - # TODO: Put a link to an explanation in the docs. + # Tolerate inaccuracies of less than a microsecond. See Note: + # https://open-telemetry.github.io/opentelemetry-python/opentelemetry.ext.opentracing_shim.html # TODO: This seems to work consistently, but we should find out the # biggest possible loss of precision. self.assertAlmostEqual(result, now, places=6) @@ -146,8 +146,8 @@ def test_explicit_end_time(self): span.finish(now) end_time = util.time_seconds_from_ns(span.unwrap().end_time) - # Tolerate inaccuracies of less than a microsecond. - # TODO: Put a link to an explanation in the docs. + # Tolerate inaccuracies of less than a microsecond. See Note: + # https://open-telemetry.github.io/opentelemetry-python/opentelemetry.ext.opentracing_shim.html # TODO: This seems to work consistently, but we should find out the # biggest possible loss of precision. self.assertAlmostEqual(end_time, now, places=6) @@ -412,8 +412,8 @@ def test_log_kv(self): span.unwrap().events[1].timestamp ) self.assertEqual(span.unwrap().events[1].attributes["foo"], "bar") - # Tolerate inaccuracies of less than a microsecond. - # TODO: Put a link to an explanation in the docs. + # Tolerate inaccuracies of less than a microsecond. See Note: + # https://open-telemetry.github.io/opentelemetry-python/opentelemetry.ext.opentracing_shim.html # TODO: This seems to work consistently, but we should find out the # biggest possible loss of precision. self.assertAlmostEqual(result, now, places=6) From 607ff4bd414ca343c46565ed3c59ea0a8768074f Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Fri, 6 Dec 2019 12:09:17 -0800 Subject: [PATCH 8/9] updating tests Signed-off-by: Alex Boten --- .../src/opentelemetry/metrics/__init__.py | 2 +- .../src/opentelemetry/trace/__init__.py | 4 ++-- .../tests/test_implementation.py | 20 ++++++++++++++----- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/opentelemetry-api/src/opentelemetry/metrics/__init__.py b/opentelemetry-api/src/opentelemetry/metrics/__init__.py index bd760ab9a9b..f25d33d2678 100644 --- a/opentelemetry-api/src/opentelemetry/metrics/__init__.py +++ b/opentelemetry-api/src/opentelemetry/metrics/__init__.py @@ -270,7 +270,7 @@ def create_metric( unit: str, value_type: Type[ValueT], metric_type: Type[MetricT], - label_keys: Sequence[str] = None, + label_keys: Sequence[str] = (), enabled: bool = True, monotonic: bool = False, ) -> "Metric": diff --git a/opentelemetry-api/src/opentelemetry/trace/__init__.py b/opentelemetry-api/src/opentelemetry/trace/__init__.py index ddbccd576d0..63daf65afa3 100644 --- a/opentelemetry-api/src/opentelemetry/trace/__init__.py +++ b/opentelemetry-api/src/opentelemetry/trace/__init__.py @@ -361,7 +361,7 @@ def get_context(self) -> "SpanContext": def is_recording_events(self) -> bool: return False - def end(self, end_time: int = None) -> None: + def end(self, end_time: typing.Optional[int] = None) -> None: pass def set_attribute(self, key: str, value: types.AttributeValue) -> None: @@ -371,7 +371,7 @@ def add_event( self, name: str, attributes: types.Attributes = None, - timestamp: int = None, + timestamp: typing.Optional[int] = None, ) -> None: pass diff --git a/opentelemetry-api/tests/test_implementation.py b/opentelemetry-api/tests/test_implementation.py index 60bf9dd9fad..693b766a19d 100644 --- a/opentelemetry-api/tests/test_implementation.py +++ b/opentelemetry-api/tests/test_implementation.py @@ -26,7 +26,12 @@ class TestAPIOnlyImplementation(unittest.TestCase): """ def test_tracer(self): - tracer = trace.Tracer() + with self.assertRaises(TypeError): + # pylint: disable=abstract-class-instantiated + trace.Tracer() # type:ignore + + def test_default_tracer(self): + tracer = trace.DefaultTracer() with tracer.start_span("test") as span: self.assertEqual(span.get_context(), trace.INVALID_SPAN_CONTEXT) self.assertEqual(span, trace.INVALID_SPAN) @@ -39,9 +44,9 @@ def test_tracer(self): self.assertIs(span2.is_recording_events(), False) def test_span(self): - span = trace.Span() - self.assertEqual(span.get_context(), trace.INVALID_SPAN_CONTEXT) - self.assertIs(span.is_recording_events(), False) + with self.assertRaises(TypeError): + # pylint: disable=abstract-class-instantiated + trace.Span() # type:ignore def test_default_span(self): span = trace.DefaultSpan(trace.INVALID_SPAN_CONTEXT) @@ -49,6 +54,11 @@ def test_default_span(self): self.assertIs(span.is_recording_events(), False) def test_meter(self): - meter = metrics.Meter() + with self.assertRaises(TypeError): + # pylint: disable=abstract-class-instantiated + metrics.Meter() # type:ignore + + def test_default_meter(self): + meter = metrics.DefaultMeter() metric = meter.create_metric("", "", "", float, metrics.Counter) self.assertIsInstance(metric, metrics.DefaultMetric) From bcaaf6b747ff31acc7e8964b8056ae31a83ffbbf Mon Sep 17 00:00:00 2001 From: Alex Boten Date: Thu, 9 Jan 2020 16:37:59 -0800 Subject: [PATCH 9/9] forgot to make get_label_set abstract, removing implementations in ABC Signed-off-by: Alex Boten --- opentelemetry-api/src/opentelemetry/metrics/__init__.py | 9 +++++---- opentelemetry-api/src/opentelemetry/trace/__init__.py | 6 +----- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/opentelemetry-api/src/opentelemetry/metrics/__init__.py b/opentelemetry-api/src/opentelemetry/metrics/__init__.py index f25d33d2678..947d57b976d 100644 --- a/opentelemetry-api/src/opentelemetry/metrics/__init__.py +++ b/opentelemetry-api/src/opentelemetry/metrics/__init__.py @@ -238,9 +238,8 @@ def create_metric( Returns: A new ``metric_type`` metric with values of ``value_type``. """ - # pylint: disable=no-self-use - return DefaultMetric() + @abc.abstractmethod def get_label_set(self, labels: Dict[str, str]) -> "LabelSet": """Gets a `LabelSet` with the given labels. @@ -249,8 +248,6 @@ def get_label_set(self, labels: Dict[str, str]) -> "LabelSet": Returns: A `LabelSet` object canonicalized using the given input. """ - # pylint: disable=no-self-use - return DefaultLabelSet() class DefaultMeter(Meter): @@ -277,6 +274,10 @@ def create_metric( # pylint: disable=no-self-use return DefaultMetric() + def get_label_set(self, labels: Dict[str, str]) -> "LabelSet": + # pylint: disable=no-self-use + return DefaultLabelSet() + # Once https://github.com/python/mypy/issues/7092 is resolved, # the following type definition should be replaced with diff --git a/opentelemetry-api/src/opentelemetry/trace/__init__.py b/opentelemetry-api/src/opentelemetry/trace/__init__.py index 228008e0a61..014e82b3bc2 100644 --- a/opentelemetry-api/src/opentelemetry/trace/__init__.py +++ b/opentelemetry-api/src/opentelemetry/trace/__init__.py @@ -175,8 +175,6 @@ def get_context(self) -> "SpanContext": Returns: A :class:`.SpanContext` with a copy of this span's immutable state. """ - # pylint: disable=no-self-use - return INVALID_SPAN_CONTEXT @abc.abstractmethod def set_attribute(self, key: str, value: types.AttributeValue) -> None: @@ -223,8 +221,6 @@ def is_recording_events(self) -> bool: Returns true if this Span is active and recording information like events with the add_event operation and attributes using set_attribute. """ - # pylint: disable=no-self-use - return False @abc.abstractmethod def set_status(self, status: Status) -> None: @@ -437,7 +433,7 @@ def get_tracer( class DefaultTracerSource(TracerSource): - """The default TracerSource, used when no TracerSource implementation is available. + """The default TracerSource, used when no implementation is available. All operations are no-op. """