import warnings import six from eventlet.green import httplib from eventlet.zipkin import api # see https://twitter.github.io/zipkin/Instrumenting.html HDR_TRACE_ID = 'X-B3-TraceId' HDR_SPAN_ID = 'X-B3-SpanId' HDR_PARENT_SPAN_ID = 'X-B3-ParentSpanId' HDR_SAMPLED = 'X-B3-Sampled' if six.PY2: __org_endheaders__ = httplib.HTTPConnection.endheaders __org_begin__ = httplib.HTTPResponse.begin def _patched_endheaders(self): if api.is_tracing(): trace_data = api.get_trace_data() new_span_id = api.generate_span_id() self.putheader(HDR_TRACE_ID, hex_str(trace_data.trace_id)) self.putheader(HDR_SPAN_ID, hex_str(new_span_id)) self.putheader(HDR_PARENT_SPAN_ID, hex_str(trace_data.span_id)) self.putheader(HDR_SAMPLED, int(trace_data.sampled)) api.put_annotation('Client Send') __org_endheaders__(self) def _patched_begin(self): __org_begin__(self) if api.is_tracing(): api.put_annotation('Client Recv (%s)' % self.status) def patch(): if six.PY2: httplib.HTTPConnection.endheaders = _patched_endheaders httplib.HTTPResponse.begin = _patched_begin if six.PY3: warnings.warn("Since current Python thrift release \ doesn't support Python 3, eventlet.zipkin.http \ doesn't also support Python 3 (http.client)") def unpatch(): if six.PY2: httplib.HTTPConnection.endheaders = __org_endheaders__ httplib.HTTPResponse.begin = __org_begin__ if six.PY3: pass def hex_str(n): """ Thrift uses a binary representation of trace and span ids HTTP headers use a hexadecimal representation of the same """ return '%0.16x' % (n,)