62 lines
1.7 KiB
Python
62 lines
1.7 KiB
Python
|
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,)
|