whatap-python 1.7.6__tar.gz → 1.7.8__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.6 → whatap_python-1.7.8}/PKG-INFO +1 -1
  2. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/__init__.py +34 -0
  3. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/agent/darwin/amd64/whatap_python +0 -0
  4. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/agent/darwin/arm64/whatap_python +0 -0
  5. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/agent/linux/amd64/whatap_python +0 -0
  6. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/agent/linux/arm64/whatap_python +0 -0
  7. whatap_python-1.7.8/whatap/build.py +4 -0
  8. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/conf/configuration.py +1 -0
  9. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/net/packet_enum.py +1 -1
  10. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/application_wsgi.py +32 -10
  11. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/database_cxoracle.py +26 -6
  12. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/database_mysql.py +25 -19
  13. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/database_postgresql.py +12 -9
  14. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/database_toolkit.py +13 -3
  15. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/trace_context.py +4 -1
  16. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap_python.egg-info/PKG-INFO +1 -1
  17. whatap_python-1.7.6/whatap/build.py +0 -4
  18. {whatap_python-1.7.6 → whatap_python-1.7.8}/README.md +0 -0
  19. {whatap_python-1.7.6 → whatap_python-1.7.8}/setup.cfg +0 -0
  20. {whatap_python-1.7.6 → whatap_python-1.7.8}/setup.py +0 -0
  21. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/LICENSE +0 -0
  22. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/README.rst +0 -0
  23. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/__main__.py +0 -0
  24. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/bootstrap/__init__.py +0 -0
  25. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/bootstrap/sitecustomize.py +0 -0
  26. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/conf/__init__.py +0 -0
  27. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/conf/configure.py +0 -0
  28. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/conf/license.py +0 -0
  29. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/control/__init__.py +0 -0
  30. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/counter/__init__.py +0 -0
  31. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/counter/counter_manager.py +0 -0
  32. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/counter/tasks/__init__.py +0 -0
  33. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/counter/tasks/openfiledescriptor.py +0 -0
  34. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/io/__init__.py +0 -0
  35. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/io/data_inputx.py +0 -0
  36. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/io/data_outputx.py +0 -0
  37. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/net/__init__.py +0 -0
  38. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/net/async_sender.py +0 -0
  39. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/net/packet_type_enum.py +0 -0
  40. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/net/param_def.py +0 -0
  41. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/net/stackhelper.py +0 -0
  42. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/net/udp_session.py +0 -0
  43. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/net/udp_thread.py +0 -0
  44. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/pack/__init__.py +0 -0
  45. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/pack/logSinkPack.py +0 -0
  46. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/pack/pack.py +0 -0
  47. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/pack/pack_enum.py +0 -0
  48. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/pack/tagCountPack.py +0 -0
  49. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/scripts/__init__.py +0 -0
  50. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/__init__.py +0 -0
  51. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/__init__.py +0 -0
  52. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/amqp_kombu.py +0 -0
  53. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/amqp_pika.py +0 -0
  54. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/application_bottle.py +0 -0
  55. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/application_celery.py +0 -0
  56. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/application_cherrypy.py +0 -0
  57. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/application_django.py +0 -0
  58. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/application_django_asgi.py +0 -0
  59. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/application_django_py3.py +0 -0
  60. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/application_fastapi.py +0 -0
  61. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/application_flask.py +0 -0
  62. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/application_frappe.py +0 -0
  63. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/application_graphql.py +0 -0
  64. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/application_nameko.py +0 -0
  65. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/application_tornado.py +0 -0
  66. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/database_mongo.py +0 -0
  67. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/database_redis.py +0 -0
  68. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/email_smtp.py +0 -0
  69. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/httpc_django.py +0 -0
  70. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/httpc_httplib.py +0 -0
  71. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/httpc_requests.py +0 -0
  72. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/httpc_urllib3.py +0 -0
  73. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/logging.py +0 -0
  74. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/mod/plugin.py +0 -0
  75. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/simple_trace_context.py +0 -0
  76. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/trace_context_manager.py +0 -0
  77. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/trace_import.py +0 -0
  78. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/trace/trace_module_definition.py +0 -0
  79. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/util/__init__.py +0 -0
  80. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/util/bit_util.py +0 -0
  81. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/util/cardinality/__init__.py +0 -0
  82. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/util/cardinality/hyperloglog.py +0 -0
  83. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/util/cardinality/murmurhash.py +0 -0
  84. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/util/cardinality/registerset.py +0 -0
  85. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/util/compare_util.py +0 -0
  86. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/util/date_util.py +0 -0
  87. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/util/debug_util.py +0 -0
  88. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/util/escape_literal_sql.py +0 -0
  89. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/util/hash_util.py +0 -0
  90. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/util/hexa32.py +0 -0
  91. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/util/int_set.py +0 -0
  92. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/util/ip_util.py +0 -0
  93. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/util/keygen.py +0 -0
  94. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/util/linked_list.py +0 -0
  95. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/util/linked_map.py +0 -0
  96. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/util/metering_util.py +0 -0
  97. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/util/request_double_queue.py +0 -0
  98. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/util/request_queue.py +0 -0
  99. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/util/string_util.py +0 -0
  100. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/util/throttle_util.py +0 -0
  101. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/util/userid_util.py +0 -0
  102. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/value/__init__.py +0 -0
  103. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/value/blob_value.py +0 -0
  104. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/value/boolean_value.py +0 -0
  105. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/value/decimal_value.py +0 -0
  106. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/value/double_summary.py +0 -0
  107. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/value/double_value.py +0 -0
  108. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/value/float_array.py +0 -0
  109. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/value/float_value.py +0 -0
  110. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/value/int_array.py +0 -0
  111. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/value/ip4_value.py +0 -0
  112. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/value/list_value.py +0 -0
  113. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/value/long_array.py +0 -0
  114. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/value/long_summary.py +0 -0
  115. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/value/map_value.py +0 -0
  116. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/value/null_value.py +0 -0
  117. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/value/number_value.py +0 -0
  118. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/value/summary_value.py +0 -0
  119. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/value/text_array.py +0 -0
  120. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/value/text_hash_value.py +0 -0
  121. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/value/text_value.py +0 -0
  122. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/value/value.py +0 -0
  123. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/value/value_enum.py +0 -0
  124. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap/whatap.conf +0 -0
  125. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap_python.egg-info/SOURCES.txt +0 -0
  126. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap_python.egg-info/dependency_links.txt +0 -0
  127. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap_python.egg-info/entry_points.txt +0 -0
  128. {whatap_python-1.7.6 → whatap_python-1.7.8}/whatap_python.egg-info/not-zip-safe +0 -0
  129. {whatap_python-1.7.6 → whatap_python-1.7.8}/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.6
3
+ Version: 1.7.8
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.8'
4
+ release_date = '20250324'
@@ -1,5 +1,6 @@
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,
@@ -5,7 +5,7 @@ class PacketEnum(object):
5
5
 
6
6
  SERVER = "127.0.0.1"
7
7
  PORT = 6600
8
- PACKET_VERSION = 20102
8
+ PACKET_VERSION = 20104
9
9
 
10
10
  # PACKET_HEADER
11
11
  PACKET_HEADER_TYPE_POS = 0
@@ -96,7 +96,8 @@ def start_interceptor(ctx):
96
96
  ctx.userAgentString,
97
97
  ctx.referer,
98
98
  ctx.userid,
99
- ctx.isStaticContents
99
+ ctx.isStaticContents,
100
+ ctx.http_method
100
101
  ]
101
102
  # print("start_interceptor txid:", ctx.id)
102
103
  async_sender.send_packet(PacketTypeEnum.TX_START, ctx, datas)
@@ -121,7 +122,7 @@ def end_interceptor(thread_id=None, ctx=None):
121
122
  ctx.start_time = start_time
122
123
 
123
124
  datas = [ctx.host, ctx.service_name, ctx.mtid, ctx.mdepth, ctx.mcaller_txid,
124
- ctx.mcaller_pcode, ctx.mcaller_spec, str(ctx.mcaller_url_hash), ctx.mcaller_poid]
125
+ ctx.mcaller_pcode, ctx.mcaller_spec, str(ctx.mcaller_url_hash), ctx.mcaller_poid,ctx.status]
125
126
  ctx.elapsed = DateUtil.nowSystem() - start_time
126
127
 
127
128
  async_sender.send_packet(PacketTypeEnum.TX_END, ctx, datas)
@@ -149,7 +150,7 @@ def interceptor(rn_environ, *args, **kwargs):
149
150
  ctx = TraceContext()
150
151
  ctx.host = environ.get('HTTP_HOST', '').split(':')[0]
151
152
  ctx.service_name = parseServiceName(environ)
152
-
153
+ ctx.http_method = environ.get('REQUEST_METHOD', '')
153
154
  ctx.remoteIp = userid_util.getRemoteAddr(args)
154
155
 
155
156
  ctx.userAgentString = environ.get('HTTP_USER_AGENT', '')
@@ -206,8 +207,10 @@ def interceptor(rn_environ, *args, **kwargs):
206
207
 
207
208
  if getattr(callback, 'status_code', None):
208
209
  status_code = callback.status_code
209
- errors = [callback.__class__.__name__, callback.reason_phrase]
210
- interceptor_error(status_code, errors, ctx=ctx)
210
+
211
+ if (status_code >= 400):
212
+ errors = [callback.__class__.__name__, callback.reason_phrase]
213
+ interceptor_error(status_code, errors, ctx=ctx)
211
214
 
212
215
  if conf.profile_http_header_enabled:
213
216
  keys = []
@@ -234,8 +237,8 @@ def interceptor_error(status_code, errors, ctx=None):
234
237
  ctx = TraceContextManager.getLocalContext()
235
238
  if not ctx:
236
239
  return
237
- ctx.status = int(status_code / 100)
238
- if ctx.status >= 4 and not ctx.error:
240
+ ctx.status = status_code
241
+ if status_code >= 400 and not ctx.error:
239
242
  ctx.error = 1
240
243
 
241
244
  error = ''
@@ -382,7 +385,7 @@ def interceptor_sock_connect(fn, *args, **kwargs):
382
385
  ctx.socket_connecting = False
383
386
 
384
387
 
385
- def interceptor_db_con(fn, db_type, *args, **kwargs):
388
+ def interceptor_db_con(fn, db_info, *args, **kwargs):
386
389
  ctx = TraceContextManager.getLocalContext()
387
390
  if not ctx:
388
391
  return fn(*args, **kwargs)
@@ -399,7 +402,8 @@ def interceptor_db_con(fn, db_type, *args, **kwargs):
399
402
  if not kwargs:
400
403
  kwargs = dict(
401
404
  x.split('=') for x in re.sub(r'\s*=\s*', '=', args[0]).split())
402
- text = '{}://'.format(db_type)
405
+
406
+ text = '{}://'.format(db_info.get('type'))
403
407
  text += kwargs.get('user')
404
408
  text += "@"
405
409
  text += kwargs.get('host', kwargs.get('dsn', ''))
@@ -441,7 +445,7 @@ def addQuoteList(arg_list):
441
445
  return tuple(quoted_list)
442
446
 
443
447
 
444
- def interceptor_db_execute(fn, *args, **kwargs):
448
+ def interceptor_db_execute(fn, db_info, *args, **kwargs):
445
449
  ctx = TraceContextManager.getLocalContext()
446
450
  # sendDebugProfile(ctx, 'interceptor_db_execute step -1')
447
451
  self = args[0]
@@ -465,6 +469,24 @@ def interceptor_db_execute(fn, *args, **kwargs):
465
469
  if not query:
466
470
  return fn(*args, **kwargs)
467
471
 
472
+ start_time = DateUtil.nowSystem()
473
+ ctx.start_time = start_time
474
+
475
+ text = '{}://'.format(db_info.get('type'))
476
+ text += db_info.get('user')
477
+ text += "@"
478
+ text += db_info.get('host', db_info.get('dsn', ''))
479
+ text += '/'
480
+ text += db_info.get('database', db_info.get('db', db_info.get('dbname', '')))
481
+ ctx.active_dbc = text
482
+ ctx.lctx['dbc'] = text
483
+
484
+ ctx.active_dbc = 0
485
+
486
+ datas = [text]
487
+ ctx.elapsed = DateUtil.nowSystem() - start_time
488
+ async_sender.send_packet(PacketTypeEnum.TX_DB_CONN, ctx, datas)
489
+
468
490
  start_time = DateUtil.nowSystem()
469
491
  ctx.start_time = start_time
470
492
  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'}
15
+ db_info.update(kwargs)
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,31 @@ 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'}
13
+ db_info.update(kwargs)
14
+ callback = interceptor_db_con(fn, db_info, *args, **kwargs)
12
15
  return callback
13
-
16
+
14
17
  return trace
18
+
15
19
  if hasattr(module, "connect"):
16
20
  module.connect = wrapper(module.connect)
17
-
21
+
18
22
  def wrapper(fn):
19
23
  @trace_handler(fn)
20
24
  def trace(*args, **kwargs):
21
25
  callback = interceptor_db_close(fn, *args, **kwargs)
22
26
  return callback
23
-
27
+
24
28
  return trace
25
-
29
+
26
30
  if hasattr(module, "connection") and hasattr(module.connection, "close"):
27
31
  get_dict(module.connection)['close'] = wrapper(
28
32
  module.connection.close)
@@ -32,35 +36,37 @@ def instrument_MySQLdb_cursors(module):
32
36
  def wrapper(fn):
33
37
  @trace_handler(fn)
34
38
  def trace(*args, **kwargs):
35
- callback = interceptor_db_execute(fn, *args, **kwargs)
39
+ callback = interceptor_db_execute(fn, db_info, *args, **kwargs)
36
40
  return callback
37
-
41
+
38
42
  return trace
39
-
43
+
40
44
  module.BaseCursor.execute = wrapper(module.BaseCursor.execute)
41
- if hasattr(module.BaseCursor,'callproc'):
42
- module.BaseCursor.callproc= wrapper(module.BaseCursor.callproc)
45
+ if hasattr(module.BaseCursor, 'callproc'):
46
+ module.BaseCursor.callproc = wrapper(module.BaseCursor.callproc)
43
47
 
44
48
  def instrument_pymysql(module):
45
49
  def wrapper(fn):
46
50
  @trace_handler(fn)
47
51
  def trace(*args, **kwargs):
48
- db_type = 'mysql'
49
- callback = interceptor_db_con(fn, db_type, *args, **kwargs)
52
+ global db_info
53
+ db_info = {'type': 'mysql'}
54
+ db_info.update(kwargs)
55
+ callback = interceptor_db_con(fn, db_info, *args, **kwargs)
50
56
  return callback
51
-
57
+
52
58
  return trace
53
-
59
+
54
60
  module.connect = wrapper(module.connect)
55
-
61
+
56
62
  def wrapper(fn):
57
63
  @trace_handler(fn)
58
64
  def trace(*args, **kwargs):
59
65
  callback = interceptor_db_close(fn, *args, **kwargs)
60
66
  return callback
61
-
67
+
62
68
  return trace
63
-
69
+
64
70
  module.connections.Connection.close = wrapper(
65
71
  module.connections.Connection.close)
66
72
 
@@ -68,7 +74,7 @@ def instrument_pymysql_cursors(module):
68
74
  def wrapper(fn):
69
75
  @trace_handler(fn)
70
76
  def trace(*args, **kwargs):
71
- callback = interceptor_db_execute(fn, *args, **kwargs)
77
+ callback = interceptor_db_execute(fn, db_info, *args, **kwargs)
72
78
  return callback
73
79
 
74
80
  return trace
@@ -2,17 +2,20 @@ 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'}
13
+ db_info.update(kwargs)
14
+ callback = interceptor_db_con(fn, db_info, *args, **kwargs)
12
15
  return callback
13
-
16
+
14
17
  return trace
15
-
18
+
16
19
  module.connect = wrapper(module.connect)
17
20
 
18
21
 
@@ -22,9 +25,9 @@ def instrument_psycopg2_connection(module):
22
25
  def trace(*args, **kwargs):
23
26
  callback = interceptor_db_close(fn, *args, **kwargs)
24
27
  return callback
25
-
28
+
26
29
  return trace
27
-
30
+
28
31
  get_dict(module.connection)['close'] = wrapper(module.connection.close)
29
32
 
30
33
 
@@ -32,9 +35,9 @@ def instrument_psycopg2_extensions(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
  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:
@@ -5,6 +5,7 @@ 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
@@ -166,6 +167,8 @@ class TraceContext(object):
166
167
  def transferPOID(self):
167
168
  if not self.transfer_poid:
168
169
  self.transfer_poid = ",".join(
169
- (Hexa32.toString32(conf.PCODE), Hexa32.toString32(conf.OKIND), Hexa32.toString32(int(conf.OID))))
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))))
170
173
 
171
174
  return self.transfer_poid
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: whatap-python
3
- Version: 1.7.6
3
+ Version: 1.7.8
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.6'
4
- release_date = '20250304'
File without changes
File without changes
File without changes