From 654a271b82d28d3888a5a12358dea2130cfac928 Mon Sep 17 00:00:00 2001 From: Yuichi Bando Date: Thu, 26 Mar 2015 14:08:26 +0900 Subject: [PATCH] New feature: Add zipkin tracing to eventlet 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 Original commit modified for PEP-8 fixes. https://github.com/eventlet/eventlet/pull/218 --- eventlet/zipkin/README.rst | 135 ++++++ eventlet/zipkin/__init__.py | 0 eventlet/zipkin/_thrift/README.rst | 8 + eventlet/zipkin/_thrift/__init__.py | 0 eventlet/zipkin/_thrift/zipkinCore.thrift | 55 +++ .../zipkin/_thrift/zipkinCore/__init__.py | 1 + .../zipkin/_thrift/zipkinCore/constants.py | 14 + eventlet/zipkin/_thrift/zipkinCore/ttypes.py | 452 ++++++++++++++++++ eventlet/zipkin/api.py | 186 +++++++ eventlet/zipkin/client.py | 56 +++ eventlet/zipkin/example/ex1.png | Bin 0 -> 53179 bytes eventlet/zipkin/example/ex2.png | Bin 0 -> 40482 bytes eventlet/zipkin/example/ex3.png | Bin 0 -> 73175 bytes eventlet/zipkin/greenthread.py | 33 ++ eventlet/zipkin/http.py | 61 +++ eventlet/zipkin/log.py | 19 + eventlet/zipkin/patcher.py | 41 ++ eventlet/zipkin/wsgi.py | 78 +++ 18 files changed, 1139 insertions(+) create mode 100644 eventlet/zipkin/README.rst create mode 100644 eventlet/zipkin/__init__.py create mode 100644 eventlet/zipkin/_thrift/README.rst create mode 100644 eventlet/zipkin/_thrift/__init__.py create mode 100644 eventlet/zipkin/_thrift/zipkinCore.thrift create mode 100644 eventlet/zipkin/_thrift/zipkinCore/__init__.py create mode 100644 eventlet/zipkin/_thrift/zipkinCore/constants.py create mode 100644 eventlet/zipkin/_thrift/zipkinCore/ttypes.py create mode 100644 eventlet/zipkin/api.py create mode 100644 eventlet/zipkin/client.py create mode 100755 eventlet/zipkin/example/ex1.png create mode 100755 eventlet/zipkin/example/ex2.png create mode 100755 eventlet/zipkin/example/ex3.png create mode 100644 eventlet/zipkin/greenthread.py create mode 100644 eventlet/zipkin/http.py create mode 100644 eventlet/zipkin/log.py create mode 100644 eventlet/zipkin/patcher.py create mode 100644 eventlet/zipkin/wsgi.py diff --git a/eventlet/zipkin/README.rst b/eventlet/zipkin/README.rst new file mode 100644 index 0000000..a0dab00 --- /dev/null +++ b/eventlet/zipkin/README.rst @@ -0,0 +1,135 @@ +eventlet.zipkin +=============== + +`Zipkin `_ is a distributed tracing system developed at Twitter. +This package provides a WSGI application using eventlet +with tracing facility that complies with Zipkin. + +Why use it? +From the http://twitter.github.io/zipkin/: + +"Collecting traces helps developers gain deeper knowledge about how +certain requests perform in a distributed system. Let's say we're having +problems with user requests timing out. We can look up traced requests +that timed out and display it in the web UI. We'll be able to quickly +find the service responsible for adding the unexpected response time. If +the service has been annotated adequately we can also find out where in +that service the issue is happening." + + +Screenshot +---------- + +Zipkin web ui screenshots obtained when applying this module to +`OpenStack swift `_ are in example/. + + +Requirement +----------- + +A eventlet.zipkin needs `python scribe client `_ +and `thrift `_ (>=0.9), +because the zipkin collector speaks `scribe `_ protocol. +Below command will install both scribe client and thrift. + +Install facebook-scribe: + +:: + + pip install facebook-scribe + + + + +**Python**: ``2.6``, ``2.7`` (Because the current Python Thrift release doesn't +support Python 3) + + + +How to use +---------- + +Add tracing facility to your application +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Apply the monkey patch before you start wsgi server. + +.. code:: python + + # Add only 2 lines to your code + from eventlet.zipkin import patcher + patcher.enable_trace_patch() + + # existing code + from eventlet import wsgi + wsgi.server(sock, app) + +You can pass some parameters to ``enable_trace_patch()`` + +* host: Scribe daemon IP address (default: '127.0.0.1') +* port: Scribe daemon port (default: 9410) +* trace_app_log: A Boolean indicating if the tracer will trace application log together or not. This facility assume that your application uses python standard logging library. (default: False) +* sampling_rate: A Float value (0.0~1.0) that indicates the tracing frequency. If you specify 1.0, all requests are traced and sent to Zipkin collecotr. If you specify 0.1, only 1/10 requests are traced. (defult: 1.0) + + +(Option) Annotation API +~~~~~~~~~~~~~~~~~~~~~~~ +If you want to record additional information, +you can use below API from anywhere in your code. + +.. code:: python + + from eventlet.zipkin import api + + api.put_annotation('Cache miss for %s' % request) + api.put_key_value('key', 'value') + + + + +Zipkin simple setup +------------------- + +:: + + $ git clone https://github.com/twitter/zipkin.git + $ cd zipkin + # Open 3 terminals + (terminal1) $ bin/collector + (terminal2) $ bin/query + (terminal3) $ bin/web + +Access http://localhost:8080 from your browser. + + +(Option) fluentd +---------------- +If you want to buffer the tracing data for performance, +`fluentd scribe plugin `_ is available. +Since ``out_scribe plugin`` extends `Buffer Plugin `_ , +you can customize buffering parameters in the manner of fluentd. +Scribe plugin is included in td-agent by default. + + +Sample: ``/etc/td-agent/td-agent.conf`` + +:: + + # in_scribe + + type scribe + port 9999 + + + # out_scribe + + type scribe + host Zipkin_collector_IP + port 9410 + flush_interval 60s + buffer_chunk_limit 256m + + +| And, you need to specify ``patcher.enable_trace_patch(port=9999)`` for in_scribe. +| In this case, trace data is passed like below. +| Your application => Local fluentd in_scribe (9999) => Local fluentd out_scribe =====> Remote zipkin collector (9410) + diff --git a/eventlet/zipkin/__init__.py b/eventlet/zipkin/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/eventlet/zipkin/_thrift/README.rst b/eventlet/zipkin/_thrift/README.rst new file mode 100644 index 0000000..0317d50 --- /dev/null +++ b/eventlet/zipkin/_thrift/README.rst @@ -0,0 +1,8 @@ +_thrift +======== + +* This directory is auto-generated by Thrift Compiler by using + https://github.com/twitter/zipkin/blob/master/zipkin-thrift/src/main/thrift/com/twitter/zipkin/zipkinCore.thrift + +* Do not modify this directory. + diff --git a/eventlet/zipkin/_thrift/__init__.py b/eventlet/zipkin/_thrift/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/eventlet/zipkin/_thrift/zipkinCore.thrift b/eventlet/zipkin/_thrift/zipkinCore.thrift new file mode 100644 index 0000000..0787ca8 --- /dev/null +++ b/eventlet/zipkin/_thrift/zipkinCore.thrift @@ -0,0 +1,55 @@ +# Copyright 2012 Twitter Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +namespace java com.twitter.zipkin.gen +namespace rb Zipkin + +//************** Collection related structs ************** + +// these are the annotations we always expect to find in a span +const string CLIENT_SEND = "cs" +const string CLIENT_RECV = "cr" +const string SERVER_SEND = "ss" +const string SERVER_RECV = "sr" + +// this represents a host and port in a network +struct Endpoint { + 1: i32 ipv4, + 2: i16 port // beware that this will give us negative ports. some conversion needed + 3: string service_name // which service did this operation happen on? +} + +// some event took place, either one by the framework or by the user +struct Annotation { + 1: i64 timestamp // microseconds from epoch + 2: string value // what happened at the timestamp? + 3: optional Endpoint host // host this happened on +} + +enum AnnotationType { BOOL, BYTES, I16, I32, I64, DOUBLE, STRING } + +struct BinaryAnnotation { + 1: string key, + 2: binary value, + 3: AnnotationType annotation_type, + 4: optional Endpoint host +} + +struct Span { + 1: i64 trace_id // unique trace id, use for all spans in trace + 3: string name, // span name, rpc method for example + 4: i64 id, // unique span id, only used for this span + 5: optional i64 parent_id, // parent span id + 6: list annotations, // list of all annotations/events that occured + 8: list binary_annotations // any binary annotations +} diff --git a/eventlet/zipkin/_thrift/zipkinCore/__init__.py b/eventlet/zipkin/_thrift/zipkinCore/__init__.py new file mode 100644 index 0000000..adefd8e --- /dev/null +++ b/eventlet/zipkin/_thrift/zipkinCore/__init__.py @@ -0,0 +1 @@ +__all__ = ['ttypes', 'constants'] diff --git a/eventlet/zipkin/_thrift/zipkinCore/constants.py b/eventlet/zipkin/_thrift/zipkinCore/constants.py new file mode 100644 index 0000000..3e04f77 --- /dev/null +++ b/eventlet/zipkin/_thrift/zipkinCore/constants.py @@ -0,0 +1,14 @@ +# +# Autogenerated by Thrift Compiler (0.8.0) +# +# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING +# +# + +from thrift.Thrift import TType, TMessageType, TException +from ttypes import * + +CLIENT_SEND = "cs" +CLIENT_RECV = "cr" +SERVER_SEND = "ss" +SERVER_RECV = "sr" diff --git a/eventlet/zipkin/_thrift/zipkinCore/ttypes.py b/eventlet/zipkin/_thrift/zipkinCore/ttypes.py new file mode 100644 index 0000000..418911f --- /dev/null +++ b/eventlet/zipkin/_thrift/zipkinCore/ttypes.py @@ -0,0 +1,452 @@ +# +# Autogenerated by Thrift Compiler (0.8.0) +# +# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING +# +# + +from thrift.Thrift import TType, TMessageType, TException + +from thrift.transport import TTransport +from thrift.protocol import TBinaryProtocol, TProtocol +try: + from thrift.protocol import fastbinary +except: + fastbinary = None + + +class AnnotationType: + BOOL = 0 + BYTES = 1 + I16 = 2 + I32 = 3 + I64 = 4 + DOUBLE = 5 + STRING = 6 + + _VALUES_TO_NAMES = { + 0: "BOOL", + 1: "BYTES", + 2: "I16", + 3: "I32", + 4: "I64", + 5: "DOUBLE", + 6: "STRING", + } + + _NAMES_TO_VALUES = { + "BOOL": 0, + "BYTES": 1, + "I16": 2, + "I32": 3, + "I64": 4, + "DOUBLE": 5, + "STRING": 6, + } + + +class Endpoint: + """ + Attributes: + - ipv4 + - port + - service_name + """ + + thrift_spec = ( + None, # 0 + (1, TType.I32, 'ipv4', None, None, ), # 1 + (2, TType.I16, 'port', None, None, ), # 2 + (3, TType.STRING, 'service_name', None, None, ), # 3 + ) + + def __init__(self, ipv4=None, port=None, service_name=None,): + self.ipv4 = ipv4 + self.port = port + self.service_name = service_name + + def read(self, iprot): + if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None: + fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec)) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 1: + if ftype == TType.I32: + self.ipv4 = iprot.readI32(); + else: + iprot.skip(ftype) + elif fid == 2: + if ftype == TType.I16: + self.port = iprot.readI16(); + else: + iprot.skip(ftype) + elif fid == 3: + if ftype == TType.STRING: + self.service_name = iprot.readString(); + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None: + oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec))) + return + oprot.writeStructBegin('Endpoint') + if self.ipv4 is not None: + oprot.writeFieldBegin('ipv4', TType.I32, 1) + oprot.writeI32(self.ipv4) + oprot.writeFieldEnd() + if self.port is not None: + oprot.writeFieldBegin('port', TType.I16, 2) + oprot.writeI16(self.port) + oprot.writeFieldEnd() + if self.service_name is not None: + oprot.writeFieldBegin('service_name', TType.STRING, 3) + oprot.writeString(self.service_name) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.iteritems()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) + +class Annotation: + """ + Attributes: + - timestamp + - value + - host + """ + + thrift_spec = ( + None, # 0 + (1, TType.I64, 'timestamp', None, None, ), # 1 + (2, TType.STRING, 'value', None, None, ), # 2 + (3, TType.STRUCT, 'host', (Endpoint, Endpoint.thrift_spec), None, ), # 3 + ) + + def __init__(self, timestamp=None, value=None, host=None,): + self.timestamp = timestamp + self.value = value + self.host = host + + def read(self, iprot): + if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None: + fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec)) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 1: + if ftype == TType.I64: + self.timestamp = iprot.readI64(); + else: + iprot.skip(ftype) + elif fid == 2: + if ftype == TType.STRING: + self.value = iprot.readString(); + else: + iprot.skip(ftype) + elif fid == 3: + if ftype == TType.STRUCT: + self.host = Endpoint() + self.host.read(iprot) + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None: + oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec))) + return + oprot.writeStructBegin('Annotation') + if self.timestamp is not None: + oprot.writeFieldBegin('timestamp', TType.I64, 1) + oprot.writeI64(self.timestamp) + oprot.writeFieldEnd() + if self.value is not None: + oprot.writeFieldBegin('value', TType.STRING, 2) + oprot.writeString(self.value) + oprot.writeFieldEnd() + if self.host is not None: + oprot.writeFieldBegin('host', TType.STRUCT, 3) + self.host.write(oprot) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.iteritems()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) + +class BinaryAnnotation: + """ + Attributes: + - key + - value + - annotation_type + - host + """ + + thrift_spec = ( + None, # 0 + (1, TType.STRING, 'key', None, None, ), # 1 + (2, TType.STRING, 'value', None, None, ), # 2 + (3, TType.I32, 'annotation_type', None, None, ), # 3 + (4, TType.STRUCT, 'host', (Endpoint, Endpoint.thrift_spec), None, ), # 4 + ) + + def __init__(self, key=None, value=None, annotation_type=None, host=None,): + self.key = key + self.value = value + self.annotation_type = annotation_type + self.host = host + + def read(self, iprot): + if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None: + fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec)) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 1: + if ftype == TType.STRING: + self.key = iprot.readString(); + else: + iprot.skip(ftype) + elif fid == 2: + if ftype == TType.STRING: + self.value = iprot.readString(); + else: + iprot.skip(ftype) + elif fid == 3: + if ftype == TType.I32: + self.annotation_type = iprot.readI32(); + else: + iprot.skip(ftype) + elif fid == 4: + if ftype == TType.STRUCT: + self.host = Endpoint() + self.host.read(iprot) + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None: + oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec))) + return + oprot.writeStructBegin('BinaryAnnotation') + if self.key is not None: + oprot.writeFieldBegin('key', TType.STRING, 1) + oprot.writeString(self.key) + oprot.writeFieldEnd() + if self.value is not None: + oprot.writeFieldBegin('value', TType.STRING, 2) + oprot.writeString(self.value) + oprot.writeFieldEnd() + if self.annotation_type is not None: + oprot.writeFieldBegin('annotation_type', TType.I32, 3) + oprot.writeI32(self.annotation_type) + oprot.writeFieldEnd() + if self.host is not None: + oprot.writeFieldBegin('host', TType.STRUCT, 4) + self.host.write(oprot) + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.iteritems()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) + +class Span: + """ + Attributes: + - trace_id + - name + - id + - parent_id + - annotations + - binary_annotations + """ + + thrift_spec = ( + None, # 0 + (1, TType.I64, 'trace_id', None, None, ), # 1 + None, # 2 + (3, TType.STRING, 'name', None, None, ), # 3 + (4, TType.I64, 'id', None, None, ), # 4 + (5, TType.I64, 'parent_id', None, None, ), # 5 + (6, TType.LIST, 'annotations', (TType.STRUCT,(Annotation, Annotation.thrift_spec)), None, ), # 6 + None, # 7 + (8, TType.LIST, 'binary_annotations', (TType.STRUCT,(BinaryAnnotation, BinaryAnnotation.thrift_spec)), None, ), # 8 + ) + + def __init__(self, trace_id=None, name=None, id=None, parent_id=None, annotations=None, binary_annotations=None,): + self.trace_id = trace_id + self.name = name + self.id = id + self.parent_id = parent_id + self.annotations = annotations + self.binary_annotations = binary_annotations + + def read(self, iprot): + if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None: + fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec)) + return + iprot.readStructBegin() + while True: + (fname, ftype, fid) = iprot.readFieldBegin() + if ftype == TType.STOP: + break + if fid == 1: + if ftype == TType.I64: + self.trace_id = iprot.readI64(); + else: + iprot.skip(ftype) + elif fid == 3: + if ftype == TType.STRING: + self.name = iprot.readString(); + else: + iprot.skip(ftype) + elif fid == 4: + if ftype == TType.I64: + self.id = iprot.readI64(); + else: + iprot.skip(ftype) + elif fid == 5: + if ftype == TType.I64: + self.parent_id = iprot.readI64(); + else: + iprot.skip(ftype) + elif fid == 6: + if ftype == TType.LIST: + self.annotations = [] + (_etype3, _size0) = iprot.readListBegin() + for _i4 in xrange(_size0): + _elem5 = Annotation() + _elem5.read(iprot) + self.annotations.append(_elem5) + iprot.readListEnd() + else: + iprot.skip(ftype) + elif fid == 8: + if ftype == TType.LIST: + self.binary_annotations = [] + (_etype9, _size6) = iprot.readListBegin() + for _i10 in xrange(_size6): + _elem11 = BinaryAnnotation() + _elem11.read(iprot) + self.binary_annotations.append(_elem11) + iprot.readListEnd() + else: + iprot.skip(ftype) + else: + iprot.skip(ftype) + iprot.readFieldEnd() + iprot.readStructEnd() + + def write(self, oprot): + if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None: + oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec))) + return + oprot.writeStructBegin('Span') + if self.trace_id is not None: + oprot.writeFieldBegin('trace_id', TType.I64, 1) + oprot.writeI64(self.trace_id) + oprot.writeFieldEnd() + if self.name is not None: + oprot.writeFieldBegin('name', TType.STRING, 3) + oprot.writeString(self.name) + oprot.writeFieldEnd() + if self.id is not None: + oprot.writeFieldBegin('id', TType.I64, 4) + oprot.writeI64(self.id) + oprot.writeFieldEnd() + if self.parent_id is not None: + oprot.writeFieldBegin('parent_id', TType.I64, 5) + oprot.writeI64(self.parent_id) + oprot.writeFieldEnd() + if self.annotations is not None: + oprot.writeFieldBegin('annotations', TType.LIST, 6) + oprot.writeListBegin(TType.STRUCT, len(self.annotations)) + for iter12 in self.annotations: + iter12.write(oprot) + oprot.writeListEnd() + oprot.writeFieldEnd() + if self.binary_annotations is not None: + oprot.writeFieldBegin('binary_annotations', TType.LIST, 8) + oprot.writeListBegin(TType.STRUCT, len(self.binary_annotations)) + for iter13 in self.binary_annotations: + iter13.write(oprot) + oprot.writeListEnd() + oprot.writeFieldEnd() + oprot.writeFieldStop() + oprot.writeStructEnd() + + def validate(self): + return + + + def __repr__(self): + L = ['%s=%r' % (key, value) + for key, value in self.__dict__.iteritems()] + return '%s(%s)' % (self.__class__.__name__, ', '.join(L)) + + def __eq__(self, other): + return isinstance(other, self.__class__) and self.__dict__ == other.__dict__ + + def __ne__(self, other): + return not (self == other) diff --git a/eventlet/zipkin/api.py b/eventlet/zipkin/api.py new file mode 100644 index 0000000..cd03ec0 --- /dev/null +++ b/eventlet/zipkin/api.py @@ -0,0 +1,186 @@ +import os +import sys +import time +import struct +import socket +import random + +from eventlet.green import threading +from eventlet.zipkin._thrift.zipkinCore import ttypes +from eventlet.zipkin._thrift.zipkinCore.constants import SERVER_SEND + + +client = None +_tls = threading.local() # thread local storage + + +def put_annotation(msg, endpoint=None): + """ This is annotation API. + You can add your own annotation from in your code. + Annotation is recorded with timestamp automatically. + e.g.) put_annotation('cache hit for %s' % request) + + :param msg: String message + :param endpoint: host info + """ + if is_sample(): + a = ZipkinDataBuilder.build_annotation(msg, endpoint) + trace_data = get_trace_data() + trace_data.add_annotation(a) + + +def put_key_value(key, value, endpoint=None): + """ This is binary annotation API. + You can add your own key-value extra information from in your code. + Key-value doesn't have a time component. + e.g.) put_key_value('http.uri', '/hoge/index.html') + + :param key: String + :param value: String + :param endpoint: host info + """ + if is_sample(): + b = ZipkinDataBuilder.build_binary_annotation(key, value, endpoint) + trace_data = get_trace_data() + trace_data.add_binary_annotation(b) + + +def is_tracing(): + """ Return whether the current thread is tracking or not """ + return hasattr(_tls, 'trace_data') + + +def is_sample(): + """ Return whether it should record trace information + for the request or not + """ + return is_tracing() and _tls.trace_data.sampled + + +def get_trace_data(): + if is_tracing(): + return _tls.trace_data + + +def set_trace_data(trace_data): + _tls.trace_data = trace_data + + +def init_trace_data(): + if is_tracing(): + del _tls.trace_data + + +def _uniq_id(): + """ + Create a random 64-bit signed integer appropriate + for use as trace and span IDs. + XXX: By experimentation zipkin has trouble recording traces with ids + larger than (2 ** 56) - 1 + """ + return random.randint(0, (2 ** 56) - 1) + + +def generate_trace_id(): + return _uniq_id() + + +def generate_span_id(): + return _uniq_id() + + +class TraceData(object): + + END_ANNOTATION = SERVER_SEND + + def __init__(self, name, trace_id, span_id, parent_id, sampled, endpoint): + """ + :param name: RPC name (String) + :param trace_id: int + :param span_id: int + :param parent_id: int or None + :param sampled: lets the downstream servers know + if I should record trace data for the request (bool) + :param endpoint: zipkin._thrift.zipkinCore.ttypes.EndPoint + """ + self.name = name + self.trace_id = trace_id + self.span_id = span_id + self.parent_id = parent_id + self.sampled = sampled + self.endpoint = endpoint + self.annotations = [] + self.bannotations = [] + self._done = False + + def add_annotation(self, annotation): + if annotation.host is None: + annotation.host = self.endpoint + if not self._done: + self.annotations.append(annotation) + if annotation.value == self.END_ANNOTATION: + self.flush() + + def add_binary_annotation(self, bannotation): + if bannotation.host is None: + bannotation.host = self.endpoint + if not self._done: + self.bannotations.append(bannotation) + + def flush(self): + span = ZipkinDataBuilder.build_span(name=self.name, + trace_id=self.trace_id, + span_id=self.span_id, + parent_id=self.parent_id, + annotations=self.annotations, + bannotations=self.bannotations) + client.send_to_collector(span) + self.annotations = [] + self.bannotations = [] + self._done = True + + +class ZipkinDataBuilder: + @staticmethod + def build_span(name, trace_id, span_id, parent_id, + annotations, bannotations): + return ttypes.Span( + name=name, + trace_id=trace_id, + id=span_id, + parent_id=parent_id, + annotations=annotations, + binary_annotations=bannotations + ) + + @staticmethod + def build_annotation(value, endpoint=None): + if isinstance(value, unicode): + value = value.encode('utf-8') + return ttypes.Annotation(time.time() * 1000 * 1000, + str(value), endpoint) + + @staticmethod + def build_binary_annotation(key, value, endpoint=None): + annotation_type = ttypes.AnnotationType.STRING + return ttypes.BinaryAnnotation(key, value, annotation_type, endpoint) + + @staticmethod + def build_endpoint(ipv4=None, port=None, service_name=None): + if ipv4 is not None: + ipv4 = ZipkinDataBuilder._ipv4_to_int(ipv4) + if service_name is None: + service_name = ZipkinDataBuilder._get_script_name() + return ttypes.Endpoint( + ipv4=ipv4, + port=port, + service_name=service_name + ) + + @staticmethod + def _ipv4_to_int(ipv4): + return struct.unpack('!i', socket.inet_aton(ipv4))[0] + + @staticmethod + def _get_script_name(): + return os.path.basename(sys.argv[0]) diff --git a/eventlet/zipkin/client.py b/eventlet/zipkin/client.py new file mode 100644 index 0000000..c94070a --- /dev/null +++ b/eventlet/zipkin/client.py @@ -0,0 +1,56 @@ +import base64 +import warnings + +from scribe import scribe +from thrift.transport import TTransport, TSocket +from thrift.protocol import TBinaryProtocol + +from eventlet import GreenPile + + +CATEGORY = 'zipkin' + + +class ZipkinClient(object): + + def __init__(self, host='127.0.0.1', port=9410): + """ + :param host: zipkin collector IP addoress (default '127.0.0.1') + :param port: zipkin collector port (default 9410) + """ + self.host = host + self.port = port + self.pile = GreenPile(1) + self._connect() + + def _connect(self): + socket = TSocket.TSocket(self.host, self.port) + self.transport = TTransport.TFramedTransport(socket) + protocol = TBinaryProtocol.TBinaryProtocol(self.transport, + False, False) + self.scribe_client = scribe.Client(protocol) + try: + self.transport.open() + except TTransport.TTransportException as e: + warnings.warn(e.message) + + def _build_message(self, thrift_obj): + trans = TTransport.TMemoryBuffer() + protocol = TBinaryProtocol.TBinaryProtocolAccelerated(trans=trans) + thrift_obj.write(protocol) + return base64.b64encode(trans.getvalue()) + + def send_to_collector(self, span): + self.pile.spawn(self._send, span) + + def _send(self, span): + log_entry = scribe.LogEntry(CATEGORY, self._build_message(span)) + try: + self.scribe_client.Log([log_entry]) + except Exception as e: + msg = 'ZipkinClient send error %s' % str(e) + warnings.warn(msg) + self._connect() + + def close(self): + self.transport.close() diff --git a/eventlet/zipkin/example/ex1.png b/eventlet/zipkin/example/ex1.png new file mode 100755 index 0000000000000000000000000000000000000000..7f7a0497e4266e593414a8a3dba43c1ab42722fd GIT binary patch literal 53179 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%0ATU6V5Xpc`?$tvQA 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�M*!eShP<2D7c7#o0Kb(!I=n(% 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%0DD?r|8pyZ?3f%x<=Xv_p(DCy{li$ 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 literal 0 HcmV?d00001 diff --git a/eventlet/zipkin/example/ex3.png b/eventlet/zipkin/example/ex3.png new file mode 100755 index 0000000000000000000000000000000000000000..5ff98603e359ac3733a551d45f1da2ffc55c5c9b GIT binary patch literal 73175 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 M-v4FAzY>%G14MZ?HUIzs literal 0 HcmV?d00001 diff --git a/eventlet/zipkin/greenthread.py b/eventlet/zipkin/greenthread.py new file mode 100644 index 0000000..37e12d6 --- /dev/null +++ b/eventlet/zipkin/greenthread.py @@ -0,0 +1,33 @@ +from eventlet import greenthread + +from eventlet.zipkin import api + + +__original_init__ = greenthread.GreenThread.__init__ +__original_main__ = greenthread.GreenThread.main + + +def _patched__init(self, parent): + # parent thread saves current TraceData from tls to self + if api.is_tracing(): + self.trace_data = api.get_trace_data() + + __original_init__(self, parent) + + +def _patched_main(self, function, args, kwargs): + # child thread inherits TraceData + if hasattr(self, 'trace_data'): + api.set_trace_data(self.trace_data) + + __original_main__(self, function, args, kwargs) + + +def patch(): + greenthread.GreenThread.__init__ = _patched__init + greenthread.GreenThread.main = _patched_main + + +def unpatch(): + greenthread.GreenThread.__init__ = __original_init__ + greenthread.GreenThread.main = __original_main__ diff --git a/eventlet/zipkin/http.py b/eventlet/zipkin/http.py new file mode 100644 index 0000000..668c3f9 --- /dev/null +++ b/eventlet/zipkin/http.py @@ -0,0 +1,61 @@ +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,) diff --git a/eventlet/zipkin/log.py b/eventlet/zipkin/log.py new file mode 100644 index 0000000..b7f9d32 --- /dev/null +++ b/eventlet/zipkin/log.py @@ -0,0 +1,19 @@ +import logging + +from eventlet.zipkin import api + + +__original_handle__ = logging.Logger.handle + + +def _patched_handle(self, record): + __original_handle__(self, record) + api.put_annotation(record.getMessage()) + + +def patch(): + logging.Logger.handle = _patched_handle + + +def unpatch(): + logging.Logger.handle = __original_handle__ diff --git a/eventlet/zipkin/patcher.py b/eventlet/zipkin/patcher.py new file mode 100644 index 0000000..8e7d8ad --- /dev/null +++ b/eventlet/zipkin/patcher.py @@ -0,0 +1,41 @@ +from eventlet.zipkin import http +from eventlet.zipkin import wsgi +from eventlet.zipkin import greenthread +from eventlet.zipkin import log +from eventlet.zipkin import api +from eventlet.zipkin.client import ZipkinClient + + +def enable_trace_patch(host='127.0.0.1', port=9410, + trace_app_log=False, sampling_rate=1.0): + """ Apply monkey patch to trace your WSGI application. + + :param host: Scribe daemon IP address (default: '127.0.0.1') + :param port: Scribe daemon port (default: 9410) + :param trace_app_log: A Boolean indicating if the tracer will trace + application log together or not. This facility assume that + your application uses python standard logging library. + (default: False) + :param sampling_rate: A Float value (0.0~1.0) that indicates + the tracing frequency. If you specify 1.0, all request + are traced (and sent to Zipkin collecotr). + If you specify 0.1, only 1/10 requests are traced. (default: 1.0) + """ + api.client = ZipkinClient(host, port) + + # monkey patch for adding tracing facility + wsgi.patch(sampling_rate) + http.patch() + greenthread.patch() + + # monkey patch for capturing application log + if trace_app_log: + log.patch() + + +def disable_trace_patch(): + http.unpatch() + wsgi.unpatch() + greenthread.unpatch() + log.unpatch() + api.client.close() diff --git a/eventlet/zipkin/wsgi.py b/eventlet/zipkin/wsgi.py new file mode 100644 index 0000000..3d52911 --- /dev/null +++ b/eventlet/zipkin/wsgi.py @@ -0,0 +1,78 @@ +import random + +from eventlet import wsgi +from eventlet.zipkin import api +from eventlet.zipkin._thrift.zipkinCore.constants import \ + SERVER_RECV, SERVER_SEND +from eventlet.zipkin.http import \ + HDR_TRACE_ID, HDR_SPAN_ID, HDR_PARENT_SPAN_ID, HDR_SAMPLED + + +_sampler = None +__original_handle_one_response__ = wsgi.HttpProtocol.handle_one_response + + +def _patched_handle_one_response(self): + api.init_trace_data() + trace_id = int_or_none(self.headers.getheader(HDR_TRACE_ID)) + span_id = int_or_none(self.headers.getheader(HDR_SPAN_ID)) + parent_id = int_or_none(self.headers.getheader(HDR_PARENT_SPAN_ID)) + sampled = bool_or_none(self.headers.getheader(HDR_SAMPLED)) + if trace_id is None: # front-end server + trace_id = span_id = api.generate_trace_id() + parent_id = None + sampled = _sampler.sampling() + ip, port = self.request.getsockname()[:2] + ep = api.ZipkinDataBuilder.build_endpoint(ip, port) + trace_data = api.TraceData(name=self.command, + trace_id=trace_id, + span_id=span_id, + parent_id=parent_id, + sampled=sampled, + endpoint=ep) + api.set_trace_data(trace_data) + api.put_annotation(SERVER_RECV) + api.put_key_value('http.uri', self.path) + + __original_handle_one_response__(self) + + if api.is_sample(): + api.put_annotation(SERVER_SEND) + + +class Sampler(object): + def __init__(self, sampling_rate): + self.sampling_rate = sampling_rate + + def sampling(self): + # avoid generating unneeded random numbers + if self.sampling_rate == 1.0: + return True + r = random.random() + if r < self.sampling_rate: + return True + return False + + +def int_or_none(val): + if val is None: + return None + return int(val, 16) + + +def bool_or_none(val): + if val == '1': + return True + if val == '0': + return False + return None + + +def patch(sampling_rate): + global _sampler + _sampler = Sampler(sampling_rate) + wsgi.HttpProtocol.handle_one_response = _patched_handle_one_response + + +def unpatch(): + wsgi.HttpProtocol.handle_one_response = __original_handle_one_response__