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.
Files changed (129) hide show
  1. {whatap_python-1.7.5 → whatap_python-1.7.7}/PKG-INFO +1 -1
  2. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/__init__.py +34 -0
  3. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/agent/linux/amd64/whatap_python +0 -0
  4. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/agent/linux/arm64/whatap_python +0 -0
  5. whatap_python-1.7.7/whatap/build.py +4 -0
  6. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/conf/configuration.py +3 -0
  7. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/application_celery.py +20 -5
  8. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/application_wsgi.py +22 -3
  9. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/database_cxoracle.py +26 -6
  10. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/database_mysql.py +23 -19
  11. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/database_postgresql.py +11 -9
  12. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/database_toolkit.py +13 -3
  13. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/logging.py +37 -2
  14. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/trace_context.py +11 -6
  15. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap_python.egg-info/PKG-INFO +1 -1
  16. whatap_python-1.7.5/whatap/build.py +0 -4
  17. {whatap_python-1.7.5 → whatap_python-1.7.7}/README.md +0 -0
  18. {whatap_python-1.7.5 → whatap_python-1.7.7}/setup.cfg +0 -0
  19. {whatap_python-1.7.5 → whatap_python-1.7.7}/setup.py +0 -0
  20. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/LICENSE +0 -0
  21. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/README.rst +0 -0
  22. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/__main__.py +0 -0
  23. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/agent/darwin/amd64/whatap_python +0 -0
  24. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/agent/darwin/arm64/whatap_python +0 -0
  25. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/bootstrap/__init__.py +0 -0
  26. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/bootstrap/sitecustomize.py +0 -0
  27. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/conf/__init__.py +0 -0
  28. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/conf/configure.py +0 -0
  29. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/conf/license.py +0 -0
  30. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/control/__init__.py +0 -0
  31. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/counter/__init__.py +0 -0
  32. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/counter/counter_manager.py +0 -0
  33. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/counter/tasks/__init__.py +0 -0
  34. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/counter/tasks/openfiledescriptor.py +0 -0
  35. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/io/__init__.py +0 -0
  36. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/io/data_inputx.py +0 -0
  37. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/io/data_outputx.py +0 -0
  38. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/net/__init__.py +0 -0
  39. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/net/async_sender.py +0 -0
  40. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/net/packet_enum.py +0 -0
  41. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/net/packet_type_enum.py +0 -0
  42. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/net/param_def.py +0 -0
  43. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/net/stackhelper.py +0 -0
  44. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/net/udp_session.py +0 -0
  45. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/net/udp_thread.py +0 -0
  46. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/pack/__init__.py +0 -0
  47. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/pack/logSinkPack.py +0 -0
  48. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/pack/pack.py +0 -0
  49. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/pack/pack_enum.py +0 -0
  50. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/pack/tagCountPack.py +0 -0
  51. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/scripts/__init__.py +0 -0
  52. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/__init__.py +0 -0
  53. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/__init__.py +0 -0
  54. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/amqp_kombu.py +0 -0
  55. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/amqp_pika.py +0 -0
  56. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/application_bottle.py +0 -0
  57. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/application_cherrypy.py +0 -0
  58. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/application_django.py +0 -0
  59. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/application_django_asgi.py +0 -0
  60. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/application_django_py3.py +0 -0
  61. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/application_fastapi.py +0 -0
  62. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/application_flask.py +0 -0
  63. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/application_frappe.py +0 -0
  64. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/application_graphql.py +0 -0
  65. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/application_nameko.py +0 -0
  66. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/application_tornado.py +0 -0
  67. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/database_mongo.py +0 -0
  68. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/database_redis.py +0 -0
  69. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/email_smtp.py +0 -0
  70. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/httpc_django.py +0 -0
  71. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/httpc_httplib.py +0 -0
  72. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/httpc_requests.py +0 -0
  73. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/httpc_urllib3.py +0 -0
  74. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/mod/plugin.py +0 -0
  75. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/simple_trace_context.py +0 -0
  76. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/trace_context_manager.py +0 -0
  77. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/trace_import.py +0 -0
  78. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/trace/trace_module_definition.py +0 -0
  79. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/__init__.py +0 -0
  80. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/bit_util.py +0 -0
  81. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/cardinality/__init__.py +0 -0
  82. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/cardinality/hyperloglog.py +0 -0
  83. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/cardinality/murmurhash.py +0 -0
  84. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/cardinality/registerset.py +0 -0
  85. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/compare_util.py +0 -0
  86. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/date_util.py +0 -0
  87. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/debug_util.py +0 -0
  88. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/escape_literal_sql.py +0 -0
  89. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/hash_util.py +0 -0
  90. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/hexa32.py +0 -0
  91. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/int_set.py +0 -0
  92. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/ip_util.py +0 -0
  93. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/keygen.py +0 -0
  94. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/linked_list.py +0 -0
  95. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/linked_map.py +0 -0
  96. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/metering_util.py +0 -0
  97. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/request_double_queue.py +0 -0
  98. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/request_queue.py +0 -0
  99. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/string_util.py +0 -0
  100. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/throttle_util.py +0 -0
  101. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/util/userid_util.py +0 -0
  102. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/__init__.py +0 -0
  103. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/blob_value.py +0 -0
  104. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/boolean_value.py +0 -0
  105. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/decimal_value.py +0 -0
  106. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/double_summary.py +0 -0
  107. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/double_value.py +0 -0
  108. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/float_array.py +0 -0
  109. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/float_value.py +0 -0
  110. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/int_array.py +0 -0
  111. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/ip4_value.py +0 -0
  112. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/list_value.py +0 -0
  113. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/long_array.py +0 -0
  114. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/long_summary.py +0 -0
  115. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/map_value.py +0 -0
  116. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/null_value.py +0 -0
  117. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/number_value.py +0 -0
  118. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/summary_value.py +0 -0
  119. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/text_array.py +0 -0
  120. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/text_hash_value.py +0 -0
  121. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/text_value.py +0 -0
  122. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/value.py +0 -0
  123. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/value/value_enum.py +0 -0
  124. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap/whatap.conf +0 -0
  125. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap_python.egg-info/SOURCES.txt +0 -0
  126. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap_python.egg-info/dependency_links.txt +0 -0
  127. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap_python.egg-info/entry_points.txt +0 -0
  128. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap_python.egg-info/not-zip-safe +0 -0
  129. {whatap_python-1.7.5 → whatap_python-1.7.7}/whatap_python.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: whatap-python
3
- Version: 1.7.5
3
+ Version: 1.7.7
4
4
  Summary: Monitoring and Profiling Service
5
5
  Home-page: https://www.whatap.io
6
6
  Author: whatap
@@ -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)
@@ -0,0 +1,4 @@
1
+ app = 'Python'
2
+ name = 'whatap-python'
3
+ version = '1.7.7'
4
+ release_date = '20250311'
@@ -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
- if ctx and ctx.error_step:
34
- end_interceptor(ctx=ctx)
35
- raise Exception(ctx.error_step)
36
- callback = func(*args, **kwargs)
37
- return callback
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, db_type, *args, **kwargs):
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
- text = '{}://'.format(db_type)
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
- db_type = 'oracle'
10
- callback = interceptor_db_con(fn, db_type, *args, **kwargs)
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
- db_type = 'mysql'
11
- callback = interceptor_db_con(fn, db_type, *args, **kwargs)
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
- db_type = 'mysql'
49
- callback = interceptor_db_con(fn, db_type, *args, **kwargs)
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
- db_type = 'postgresql'
11
- callback = interceptor_db_con(fn, db_type, *args, **kwargs)
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 type(args[3]) == dict and args[3]:
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, replaced_value) if replaced_key in oracle_sql_query else None
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((Hexa32.toString32(conf.PCODE), Hexa32.toString32(conf.OKIND), Hexa32.toString32(int(conf.OID))))
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: whatap-python
3
- Version: 1.7.5
3
+ Version: 1.7.7
4
4
  Summary: Monitoring and Profiling Service
5
5
  Home-page: https://www.whatap.io
6
6
  Author: whatap
@@ -1,4 +0,0 @@
1
- app = 'Python'
2
- name = 'whatap-python'
3
- version = '1.7.5'
4
- release_date = '20250217'
File without changes
File without changes
File without changes