1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
# -*- coding: utf-8 -*-
from __future__ import absolute_import
import copy
import contextlib
import threading
import uuid
ctx = threading.local()
class TrackerBase(object):
def __init__(self, client=None, server=None):
self.client = client
self.server = server
def handle(self, header):
ctx.header = header
ctx.counter = 0
def gen_header(self, header):
header.request_id = self.get_request_id()
if not hasattr(ctx, "counter"):
ctx.counter = 0
ctx.counter += 1
if hasattr(ctx, "header"):
header.seq = "{prev_seq}.{cur_counter}".format(
prev_seq=ctx.header.seq, cur_counter=ctx.counter)
header.meta = ctx.header.meta
else:
header.meta = {}
header.seq = str(ctx.counter)
if hasattr(ctx, "meta"):
header.meta.update(ctx.meta)
def record(self, header, exception):
pass
@classmethod
@contextlib.contextmanager
def counter(cls, init=0):
"""Context for manually setting counter of seq number.
:init: init value
"""
if not hasattr(ctx, "counter"):
ctx.counter = 0
old = ctx.counter
ctx.counter = init
try:
yield
finally:
ctx.counter = old
@classmethod
@contextlib.contextmanager
def annotate(cls, **kwargs):
ctx.annotation = kwargs
try:
yield ctx.annotation
finally:
del ctx.annotation
@classmethod
@contextlib.contextmanager
def add_meta(cls, **kwds):
if hasattr(ctx, 'meta'):
old_dict = copy.copy(ctx.meta)
ctx.meta.update(kwds)
try:
yield ctx.meta
finally:
ctx.meta = old_dict
else:
ctx.meta = kwds
try:
yield ctx.meta
finally:
del ctx.meta
@property
def meta(self):
meta = ctx.header.meta if hasattr(ctx, "header") else {}
if hasattr(ctx, "meta"):
meta.update(ctx.meta)
return meta
@property
def annotation(self):
return ctx.annotation if hasattr(ctx, "annotation") else {}
def get_request_id(self):
if hasattr(ctx, "header"):
return ctx.header.request_id
return str(uuid.uuid4())
def init_handshake_info(self, handshake_obj):
pass
def handle_handshake_info(self, handshake_obj):
pass
class ConsoleTracker(TrackerBase):
def record(self, header, exception):
print(header)
|