def make_zipkin_spans(spans): zipkin_spans = [] for span in spans: endpoint = make_endpoint( ipv4=span.tracer.ip_address, port=0, # span.port, service_name=span.tracer.service_name) # TODO extend Zipkin Thrift and pass endpoint once only for event in span.logs: event.host = endpoint with span.update_lock: add_zipkin_annotations(span=span, endpoint=endpoint) hi, lo = extract_from_trace_id(span.trace_id) zipkin_span = zipkin_types.Span( trace_id=id_to_int(lo), trace_id_high=id_to_int(hi), name=span.operation_name, id=id_to_int(span.span_id), parent_id=id_to_int(span.parent_id) or None, annotations=span.logs, binary_annotations=span.tags, debug=span.is_debug(), timestamp=timestamp_micros(span.start_time), duration=timestamp_micros(span.end_time - span.start_time)) zipkin_spans.append(zipkin_span) return zipkin_spans
def test_large_ids(tracer): def serialize(span_id): parent_ctx = SpanContext(trace_id=span_id, span_id=span_id, parent_id=0, flags=1) parent = Span(context=parent_ctx, operation_name='x', tracer=tracer) span = tracer.start_span(operation_name='x', references=child_of(parent.context)) span.finish() _marshall_span(span) trace_id = 0 serialize(trace_id) assert thrift.id_to_int(trace_id) == 0 trace_id = 0x77fd53dc6b437681 serialize(trace_id) assert thrift.id_to_int(trace_id) == 0x77fd53dc6b437681 trace_id = 0x7fffffffffffffff serialize(trace_id) assert thrift.id_to_int(trace_id) == 0x7fffffffffffffff trace_id = 0x8000000000000000 serialize(trace_id) assert thrift.id_to_int(trace_id) == -0x8000000000000000 trace_id = 0x97fd53dc6b437681 serialize(trace_id) trace_id = (1 << 64) - 1 assert trace_id == 0xffffffffffffffff serialize(trace_id) assert thrift.id_to_int(trace_id) == -1
def test_large_ids(tracer): class TestTrans(TMemoryBuffer): def now_reading(self): """ Thrift TMemoryBuffer is not read-able AND write-able, it's one or the other (really? yes.). This will convert us from write-able to read-able. """ self._buffer = StringIO(self.getvalue()) def serialize(span_id): parent = Span(trace_id=span_id, span_id=span_id, parent_id=0, flags=1, operation_name='x', tracer=tracer) span = tracer.start_span(operation_name='x', parent=parent) span.finish() spans = thrift.make_zipkin_spans([span]) # write and read them to test encoding args = Agent.emitZipkinBatch_args(spans) t = TestTrans() prot = TCompactProtocol(t) args.write(prot) t.now_reading() args.read(prot) trace_id = 0 serialize(trace_id) assert thrift.id_to_int(trace_id) == 0 trace_id = 0x77fd53dc6b437681 serialize(trace_id) assert thrift.id_to_int(trace_id) == 0x77fd53dc6b437681 trace_id = 0x7fffffffffffffff serialize(trace_id) assert thrift.id_to_int(trace_id) == 0x7fffffffffffffff trace_id = 0x8000000000000000 serialize(trace_id) assert thrift.id_to_int(trace_id) == -0x8000000000000000 trace_id = 0x97fd53dc6b437681 serialize(trace_id) trace_id = (1L << 64) - 1 assert trace_id == 0xffffffffffffffffL serialize(trace_id) assert thrift.id_to_int(trace_id) == -1
def test_large_ids(tracer): def serialize(trace_id, span_id): """Checks that there are no exceptions during marshalling.""" parent_ctx = SpanContext(trace_id=trace_id, span_id=span_id, parent_id=0, flags=1) parent = Span(context=parent_ctx, operation_name='x', tracer=tracer) span = tracer.start_span(operation_name='x', references=child_of(parent.context)) span.finish() _marshall_span(span) trace_id = 0x77fd53dc6b437681 serialize(trace_id, trace_id) assert thrift.id_to_int(trace_id) == 0x77fd53dc6b437681 trace_id = 0x7fffffffffffffff serialize(trace_id, trace_id) assert thrift.id_to_int(trace_id) == 0x7fffffffffffffff trace_id = 0x8000000000000000 serialize(trace_id, trace_id) assert thrift.id_to_int(trace_id) == -0x8000000000000000 trace_id = 0x97fd53dc6b437681 serialize(trace_id, trace_id) trace_id = (1 << 64) - 1 assert trace_id == 0xffffffffffffffff serialize(trace_id, trace_id) assert thrift.id_to_int(trace_id) == -1 trace_id = (1 << 128) - 1 span_id = 0xffffffffffffffff assert trace_id == 0xffffffffffffffffffffffffffffffff serialize(trace_id, span_id) assert thrift._id_to_low(trace_id) == 0xffffffffffffffff assert thrift._id_to_high(trace_id) == 0xffffffffffffffff trace_id = 0xfb34678b8864f051e5c8c603484e57 span_id = 0x77fd53dc6b437681 serialize(trace_id, span_id) assert thrift._id_to_low(trace_id) == 0x51e5c8c603484e57 assert thrift._id_to_high(trace_id) == 0xfb34678b8864f0
def test_none_ids(): assert thrift.id_to_int(None) is None assert thrift._id_to_low(None) is None assert thrift._id_to_high(None) is None