Skip to content

Commit 6bf2e4f

Browse files
dgzlopestoumorokoshi
authored andcommitted
Export span status to Jaeger (open-telemetry#367)
1 parent 5db1591 commit 6bf2e4f

File tree

3 files changed

+59
-6
lines changed

3 files changed

+59
-6
lines changed

ext/opentelemetry-ext-jaeger/CHANGELOG.md

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

33
## Unreleased
44

5+
- Export span status ([#367](https://github.com/open-telemetry/opentelemetry-python/pull/367))
6+
57
## 0.3a0
68

79
Released 2019-12-11

ext/opentelemetry-ext-jaeger/src/opentelemetry/ext/jaeger/__init__.py

+27-6
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
from opentelemetry.ext.jaeger.gen.agent import Agent as agent
2727
from opentelemetry.ext.jaeger.gen.jaeger import Collector as jaeger
2828
from opentelemetry.sdk.trace.export import Span, SpanExporter, SpanExportResult
29+
from opentelemetry.trace.status import StatusCanonicalCode
2930

3031
DEFAULT_AGENT_HOST_NAME = "localhost"
3132
DEFAULT_AGENT_PORT = 6831
@@ -145,6 +146,8 @@ def _translate_to_jaeger(spans: Span):
145146
start_time_us = _nsec_to_usec_round(span.start_time)
146147
duration_us = _nsec_to_usec_round(span.end_time - span.start_time)
147148

149+
status = span.status
150+
148151
parent_id = 0
149152
if isinstance(span.parent, trace_api.Span):
150153
parent_id = span.parent.get_context().span_id
@@ -153,8 +156,16 @@ def _translate_to_jaeger(spans: Span):
153156

154157
tags = _extract_tags(span.attributes)
155158

156-
# TODO: status is missing:
157-
# https://github.com/open-telemetry/opentelemetry-python/issues/98
159+
tags.extend(
160+
[
161+
_get_long_tag("status.code", status.canonical_code.value),
162+
_get_string_tag("status.message", status.description),
163+
]
164+
)
165+
166+
# Ensure that if Status.Code is not OK, that we set the "error" tag on the Jaeger span.
167+
if status.canonical_code is not StatusCanonicalCode.OK:
168+
tags.append(_get_bool_tag("error", True))
158169

159170
refs = _extract_refs_from_span(span)
160171
logs = _extract_logs_from_span(span)
@@ -222,9 +233,7 @@ def _extract_logs_from_span(span):
222233
logs = []
223234

224235
for event in span.events:
225-
fields = []
226-
if event.attributes is not None:
227-
fields = _extract_tags(event.attributes)
236+
fields = _extract_tags(event.attributes)
228237

229238
fields.append(
230239
jaeger.Tag(
@@ -241,7 +250,7 @@ def _extract_logs_from_span(span):
241250

242251
def _extract_tags(attr):
243252
if not attr:
244-
return None
253+
return []
245254
tags = []
246255
for attribute_key, attribute_value in attr.items():
247256
tag = _convert_attribute_to_tag(attribute_key, attribute_value)
@@ -265,6 +274,18 @@ def _convert_attribute_to_tag(key, attr):
265274
return None
266275

267276

277+
def _get_long_tag(key, val):
278+
return jaeger.Tag(key=key, vLong=val, vType=jaeger.TagType.LONG)
279+
280+
281+
def _get_string_tag(key, val):
282+
return jaeger.Tag(key=key, vStr=val, vType=jaeger.TagType.STRING)
283+
284+
285+
def _get_bool_tag(key, val):
286+
return jaeger.Tag(key=key, vBool=val, vType=jaeger.TagType.BOOL)
287+
288+
268289
class AgentClientUDP:
269290
"""Implement a UDP client to agent.
270291

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

+30
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from opentelemetry import trace as trace_api
2323
from opentelemetry.ext.jaeger.gen.jaeger import ttypes as jaeger
2424
from opentelemetry.sdk import trace
25+
from opentelemetry.trace.status import Status, StatusCanonicalCode
2526

2627

2728
class TestJaegerSpanExporter(unittest.TestCase):
@@ -155,6 +156,17 @@ def test_translate_to_jaeger(self):
155156
context=other_context, attributes=link_attributes
156157
)
157158

159+
default_status_tags = [
160+
jaeger.Tag(
161+
key="status.code",
162+
vType=jaeger.TagType.LONG,
163+
vLong=StatusCanonicalCode.OK.value,
164+
),
165+
jaeger.Tag(
166+
key="status.message", vType=jaeger.TagType.STRING, vStr=None,
167+
),
168+
]
169+
158170
otel_spans = [
159171
trace.Span(
160172
name=span_names[0],
@@ -174,6 +186,9 @@ def test_translate_to_jaeger(self):
174186
otel_spans[0].set_attribute("key_bool", False)
175187
otel_spans[0].set_attribute("key_string", "hello_world")
176188
otel_spans[0].set_attribute("key_float", 111.22)
189+
otel_spans[0].set_status(
190+
Status(StatusCanonicalCode.UNKNOWN, "Example description")
191+
)
177192
otel_spans[0].end(end_time=end_times[0])
178193

179194
otel_spans[1].start(start_time=start_times[1])
@@ -209,6 +224,19 @@ def test_translate_to_jaeger(self):
209224
vType=jaeger.TagType.DOUBLE,
210225
vDouble=111.22,
211226
),
227+
jaeger.Tag(
228+
key="status.code",
229+
vType=jaeger.TagType.LONG,
230+
vLong=StatusCanonicalCode.UNKNOWN.value,
231+
),
232+
jaeger.Tag(
233+
key="status.message",
234+
vType=jaeger.TagType.STRING,
235+
vStr="Example description",
236+
),
237+
jaeger.Tag(
238+
key="error", vType=jaeger.TagType.BOOL, vBool=True,
239+
),
212240
],
213241
references=[
214242
jaeger.SpanRef(
@@ -255,6 +283,7 @@ def test_translate_to_jaeger(self):
255283
startTime=start_times[1] // 10 ** 3,
256284
duration=durations[1] // 10 ** 3,
257285
flags=0,
286+
tags=default_status_tags,
258287
),
259288
jaeger.Span(
260289
operationName=span_names[2],
@@ -265,6 +294,7 @@ def test_translate_to_jaeger(self):
265294
startTime=start_times[2] // 10 ** 3,
266295
duration=durations[2] // 10 ** 3,
267296
flags=0,
297+
tags=default_status_tags,
268298
),
269299
]
270300

0 commit comments

Comments
 (0)