Skip to content

Commit e9527da

Browse files
authored
ext/opentracing: Implement get_attribute and set_attribute (#912)
1 parent 69740b1 commit e9527da

File tree

2 files changed

+56
-47
lines changed

2 files changed

+56
-47
lines changed

ext/opentelemetry-ext-opentracing-shim/src/opentelemetry/ext/opentracing_shim/__init__.py

+27-40
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,18 @@
9090
import opentracing
9191
from deprecated import deprecated
9292

93-
import opentelemetry.trace as trace_api
9493
from opentelemetry import propagators
94+
from opentelemetry.context import Context
95+
from opentelemetry.correlationcontext import get_correlation, set_correlation
9596
from opentelemetry.ext.opentracing_shim import util
9697
from opentelemetry.ext.opentracing_shim.version import __version__
97-
from opentelemetry.trace import DefaultSpan, set_span_in_context
98+
from opentelemetry.trace import (
99+
INVALID_SPAN_CONTEXT,
100+
DefaultSpan,
101+
Link,
102+
get_current_span,
103+
set_span_in_context,
104+
)
98105

99106
logger = logging.getLogger(__name__)
100107

@@ -130,6 +137,8 @@ class SpanContextShim(opentracing.SpanContext):
130137

131138
def __init__(self, otel_context):
132139
self._otel_context = otel_context
140+
# Context is being used here since it must be immutable.
141+
self._baggage = Context()
133142

134143
def unwrap(self):
135144
"""Returns the wrapped :class:`opentelemetry.trace.SpanContext`
@@ -144,17 +153,9 @@ def unwrap(self):
144153

145154
@property
146155
def baggage(self):
147-
"""Implements the ``baggage`` property from the base class.
156+
"""Implements the ``baggage`` property from the base class."""
148157

149-
Warning:
150-
Not implemented yet.
151-
"""
152-
153-
logger.warning(
154-
"Using unimplemented property baggage on class %s.",
155-
self.__class__.__name__,
156-
)
157-
# TODO: Implement.
158+
return self._baggage
158159

159160

160161
class SpanShim(opentracing.Span):
@@ -270,31 +271,17 @@ def log(self, **kwargs):
270271
def log_event(self, event, payload=None):
271272
super().log_event(event, payload=payload)
272273

273-
def set_baggage_item(self, key, value): # pylint:disable=unused-argument
274-
"""Implements the ``set_baggage_item()`` method from the base class.
275-
276-
Warning:
277-
Not implemented yet.
278-
"""
279-
280-
logger.warning(
281-
"Calling unimplemented method set_baggage_item() on class %s",
282-
self.__class__.__name__,
274+
def set_baggage_item(self, key, value):
275+
"""Implements the ``set_baggage_item`` method from the base class."""
276+
# pylint: disable=protected-access
277+
self._context._baggage = set_correlation(
278+
key, value, context=self._context._baggage
283279
)
284-
# TODO: Implement.
285-
286-
def get_baggage_item(self, key): # pylint:disable=unused-argument
287-
"""Implements the ``get_baggage_item()`` method from the base class.
288-
289-
Warning:
290-
Not implemented yet.
291-
"""
292280

293-
logger.warning(
294-
"Calling unimplemented method get_baggage_item() on class %s",
295-
self.__class__.__name__,
296-
)
297-
# TODO: Implement.
281+
def get_baggage_item(self, key):
282+
"""Implements the ``get_baggage_item`` method from the base class."""
283+
# pylint: disable=protected-access
284+
return get_correlation(key, context=self._context._baggage)
298285

299286

300287
class ScopeShim(opentracing.Scope):
@@ -469,8 +456,8 @@ def active(self):
469456
shim and is likely to be handled in future versions.
470457
"""
471458

472-
span = trace_api.get_current_span()
473-
if span.get_context() == trace_api.INVALID_SPAN_CONTEXT:
459+
span = get_current_span()
460+
if span.get_context() == INVALID_SPAN_CONTEXT:
474461
return None
475462

476463
span_context = SpanContextShim(span.get_context())
@@ -643,7 +630,7 @@ def start_span(
643630
links = []
644631
if references:
645632
for ref in references:
646-
links.append(trace_api.Link(ref.referenced_context.unwrap()))
633+
links.append(Link(ref.referenced_context.unwrap()))
647634

648635
# The OpenTracing API expects time values to be `float` values which
649636
# represent the number of seconds since the epoch. OpenTelemetry
@@ -699,10 +686,10 @@ def get_as_list(dict_object, key):
699686

700687
propagator = propagators.get_global_httptextformat()
701688
ctx = propagator.extract(get_as_list, carrier)
702-
span = trace_api.get_current_span(ctx)
689+
span = get_current_span(ctx)
703690
if span is not None:
704691
otel_context = span.get_context()
705692
else:
706-
otel_context = trace_api.INVALID_SPAN_CONTEXT
693+
otel_context = INVALID_SPAN_CONTEXT
707694

708695
return SpanContextShim(otel_context)

ext/opentelemetry-ext-opentracing-shim/tests/test_shim.py

+29-7
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,17 @@
1717

1818
import time
1919
from unittest import TestCase
20+
from unittest.mock import Mock
2021

2122
import opentracing
2223

23-
import opentelemetry.ext.opentracing_shim as opentracingshim
2424
from opentelemetry import propagators, trace
25-
from opentelemetry.ext.opentracing_shim import util
25+
from opentelemetry.ext.opentracing_shim import (
26+
SpanContextShim,
27+
SpanShim,
28+
create_tracer,
29+
util,
30+
)
2631
from opentelemetry.sdk.trace import TracerProvider
2732
from opentelemetry.test.mock_httptextformat import (
2833
MockHTTPTextFormat,
@@ -36,7 +41,7 @@ class TestShim(TestCase):
3641
def setUp(self):
3742
"""Create an OpenTelemetry tracer and a shim before every test case."""
3843
trace.set_tracer_provider(TracerProvider())
39-
self.shim = opentracingshim.create_tracer(trace.get_tracer_provider())
44+
self.shim = create_tracer(trace.get_tracer_provider())
4045

4146
@classmethod
4247
def setUpClass(cls):
@@ -448,7 +453,7 @@ def test_span_context(self):
448453
"""Test construction of `SpanContextShim` objects."""
449454

450455
otel_context = trace.SpanContext(1234, 5678, is_remote=False)
451-
context = opentracingshim.SpanContextShim(otel_context)
456+
context = SpanContextShim(otel_context)
452457

453458
self.assertIsInstance(context, opentracing.SpanContext)
454459
self.assertEqual(context.unwrap().trace_id, 1234)
@@ -473,7 +478,7 @@ def test_inject_http_headers(self):
473478
otel_context = trace.SpanContext(
474479
trace_id=1220, span_id=7478, is_remote=False
475480
)
476-
context = opentracingshim.SpanContextShim(otel_context)
481+
context = SpanContextShim(otel_context)
477482

478483
headers = {}
479484
self.shim.inject(context, opentracing.Format.HTTP_HEADERS, headers)
@@ -486,7 +491,7 @@ def test_inject_text_map(self):
486491
otel_context = trace.SpanContext(
487492
trace_id=1220, span_id=7478, is_remote=False
488493
)
489-
context = opentracingshim.SpanContextShim(otel_context)
494+
context = SpanContextShim(otel_context)
490495

491496
# Verify Format.TEXT_MAP
492497
text_map = {}
@@ -500,7 +505,7 @@ def test_inject_binary(self):
500505
otel_context = trace.SpanContext(
501506
trace_id=1220, span_id=7478, is_remote=False
502507
)
503-
context = opentracingshim.SpanContextShim(otel_context)
508+
context = SpanContextShim(otel_context)
504509

505510
# Verify exception for non supported binary format.
506511
with self.assertRaises(opentracing.UnsupportedFormatException):
@@ -550,3 +555,20 @@ def test_extract_binary(self):
550555
# Verify exception for non supported binary format.
551556
with self.assertRaises(opentracing.UnsupportedFormatException):
552557
self.shim.extract(opentracing.Format.BINARY, bytearray())
558+
559+
def test_baggage(self):
560+
561+
span_context_shim = SpanContextShim(
562+
trace.SpanContext(1234, 5678, is_remote=False)
563+
)
564+
565+
baggage = span_context_shim.baggage
566+
567+
with self.assertRaises(ValueError):
568+
baggage[1] = 3
569+
570+
span_shim = SpanShim(Mock(), span_context_shim, Mock())
571+
572+
span_shim.set_baggage_item(1, 2)
573+
574+
self.assertTrue(span_shim.get_baggage_item(1), 2)

0 commit comments

Comments
 (0)