whatap-python 1.7.5__tar.gz → 1.7.7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {whatap_python-1.7.5 → whatap_python-1.7.7}/PKG-INFO +1 -1
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/__init__.py +34 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/agent/linux/amd64/whatap_python +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/agent/linux/arm64/whatap_python +0 -0
- whatap_python-1.7.7/whatap/build.py +4 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/conf/configuration.py +3 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/application_celery.py +20 -5
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/application_wsgi.py +22 -3
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/database_cxoracle.py +26 -6
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/database_mysql.py +23 -19
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/database_postgresql.py +11 -9
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/database_toolkit.py +13 -3
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/logging.py +37 -2
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/trace_context.py +11 -6
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap_python.egg-info/PKG-INFO +1 -1
- whatap_python-1.7.5/whatap/build.py +0 -4
- {whatap_python-1.7.5 → whatap_python-1.7.7}/README.md +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/setup.cfg +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/setup.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/LICENSE +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/README.rst +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/__main__.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/agent/darwin/amd64/whatap_python +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/agent/darwin/arm64/whatap_python +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/bootstrap/__init__.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/bootstrap/sitecustomize.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/conf/__init__.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/conf/configure.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/conf/license.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/control/__init__.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/counter/__init__.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/counter/counter_manager.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/counter/tasks/__init__.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/counter/tasks/openfiledescriptor.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/io/__init__.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/io/data_inputx.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/io/data_outputx.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/net/__init__.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/net/async_sender.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/net/packet_enum.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/net/packet_type_enum.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/net/param_def.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/net/stackhelper.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/net/udp_session.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/net/udp_thread.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/pack/__init__.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/pack/logSinkPack.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/pack/pack.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/pack/pack_enum.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/pack/tagCountPack.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/scripts/__init__.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/__init__.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/__init__.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/amqp_kombu.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/amqp_pika.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/application_bottle.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/application_cherrypy.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/application_django.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/application_django_asgi.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/application_django_py3.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/application_fastapi.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/application_flask.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/application_frappe.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/application_graphql.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/application_nameko.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/application_tornado.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/database_mongo.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/database_redis.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/email_smtp.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/httpc_django.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/httpc_httplib.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/httpc_requests.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/httpc_urllib3.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/plugin.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/simple_trace_context.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/trace_context_manager.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/trace_import.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/trace_module_definition.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/__init__.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/bit_util.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/cardinality/__init__.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/cardinality/hyperloglog.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/cardinality/murmurhash.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/cardinality/registerset.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/compare_util.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/date_util.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/debug_util.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/escape_literal_sql.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/hash_util.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/hexa32.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/int_set.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/ip_util.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/keygen.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/linked_list.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/linked_map.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/metering_util.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/request_double_queue.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/request_queue.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/string_util.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/throttle_util.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/userid_util.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/__init__.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/blob_value.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/boolean_value.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/decimal_value.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/double_summary.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/double_value.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/float_array.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/float_value.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/int_array.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/ip4_value.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/list_value.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/long_array.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/long_summary.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/map_value.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/null_value.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/number_value.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/summary_value.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/text_array.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/text_hash_value.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/text_value.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/value.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/value_enum.py +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/whatap.conf +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap_python.egg-info/SOURCES.txt +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap_python.egg-info/dependency_links.txt +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap_python.egg-info/entry_points.txt +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap_python.egg-info/not-zip-safe +0 -0
- {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap_python.egg-info/top_level.txt +0 -0
|
@@ -7,6 +7,8 @@ import time
|
|
|
7
7
|
from whatap import build
|
|
8
8
|
from whatap.util.date_util import DateUtil
|
|
9
9
|
import threading
|
|
10
|
+
import builtins
|
|
11
|
+
import configparser
|
|
10
12
|
|
|
11
13
|
__version__ = build.version
|
|
12
14
|
|
|
@@ -47,6 +49,38 @@ LOG_FILE_NAME = 'whatap-hook.log'
|
|
|
47
49
|
|
|
48
50
|
isFrappeCommands = "get-frappe-commands" in sys.argv if hasattr(sys, "argv") else False
|
|
49
51
|
|
|
52
|
+
temporary_config = configparser.ConfigParser()
|
|
53
|
+
|
|
54
|
+
try:
|
|
55
|
+
if os.path.exists('whatap.conf'):
|
|
56
|
+
with open('whatap.conf') as f:
|
|
57
|
+
file_content = f.read()
|
|
58
|
+
temporary_file_content = '[dummy_section]\n' + file_content
|
|
59
|
+
temporary_config.read_string(temporary_file_content)
|
|
60
|
+
console_option = temporary_config.get('dummy_section', 'ignore_whatap_stdout', fallback='false')
|
|
61
|
+
else:
|
|
62
|
+
console_option = 'false'
|
|
63
|
+
except Exception as e:
|
|
64
|
+
print('WHATAP : WHATAP.CONF READ ERROR')
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
original_print = builtins.print
|
|
69
|
+
|
|
70
|
+
def print_option(func):
|
|
71
|
+
def wrapper(*args, **kwargs):
|
|
72
|
+
|
|
73
|
+
if(console_option == 'false'):
|
|
74
|
+
result = func(*args, **kwargs)
|
|
75
|
+
else:
|
|
76
|
+
result = None
|
|
77
|
+
return result
|
|
78
|
+
return wrapper
|
|
79
|
+
|
|
80
|
+
__builtins__ = dict(__builtins__)
|
|
81
|
+
__builtins__['print'] = print_option(original_print)
|
|
82
|
+
|
|
83
|
+
|
|
50
84
|
def whatap_print(*args):
|
|
51
85
|
if isFrappeCommands:
|
|
52
86
|
logging.info(*args)
|
|
Binary file
|
|
Binary file
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
Configuration = {
|
|
2
2
|
"dev": False,
|
|
3
|
+
"ignore_whatap_stdout" : False,
|
|
3
4
|
"net_udp_port": "6600",
|
|
4
5
|
"web_static_content_extensions": "js, htm, html, gif, png, jpg, css, swf, ico",
|
|
5
6
|
"trace_auto_normalize_enabled": True,
|
|
6
7
|
"trace_user_enabled": True,
|
|
7
8
|
"trace_user_using_ip": True,
|
|
8
9
|
"trace_logging_enabled": False,
|
|
10
|
+
"trace_logging_mtid_enabled": False,
|
|
9
11
|
"trace_loguru_enabled": False,
|
|
12
|
+
"trace_loguru_mtid_enabled": False,
|
|
10
13
|
"trace_ignore_url_set": [],
|
|
11
14
|
"trace_ignore_url_prefix": None,
|
|
12
15
|
|
|
@@ -19,6 +19,7 @@ def interceptor(fn, task_name, *args, **kwargs):
|
|
|
19
19
|
return callback
|
|
20
20
|
except Exception as e:
|
|
21
21
|
interceptor_step_error(e)
|
|
22
|
+
raise e
|
|
22
23
|
finally:
|
|
23
24
|
if ctx:
|
|
24
25
|
end_interceptor(ctx=ctx)
|
|
@@ -27,14 +28,28 @@ def trace_handler(fn, start=False):
|
|
|
27
28
|
def handler(func):
|
|
28
29
|
@wraps(func)
|
|
29
30
|
def wrapper(*args, **kwargs):
|
|
31
|
+
|
|
30
32
|
ctx = TraceContextManager.getLocalContext()
|
|
33
|
+
|
|
31
34
|
if not start and not ctx:
|
|
32
35
|
return fn(*args, **kwargs)
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
|
|
37
|
+
try:
|
|
38
|
+
callback = func(*args, **kwargs)
|
|
39
|
+
except Exception as e:
|
|
40
|
+
ctx = TraceContextManager.getLocalContext()
|
|
41
|
+
if ctx and ctx.error_step == e:
|
|
42
|
+
ctx.error_step = None
|
|
43
|
+
raise e
|
|
44
|
+
raise
|
|
45
|
+
else:
|
|
46
|
+
ctx = TraceContextManager.getLocalContext()
|
|
47
|
+
if ctx and ctx.error_step:
|
|
48
|
+
e = ctx.error_step
|
|
49
|
+
ctx.error_step = None
|
|
50
|
+
raise e
|
|
51
|
+
return callback
|
|
52
|
+
|
|
38
53
|
return wrapper
|
|
39
54
|
|
|
40
55
|
return handler
|
|
@@ -382,7 +382,7 @@ def interceptor_sock_connect(fn, *args, **kwargs):
|
|
|
382
382
|
ctx.socket_connecting = False
|
|
383
383
|
|
|
384
384
|
|
|
385
|
-
def interceptor_db_con(fn,
|
|
385
|
+
def interceptor_db_con(fn, db_info, *args, **kwargs):
|
|
386
386
|
ctx = TraceContextManager.getLocalContext()
|
|
387
387
|
if not ctx:
|
|
388
388
|
return fn(*args, **kwargs)
|
|
@@ -399,7 +399,8 @@ def interceptor_db_con(fn, db_type, *args, **kwargs):
|
|
|
399
399
|
if not kwargs:
|
|
400
400
|
kwargs = dict(
|
|
401
401
|
x.split('=') for x in re.sub(r'\s*=\s*', '=', args[0]).split())
|
|
402
|
-
|
|
402
|
+
|
|
403
|
+
text = '{}://'.format(db_info.get('type'))
|
|
403
404
|
text += kwargs.get('user')
|
|
404
405
|
text += "@"
|
|
405
406
|
text += kwargs.get('host', kwargs.get('dsn', ''))
|
|
@@ -441,7 +442,7 @@ def addQuoteList(arg_list):
|
|
|
441
442
|
return tuple(quoted_list)
|
|
442
443
|
|
|
443
444
|
|
|
444
|
-
def interceptor_db_execute(fn, *args, **kwargs):
|
|
445
|
+
def interceptor_db_execute(fn, db_info, *args, **kwargs):
|
|
445
446
|
ctx = TraceContextManager.getLocalContext()
|
|
446
447
|
# sendDebugProfile(ctx, 'interceptor_db_execute step -1')
|
|
447
448
|
self = args[0]
|
|
@@ -465,6 +466,24 @@ def interceptor_db_execute(fn, *args, **kwargs):
|
|
|
465
466
|
if not query:
|
|
466
467
|
return fn(*args, **kwargs)
|
|
467
468
|
|
|
469
|
+
start_time = DateUtil.nowSystem()
|
|
470
|
+
ctx.start_time = start_time
|
|
471
|
+
|
|
472
|
+
text = '{}://'.format(db_info.get('type'))
|
|
473
|
+
text += db_info.get('user')
|
|
474
|
+
text += "@"
|
|
475
|
+
text += db_info.get('host', db_info.get('dsn', ''))
|
|
476
|
+
text += '/'
|
|
477
|
+
text += db_info.get('database', db_info.get('db', db_info.get('dbname', '')))
|
|
478
|
+
ctx.active_dbc = text
|
|
479
|
+
ctx.lctx['dbc'] = text
|
|
480
|
+
|
|
481
|
+
ctx.active_dbc = 0
|
|
482
|
+
|
|
483
|
+
datas = [text]
|
|
484
|
+
ctx.elapsed = DateUtil.nowSystem() - start_time
|
|
485
|
+
async_sender.send_packet(PacketTypeEnum.TX_DB_CONN, ctx, datas)
|
|
486
|
+
|
|
468
487
|
start_time = DateUtil.nowSystem()
|
|
469
488
|
ctx.start_time = start_time
|
|
470
489
|
ctx.active_sqlhash = query
|
|
@@ -2,27 +2,47 @@ from whatap.trace import get_dict
|
|
|
2
2
|
from whatap.trace.mod.application_wsgi import trace_handler, \
|
|
3
3
|
interceptor_db_con, interceptor_db_execute, interceptor_db_close
|
|
4
4
|
|
|
5
|
+
db_info = {}
|
|
6
|
+
|
|
7
|
+
|
|
5
8
|
def instrument_oracle_client(module):
|
|
9
|
+
|
|
6
10
|
def wrapper(fn):
|
|
7
11
|
@trace_handler(fn)
|
|
8
12
|
def trace(*args, **kwargs):
|
|
9
|
-
|
|
10
|
-
|
|
13
|
+
global db_info
|
|
14
|
+
db_info = {'type': 'oracle'} | kwargs
|
|
15
|
+
|
|
16
|
+
callback = interceptor_db_con(fn, db_info, *args, **kwargs)
|
|
11
17
|
return callback
|
|
12
|
-
|
|
18
|
+
|
|
13
19
|
return trace
|
|
20
|
+
|
|
14
21
|
if hasattr(module, "connect"):
|
|
15
22
|
module.connect = wrapper(module.connect)
|
|
16
|
-
|
|
23
|
+
|
|
17
24
|
def wrapper(fn):
|
|
18
25
|
@trace_handler(fn)
|
|
19
26
|
def trace(*args, **kwargs):
|
|
20
27
|
callback = interceptor_db_close(fn, *args, **kwargs)
|
|
21
28
|
return callback
|
|
22
|
-
|
|
29
|
+
|
|
23
30
|
return trace
|
|
24
|
-
|
|
31
|
+
|
|
25
32
|
if hasattr(module, "Connection") and hasattr(module.Connection, "close"):
|
|
26
33
|
get_dict(module.Connection)['close'] = wrapper(
|
|
27
34
|
module.Connection.close)
|
|
28
35
|
|
|
36
|
+
# def wrapper(fn):
|
|
37
|
+
# @trace_handler(fn)
|
|
38
|
+
# def trace(*args, **kwargs):
|
|
39
|
+
# callback = interceptor_db_execute(fn, db_info, *args, **kwargs)
|
|
40
|
+
# return callback
|
|
41
|
+
#
|
|
42
|
+
# return trace
|
|
43
|
+
#
|
|
44
|
+
# if hasattr(module, 'Cursor') and hasattr(module.Cursor, "execute"):
|
|
45
|
+
# get_dict(module.Cursor)['execute'] = wrapper(module.Cursor.execute)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
@@ -2,27 +2,30 @@ from whatap.trace import get_dict
|
|
|
2
2
|
from whatap.trace.mod.application_wsgi import trace_handler, \
|
|
3
3
|
interceptor_db_con, interceptor_db_execute, interceptor_db_close
|
|
4
4
|
|
|
5
|
+
db_info = {}
|
|
5
6
|
|
|
6
7
|
def instrument_MySQLdb(module):
|
|
7
8
|
def wrapper(fn):
|
|
8
9
|
@trace_handler(fn)
|
|
9
10
|
def trace(*args, **kwargs):
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
global db_info
|
|
12
|
+
db_info = {'type': 'mysql'} | kwargs
|
|
13
|
+
callback = interceptor_db_con(fn, db_info, *args, **kwargs)
|
|
12
14
|
return callback
|
|
13
|
-
|
|
15
|
+
|
|
14
16
|
return trace
|
|
17
|
+
|
|
15
18
|
if hasattr(module, "connect"):
|
|
16
19
|
module.connect = wrapper(module.connect)
|
|
17
|
-
|
|
20
|
+
|
|
18
21
|
def wrapper(fn):
|
|
19
22
|
@trace_handler(fn)
|
|
20
23
|
def trace(*args, **kwargs):
|
|
21
24
|
callback = interceptor_db_close(fn, *args, **kwargs)
|
|
22
25
|
return callback
|
|
23
|
-
|
|
26
|
+
|
|
24
27
|
return trace
|
|
25
|
-
|
|
28
|
+
|
|
26
29
|
if hasattr(module, "connection") and hasattr(module.connection, "close"):
|
|
27
30
|
get_dict(module.connection)['close'] = wrapper(
|
|
28
31
|
module.connection.close)
|
|
@@ -32,35 +35,36 @@ def instrument_MySQLdb_cursors(module):
|
|
|
32
35
|
def wrapper(fn):
|
|
33
36
|
@trace_handler(fn)
|
|
34
37
|
def trace(*args, **kwargs):
|
|
35
|
-
callback = interceptor_db_execute(fn, *args, **kwargs)
|
|
38
|
+
callback = interceptor_db_execute(fn, db_info, *args, **kwargs)
|
|
36
39
|
return callback
|
|
37
|
-
|
|
40
|
+
|
|
38
41
|
return trace
|
|
39
|
-
|
|
42
|
+
|
|
40
43
|
module.BaseCursor.execute = wrapper(module.BaseCursor.execute)
|
|
41
|
-
if hasattr(module.BaseCursor,'callproc'):
|
|
42
|
-
module.BaseCursor.callproc= wrapper(module.BaseCursor.callproc)
|
|
44
|
+
if hasattr(module.BaseCursor, 'callproc'):
|
|
45
|
+
module.BaseCursor.callproc = wrapper(module.BaseCursor.callproc)
|
|
43
46
|
|
|
44
47
|
def instrument_pymysql(module):
|
|
45
48
|
def wrapper(fn):
|
|
46
49
|
@trace_handler(fn)
|
|
47
50
|
def trace(*args, **kwargs):
|
|
48
|
-
|
|
49
|
-
|
|
51
|
+
global db_info
|
|
52
|
+
db_info = {'type': 'mysql'} | kwargs
|
|
53
|
+
callback = interceptor_db_con(fn, db_info, *args, **kwargs)
|
|
50
54
|
return callback
|
|
51
|
-
|
|
55
|
+
|
|
52
56
|
return trace
|
|
53
|
-
|
|
57
|
+
|
|
54
58
|
module.connect = wrapper(module.connect)
|
|
55
|
-
|
|
59
|
+
|
|
56
60
|
def wrapper(fn):
|
|
57
61
|
@trace_handler(fn)
|
|
58
62
|
def trace(*args, **kwargs):
|
|
59
63
|
callback = interceptor_db_close(fn, *args, **kwargs)
|
|
60
64
|
return callback
|
|
61
|
-
|
|
65
|
+
|
|
62
66
|
return trace
|
|
63
|
-
|
|
67
|
+
|
|
64
68
|
module.connections.Connection.close = wrapper(
|
|
65
69
|
module.connections.Connection.close)
|
|
66
70
|
|
|
@@ -68,7 +72,7 @@ def instrument_pymysql_cursors(module):
|
|
|
68
72
|
def wrapper(fn):
|
|
69
73
|
@trace_handler(fn)
|
|
70
74
|
def trace(*args, **kwargs):
|
|
71
|
-
callback = interceptor_db_execute(fn, *args, **kwargs)
|
|
75
|
+
callback = interceptor_db_execute(fn, db_info, *args, **kwargs)
|
|
72
76
|
return callback
|
|
73
77
|
|
|
74
78
|
return trace
|
|
@@ -2,17 +2,19 @@ from whatap.trace import get_dict
|
|
|
2
2
|
from whatap.trace.mod.application_wsgi import trace_handler, \
|
|
3
3
|
interceptor_db_con, interceptor_db_execute, interceptor_db_close
|
|
4
4
|
|
|
5
|
+
db_info = {}
|
|
5
6
|
|
|
6
7
|
def instrument_psycopg2(module):
|
|
7
8
|
def wrapper(fn):
|
|
8
9
|
@trace_handler(fn)
|
|
9
10
|
def trace(*args, **kwargs):
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
global db_info
|
|
12
|
+
db_info = {'type': 'postgresql'} | kwargs
|
|
13
|
+
callback = interceptor_db_con(fn, db_info, *args, **kwargs)
|
|
12
14
|
return callback
|
|
13
|
-
|
|
15
|
+
|
|
14
16
|
return trace
|
|
15
|
-
|
|
17
|
+
|
|
16
18
|
module.connect = wrapper(module.connect)
|
|
17
19
|
|
|
18
20
|
|
|
@@ -22,9 +24,9 @@ def instrument_psycopg2_connection(module):
|
|
|
22
24
|
def trace(*args, **kwargs):
|
|
23
25
|
callback = interceptor_db_close(fn, *args, **kwargs)
|
|
24
26
|
return callback
|
|
25
|
-
|
|
27
|
+
|
|
26
28
|
return trace
|
|
27
|
-
|
|
29
|
+
|
|
28
30
|
get_dict(module.connection)['close'] = wrapper(module.connection.close)
|
|
29
31
|
|
|
30
32
|
|
|
@@ -32,9 +34,9 @@ def instrument_psycopg2_extensions(module):
|
|
|
32
34
|
def wrapper(fn):
|
|
33
35
|
@trace_handler(fn)
|
|
34
36
|
def trace(*args, **kwargs):
|
|
35
|
-
callback = interceptor_db_execute(fn, *args, **kwargs)
|
|
37
|
+
callback = interceptor_db_execute(fn, db_info, *args, **kwargs)
|
|
36
38
|
return callback
|
|
37
|
-
|
|
39
|
+
|
|
38
40
|
return trace
|
|
39
|
-
|
|
41
|
+
|
|
40
42
|
get_dict(module.cursor)['execute'] = wrapper(module.cursor.execute)
|
|
@@ -47,16 +47,26 @@ def instrument_sqlalchemy_engine(module):
|
|
|
47
47
|
ctx = TraceContextManager.getLocalContext()
|
|
48
48
|
cursor = args[1]
|
|
49
49
|
query = None
|
|
50
|
-
if len(args) > 3 and
|
|
50
|
+
if len(args) > 3 and args[3]:
|
|
51
51
|
try:
|
|
52
52
|
##oracledb 에서 orm 툴로 sqlalchemy 사용하는 경우
|
|
53
|
-
if ":" in args[2] and "oracle" in str(args[0]):
|
|
53
|
+
if (type(args[3]) == dict) and (":" in args[2]) and ("oracle" in str(args[0])):
|
|
54
54
|
oracle_sql_query = args[2]
|
|
55
55
|
for k, v in args[3].items():
|
|
56
56
|
replaced_key = f":{k}"
|
|
57
57
|
replaced_value = f"'{v}'"
|
|
58
|
-
oracle_sql_query = oracle_sql_query.replace(replaced_key,
|
|
58
|
+
oracle_sql_query = oracle_sql_query.replace(replaced_key,
|
|
59
|
+
replaced_value) if replaced_key in oracle_sql_query else None
|
|
59
60
|
query = oracle_sql_query
|
|
61
|
+
|
|
62
|
+
##aiomysql 에서 orm 툴로 sqlalchemy 사용하는 경우
|
|
63
|
+
elif (type(args[3]) == tuple) and ("%s" in args[2]) and ("aiomysql" in str(args[0])):
|
|
64
|
+
my_sql_query = args[2]
|
|
65
|
+
for v in args[3]:
|
|
66
|
+
replaced_value = f"'{v}'"
|
|
67
|
+
my_sql_query = my_sql_query.replace("%s", replaced_value,
|
|
68
|
+
1) if "%s" in my_sql_query else None
|
|
69
|
+
query = my_sql_query
|
|
60
70
|
else:
|
|
61
71
|
query = args[2] % addQuote(args[3])
|
|
62
72
|
except Exception as e:
|
|
@@ -20,11 +20,25 @@ def instrument_loguru(module):
|
|
|
20
20
|
if not ctx:
|
|
21
21
|
return fn(*args, **kwargs)
|
|
22
22
|
|
|
23
|
+
record = args[1]
|
|
24
|
+
|
|
25
|
+
if conf.trace_logging_mtid_enabled and ctx and hasattr(ctx, 'mtid') and ctx.mtid:
|
|
26
|
+
original_message = record["message"]
|
|
27
|
+
try:
|
|
28
|
+
record["message"] = original_message + f" (@mtid: {ctx.mtid})"
|
|
29
|
+
|
|
30
|
+
result = fn(*args, **kwargs)
|
|
31
|
+
record["message"] = original_message
|
|
32
|
+
|
|
33
|
+
return result
|
|
34
|
+
except Exception as e:
|
|
35
|
+
record["message"] = original_message
|
|
36
|
+
|
|
23
37
|
category = "AppLog"
|
|
24
38
|
tags = {'@txid': str(ctx.id)} if ctx is not None else {}
|
|
25
39
|
|
|
26
40
|
filename = None
|
|
27
|
-
record = args[1]
|
|
41
|
+
# record = args[1]
|
|
28
42
|
levelname = record["level"].name
|
|
29
43
|
msg = record["message"]
|
|
30
44
|
fields = {"filename": filename}
|
|
@@ -63,11 +77,32 @@ def instrument_logging(module):
|
|
|
63
77
|
ctx = TraceContextManager.getLocalContext()
|
|
64
78
|
record = args[1]
|
|
65
79
|
|
|
80
|
+
if conf.trace_logging_mtid_enabled and ctx and hasattr(ctx, 'mtid') and ctx.mtid:
|
|
81
|
+
original_msg = record.msg
|
|
82
|
+
original_args = record.args
|
|
83
|
+
try:
|
|
84
|
+
if isinstance(record.msg, str):
|
|
85
|
+
if record.args:
|
|
86
|
+
# 포맷 문자열이 있는 경우, 원본 포맷팅을 먼저 수행
|
|
87
|
+
formatted_msg = record.msg % record.args
|
|
88
|
+
record.msg = formatted_msg
|
|
89
|
+
record.args = () # args를 비워줌
|
|
90
|
+
record.msg = record.msg + f" (@mtid: {ctx.mtid})"
|
|
91
|
+
|
|
92
|
+
result = fn(*args, **kwargs)
|
|
93
|
+
|
|
94
|
+
record.msg = original_msg
|
|
95
|
+
record.args = original_args
|
|
96
|
+
|
|
97
|
+
return result
|
|
98
|
+
except Exception as e:
|
|
99
|
+
record.msg = original_msg
|
|
100
|
+
record.args = original_args
|
|
101
|
+
|
|
66
102
|
##1.3.6 Backward Compatibility
|
|
67
103
|
setattr(record, "txid", None)
|
|
68
104
|
|
|
69
105
|
if not ctx:
|
|
70
|
-
|
|
71
106
|
return fn(*args, **kwargs)
|
|
72
107
|
|
|
73
108
|
instance = args[0]
|
|
@@ -5,11 +5,13 @@ from whatap.conf.configure import Configure as conf
|
|
|
5
5
|
from whatap.trace.trace_context_manager import TraceContextManager
|
|
6
6
|
from whatap.util.date_util import DateUtil
|
|
7
7
|
from whatap.util.hexa32 import Hexa32
|
|
8
|
+
from whatap.util.hash_util import HashUtil
|
|
8
9
|
|
|
9
10
|
from whatap.util.linked_map import LinkedMap
|
|
10
11
|
from resource import getrusage, RUSAGE_SELF
|
|
11
12
|
import os
|
|
12
13
|
|
|
14
|
+
|
|
13
15
|
class TraceContext(object):
|
|
14
16
|
transfer_id = None
|
|
15
17
|
transfer_info = None
|
|
@@ -24,7 +26,7 @@ class TraceContext(object):
|
|
|
24
26
|
self.thread = threading.current_thread()
|
|
25
27
|
self.thread_id = self.thread.ident
|
|
26
28
|
TraceContextManager.start(self)
|
|
27
|
-
|
|
29
|
+
|
|
28
30
|
self.pid = os.getpid()
|
|
29
31
|
|
|
30
32
|
self.start_time = 0
|
|
@@ -32,7 +34,7 @@ class TraceContext(object):
|
|
|
32
34
|
self.start_malloc = 0
|
|
33
35
|
|
|
34
36
|
self.status = 0
|
|
35
|
-
self.asgi_response= None
|
|
37
|
+
self.asgi_response = None
|
|
36
38
|
self.service_hash = 0
|
|
37
39
|
self.service_name = ''
|
|
38
40
|
self.remoteIp = ''
|
|
@@ -97,7 +99,7 @@ class TraceContext(object):
|
|
|
97
99
|
self.db_opening = False
|
|
98
100
|
self.socket_connecting = False
|
|
99
101
|
|
|
100
|
-
self.mcaller_url_hash= 0
|
|
102
|
+
self.mcaller_url_hash = 0
|
|
101
103
|
|
|
102
104
|
self.lctx = {}
|
|
103
105
|
self.is_ignored = False
|
|
@@ -135,7 +137,7 @@ class TraceContext(object):
|
|
|
135
137
|
sb = []
|
|
136
138
|
sb.append(str(conf.mtrace_spec))
|
|
137
139
|
sb.append(str(self.service_hash))
|
|
138
|
-
|
|
140
|
+
|
|
139
141
|
transfer_info = ','.join(sb)
|
|
140
142
|
return transfer_info
|
|
141
143
|
|
|
@@ -157,13 +159,16 @@ class TraceContext(object):
|
|
|
157
159
|
x = headerString.index(',')
|
|
158
160
|
s1 = headerString[0: x]
|
|
159
161
|
self.mcaller_spec = s1
|
|
160
|
-
self.mcaller_url_hash = headerString[x + 1:
|
|
162
|
+
self.mcaller_url_hash = headerString[x + 1:]
|
|
161
163
|
|
|
162
164
|
def setTxid(self, myid):
|
|
163
165
|
self.id = Hexa32.toLong32(myid)
|
|
164
166
|
|
|
165
167
|
def transferPOID(self):
|
|
166
168
|
if not self.transfer_poid:
|
|
167
|
-
self.transfer_poid = ",".join(
|
|
169
|
+
self.transfer_poid = ",".join(
|
|
170
|
+
(Hexa32.toString32(conf.PCODE),
|
|
171
|
+
Hexa32.toString32(HashUtil.hashFromString(conf.OKIND) if isinstance(conf.OKIND, str) else conf.OKIND),
|
|
172
|
+
Hexa32.toString32(int(conf.OID))))
|
|
168
173
|
|
|
169
174
|
return self.transfer_poid
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|