|
16 | 16 |
|
17 | 17 | import unittest |
18 | 18 | from collections import namedtuple |
| 19 | +from itertools import product |
19 | 20 | import six |
20 | 21 |
|
21 | 22 | import mock |
|
28 | 29 | ) |
29 | 30 | from jaeger_client.config import Config |
30 | 31 | from jaeger_client.reporter import InMemoryReporter |
| 32 | +from jaeger_client import constants |
31 | 33 | from opentracing import Format |
32 | 34 | from opentracing.propagation import ( |
33 | 35 | InvalidCarrierException, |
@@ -82,6 +84,8 @@ def test_trace_context_from_to_string(self): |
82 | 84 | tests = [ |
83 | 85 | [(256, 127, None, 1), '100:7f:0:1'], |
84 | 86 | [(256, 127, 256, 0), '100:7f:100:0'], |
| 87 | + [(0xffffffffffffffffffffffffffffffff, 127, 256, 0), |
| 88 | + 'ffffffffffffffffffffffffffffffff:7f:100:0'], |
85 | 89 | ] |
86 | 90 | for test in tests: |
87 | 91 | ctx = test[0] |
@@ -211,11 +215,11 @@ def test_context_from_large_ids(self): |
211 | 215 | codec = TextCodec(trace_id_header='Trace_ID', |
212 | 216 | baggage_header_prefix='Trace-Attr-') |
213 | 217 | headers = { |
214 | | - 'Trace-ID': 'FFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFFF:1', |
| 218 | + 'Trace-ID': 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFFF:1', |
215 | 219 | } |
216 | 220 | context = codec.extract(headers) |
217 | | - assert context.trace_id == 0xFFFFFFFFFFFFFFFF |
218 | | - assert context.trace_id == (1 << 64) - 1 |
| 221 | + assert context.trace_id == 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF |
| 222 | + assert context.trace_id == (1 << 128) - 1 |
219 | 223 | assert context.trace_id > 0 |
220 | 224 | assert context.span_id == 0xFFFFFFFFFFFFFFFF |
221 | 225 | assert context.span_id == (1 << 64) - 1 |
@@ -437,11 +441,64 @@ def _test_baggage_without_trace_id(tracer, trace_id_header, baggage_header_prefi |
437 | 441 | (ZipkinSpanFormat, {}), |
438 | 442 | ]) |
439 | 443 | def test_round_trip(tracer, fmt, carrier): |
440 | | - span = tracer.start_span('test-%s' % fmt) |
441 | | - tracer.inject(span, fmt, carrier) |
442 | | - context = tracer.extract(fmt, carrier) |
443 | | - span2 = tracer.start_span('test-%s' % fmt, child_of=context) |
444 | | - assert span.trace_id == span2.trace_id |
| 444 | + tracer_128bit = Tracer( |
| 445 | + service_name='test', |
| 446 | + reporter=InMemoryReporter(), |
| 447 | + sampler=ConstSampler(True), |
| 448 | + generate_128bit_trace_id=True) |
| 449 | + |
| 450 | + for tracer1, tracer2 in product([tracer, tracer_128bit], repeat=2): |
| 451 | + span = tracer1.start_span('test-%s' % fmt) |
| 452 | + tracer1.inject(span, fmt, carrier) |
| 453 | + context = tracer2.extract(fmt, carrier) |
| 454 | + span2 = tracer2.start_span('test-%s' % fmt, child_of=context) |
| 455 | + assert span.trace_id == span2.trace_id |
| 456 | + |
| 457 | + |
| 458 | +def _text_codec_to_trace_id_string(carrier): |
| 459 | + return carrier[constants.TRACE_ID_HEADER].split(':')[0] |
| 460 | + |
| 461 | + |
| 462 | +def _zipkin_codec_to_trace_id_string(carrier): |
| 463 | + return '{:x}'.format(carrier['trace_id']) |
| 464 | + |
| 465 | + |
| 466 | +@pytest.mark.parametrize('fmt,carrier,get_trace_id', [ |
| 467 | + (Format.TEXT_MAP, {}, _text_codec_to_trace_id_string), |
| 468 | + (Format.HTTP_HEADERS, {}, _text_codec_to_trace_id_string), |
| 469 | + (ZipkinSpanFormat, {}, _zipkin_codec_to_trace_id_string), |
| 470 | +]) |
| 471 | +def test_inject_with_128bit_trace_id(tracer, fmt, carrier, get_trace_id): |
| 472 | + tracer_128bit = Tracer( |
| 473 | + service_name='test', |
| 474 | + reporter=InMemoryReporter(), |
| 475 | + sampler=ConstSampler(True), |
| 476 | + generate_128bit_trace_id=True) |
| 477 | + |
| 478 | + for tracer in [tracer, tracer_128bit]: |
| 479 | + length = tracer.max_trace_id_bits / 4 |
| 480 | + trace_id = (1 << 64) - 1 if length == 16 else (1 << 128) - 1 |
| 481 | + ctx = SpanContext(trace_id=trace_id, span_id=127, parent_id=None, |
| 482 | + flags=1) |
| 483 | + span = Span(ctx, operation_name='test-%s' % fmt, tracer=None, start_time=1) |
| 484 | + tracer.inject(span, fmt, carrier) |
| 485 | + assert len(get_trace_id(carrier)) == length |
| 486 | + |
| 487 | + # test if the trace_id arrived on wire remains same even if |
| 488 | + # the tracer is configured for 64bit ids or 128bit ids |
| 489 | + ctx = SpanContext(trace_id=(1 << 128) - 1, span_id=127, parent_id=None, |
| 490 | + flags=0) |
| 491 | + span = tracer.start_span('test-%s' % fmt, child_of=ctx) |
| 492 | + carrier = dict() |
| 493 | + tracer.inject(span, fmt, carrier) |
| 494 | + assert len(get_trace_id(carrier)) == 32 |
| 495 | + |
| 496 | + ctx = SpanContext(trace_id=(1 << 64) - 1, span_id=127, parent_id=None, |
| 497 | + flags=0) |
| 498 | + span = tracer.start_span('test-%s' % fmt, child_of=ctx) |
| 499 | + carrier = dict() |
| 500 | + tracer.inject(span, fmt, carrier) |
| 501 | + assert len(get_trace_id(carrier)) == 16 |
445 | 502 |
|
446 | 503 |
|
447 | 504 | def test_debug_id(): |
|
0 commit comments