
Zipkin is a trend distributed tracing framewrok developed at Twitter. Such tracing is useful for both developers and operatos to understand the behavior of complex distributed systems and find performance bottlenecks. This patch provides a WSGI application using eventlet with tracing facility that complies with Zipkin. Signed-off-by: Yuichi Bando <bando.yuichi@lab.ntt.co.jp> Original commit modified for PEP-8 fixes. https://github.com/eventlet/eventlet/pull/218
62 lines
1.7 KiB
Python
62 lines
1.7 KiB
Python
import warnings
|
|
|
|
from eventlet.support 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,)
|