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
# -*- coding:utf-8 -*-
from functools import wraps
from gm_tracer.context import register_tracer, current_tracer, get_current_span, active_span
from helios.rpc import get_mesh_info, set_mesh_info
trace_info_attr_name = '_trace_attr_'
def init_tracer(instance=None):
'''
获取请求链路跟踪数据, 返回或封装实例
:return:
{
'tracer':,
'mesh_attr':
}
'''
tracer = current_tracer()
mesh_attr = get_mesh_info()
span = get_current_span()
trace_info = {
'tracer': tracer,
'mesh_attr': mesh_attr,
'span': span,
}
if instance:
setattr(instance, trace_info_attr_name, trace_info)
return trace_info
# # 类里调用gevent并发请求时使用, 和init_tracer配合使用
# def wrap_tracer(func):
# @wraps(func)
# def deco(self, *args, **kwargs):
# trace_info = self.trace_info
# register_tracer(trace_info['tracer'])
# set_mesh_info(trace_info['mesh_attr'])
# return func(self, *args, **kwargs)
# return deco
# 支持func & method
# eg:
# func:
# @wrap_tracer
# def func(self, request, *args, **kwargs):
# pass
# method:
# @wrap_tracer(**{'tracer':1, 'mesh_attr':2})
# def method(*args, **kwargs):
# pass
def wrap_tracer(*args, **kwargs):
def _inner_tracer(func):
@wraps(func)
def deco(*f_args, **f_kwargs):
if kwargs:
trace_info = kwargs
else:
trace_info = getattr(f_args[0], trace_info_attr_name, {})
register_tracer(trace_info['tracer'])
set_mesh_info(trace_info['mesh_attr'])
active_span(trace_info['span'])
return func(*f_args, **f_kwargs)
return deco
if len(args) == 1 and callable(args[0]):
return _inner_tracer(args[0])
else:
return _inner_tracer