whatap-python 1.7.3__tar.gz → 1.7.5__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.

Potentially problematic release.


This version of whatap-python might be problematic. Click here for more details.

Files changed (129) hide show
  1. {whatap_python-1.7.3 → whatap_python-1.7.5}/PKG-INFO +8 -2
  2. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/__init__.py +26 -1
  3. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/agent/linux/amd64/whatap_python +0 -0
  4. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/agent/linux/arm64/whatap_python +0 -0
  5. whatap_python-1.7.5/whatap/build.py +4 -0
  6. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/amqp_pika.py +21 -12
  7. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/application_wsgi.py +31 -16
  8. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/database_mongo.py +1 -1
  9. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/database_redis.py +38 -19
  10. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/database_toolkit.py +1 -1
  11. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap_python.egg-info/PKG-INFO +8 -2
  12. whatap_python-1.7.3/whatap/build.py +0 -4
  13. {whatap_python-1.7.3 → whatap_python-1.7.5}/README.md +0 -0
  14. {whatap_python-1.7.3 → whatap_python-1.7.5}/setup.cfg +0 -0
  15. {whatap_python-1.7.3 → whatap_python-1.7.5}/setup.py +0 -0
  16. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/LICENSE +0 -0
  17. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/README.rst +0 -0
  18. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/__main__.py +0 -0
  19. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/agent/darwin/amd64/whatap_python +0 -0
  20. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/agent/darwin/arm64/whatap_python +0 -0
  21. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/bootstrap/__init__.py +0 -0
  22. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/bootstrap/sitecustomize.py +0 -0
  23. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/conf/__init__.py +0 -0
  24. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/conf/configuration.py +0 -0
  25. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/conf/configure.py +0 -0
  26. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/conf/license.py +0 -0
  27. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/control/__init__.py +0 -0
  28. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/counter/__init__.py +0 -0
  29. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/counter/counter_manager.py +0 -0
  30. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/counter/tasks/__init__.py +0 -0
  31. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/counter/tasks/openfiledescriptor.py +0 -0
  32. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/io/__init__.py +0 -0
  33. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/io/data_inputx.py +0 -0
  34. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/io/data_outputx.py +0 -0
  35. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/net/__init__.py +0 -0
  36. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/net/async_sender.py +0 -0
  37. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/net/packet_enum.py +0 -0
  38. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/net/packet_type_enum.py +0 -0
  39. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/net/param_def.py +0 -0
  40. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/net/stackhelper.py +0 -0
  41. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/net/udp_session.py +0 -0
  42. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/net/udp_thread.py +0 -0
  43. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/pack/__init__.py +0 -0
  44. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/pack/logSinkPack.py +0 -0
  45. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/pack/pack.py +0 -0
  46. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/pack/pack_enum.py +0 -0
  47. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/pack/tagCountPack.py +0 -0
  48. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/scripts/__init__.py +0 -0
  49. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/__init__.py +0 -0
  50. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/__init__.py +0 -0
  51. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/amqp_kombu.py +0 -0
  52. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/application_bottle.py +0 -0
  53. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/application_celery.py +0 -0
  54. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/application_cherrypy.py +0 -0
  55. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/application_django.py +0 -0
  56. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/application_django_asgi.py +0 -0
  57. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/application_django_py3.py +0 -0
  58. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/application_fastapi.py +0 -0
  59. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/application_flask.py +0 -0
  60. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/application_frappe.py +0 -0
  61. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/application_graphql.py +0 -0
  62. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/application_nameko.py +0 -0
  63. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/application_tornado.py +0 -0
  64. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/database_cxoracle.py +0 -0
  65. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/database_mysql.py +0 -0
  66. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/database_postgresql.py +0 -0
  67. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/email_smtp.py +0 -0
  68. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/httpc_django.py +0 -0
  69. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/httpc_httplib.py +0 -0
  70. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/httpc_requests.py +0 -0
  71. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/httpc_urllib3.py +0 -0
  72. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/logging.py +0 -0
  73. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/mod/plugin.py +0 -0
  74. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/simple_trace_context.py +0 -0
  75. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/trace_context.py +0 -0
  76. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/trace_context_manager.py +0 -0
  77. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/trace_import.py +0 -0
  78. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/trace/trace_module_definition.py +0 -0
  79. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/util/__init__.py +0 -0
  80. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/util/bit_util.py +0 -0
  81. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/util/cardinality/__init__.py +0 -0
  82. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/util/cardinality/hyperloglog.py +0 -0
  83. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/util/cardinality/murmurhash.py +0 -0
  84. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/util/cardinality/registerset.py +0 -0
  85. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/util/compare_util.py +0 -0
  86. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/util/date_util.py +0 -0
  87. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/util/debug_util.py +0 -0
  88. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/util/escape_literal_sql.py +0 -0
  89. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/util/hash_util.py +0 -0
  90. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/util/hexa32.py +0 -0
  91. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/util/int_set.py +0 -0
  92. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/util/ip_util.py +0 -0
  93. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/util/keygen.py +0 -0
  94. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/util/linked_list.py +0 -0
  95. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/util/linked_map.py +0 -0
  96. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/util/metering_util.py +0 -0
  97. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/util/request_double_queue.py +0 -0
  98. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/util/request_queue.py +0 -0
  99. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/util/string_util.py +0 -0
  100. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/util/throttle_util.py +0 -0
  101. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/util/userid_util.py +0 -0
  102. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/value/__init__.py +0 -0
  103. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/value/blob_value.py +0 -0
  104. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/value/boolean_value.py +0 -0
  105. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/value/decimal_value.py +0 -0
  106. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/value/double_summary.py +0 -0
  107. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/value/double_value.py +0 -0
  108. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/value/float_array.py +0 -0
  109. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/value/float_value.py +0 -0
  110. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/value/int_array.py +0 -0
  111. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/value/ip4_value.py +0 -0
  112. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/value/list_value.py +0 -0
  113. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/value/long_array.py +0 -0
  114. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/value/long_summary.py +0 -0
  115. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/value/map_value.py +0 -0
  116. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/value/null_value.py +0 -0
  117. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/value/number_value.py +0 -0
  118. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/value/summary_value.py +0 -0
  119. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/value/text_array.py +0 -0
  120. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/value/text_hash_value.py +0 -0
  121. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/value/text_value.py +0 -0
  122. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/value/value.py +0 -0
  123. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/value/value_enum.py +0 -0
  124. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap/whatap.conf +0 -0
  125. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap_python.egg-info/SOURCES.txt +0 -0
  126. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap_python.egg-info/dependency_links.txt +0 -0
  127. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap_python.egg-info/entry_points.txt +0 -0
  128. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap_python.egg-info/not-zip-safe +0 -0
  129. {whatap_python-1.7.3 → whatap_python-1.7.5}/whatap_python.egg-info/top_level.txt +0 -0
@@ -1,11 +1,17 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: whatap-python
3
- Version: 1.7.3
3
+ Version: 1.7.5
4
4
  Summary: Monitoring and Profiling Service
5
5
  Home-page: https://www.whatap.io
6
6
  Author: whatap
7
7
  Author-email: admin@whatap.io
8
8
  License: Whatap License
9
+ Dynamic: author
10
+ Dynamic: author-email
11
+ Dynamic: description
12
+ Dynamic: home-page
13
+ Dynamic: license
14
+ Dynamic: summary
9
15
 
10
16
 
11
17
  .. image:: https://www.whatap.io/img/common/whatap_logo_re.svg
@@ -145,6 +145,8 @@ def write_file(home, file_name, value):
145
145
 
146
146
  def check_whatap_home(target='WHATAP_HOME'):
147
147
  whatap_home = os.environ.get(target)
148
+ if not whatap_home:
149
+ whatap_home = find_whatap_conf()
148
150
  if not whatap_home:
149
151
  whatap_print('WHATAP: ${} is empty'.format(target))
150
152
 
@@ -153,6 +155,8 @@ def check_whatap_home(target='WHATAP_HOME'):
153
155
 
154
156
  def init_config(home):
155
157
  whatap_home = os.environ.get(home)
158
+ if not whatap_home:
159
+ whatap_home = find_whatap_conf()
156
160
  if not whatap_home:
157
161
  whatap_home = read_file(home, home.lower())
158
162
  if not whatap_home:
@@ -555,4 +559,25 @@ def configPort():
555
559
  port = get_port_number()
556
560
  if port:
557
561
  update_config('WHATAP_HOME', 'net_udp_port', str(port))
558
- return port
562
+ return port
563
+
564
+
565
+ def find_whatap_conf():
566
+ # 1. 현재 디렉토리 검색
567
+ script_dir = os.path.dirname(os.path.abspath(__file__))
568
+ parent_dir = os.path.dirname(script_dir)
569
+ conf_path = os.path.join(parent_dir, 'whatap.conf')
570
+ if os.path.exists(conf_path):
571
+ os.environ['WHATAP_HOME'] = parent_dir
572
+ return conf_path
573
+
574
+ # 2. 상위 디렉토리들 검색
575
+ current = parent_dir
576
+ while current != '/':
577
+ conf_path = os.path.join(current, 'whatap.conf')
578
+ if os.path.exists(conf_path):
579
+ os.environ['WHATAP_HOME'] = current
580
+ return conf_path
581
+ current = os.path.dirname(current)
582
+
583
+ return None
@@ -0,0 +1,4 @@
1
+ app = 'Python'
2
+ name = 'whatap-python'
3
+ version = '1.7.5'
4
+ release_date = '20250217'
@@ -7,8 +7,8 @@ import whatap.net.async_sender as async_sender
7
7
  from whatap.net.packet_type_enum import PacketTypeEnum
8
8
  from whatap.util.date_util import DateUtil
9
9
 
10
- def parseConnection(conn):
11
10
 
11
+ def parseConnection(conn):
12
12
  connstr = ''
13
13
  if conn.host:
14
14
  connstr += conn.host
@@ -16,6 +16,7 @@ def parseConnection(conn):
16
16
  connstr += "/" + conn.virtual_host
17
17
  return connstr
18
18
 
19
+
19
20
  def intercept_publish(fn, *args, **kwargs):
20
21
  ctx = TraceContextManager.getLocalContext()
21
22
 
@@ -30,22 +31,30 @@ def intercept_publish(fn, *args, **kwargs):
30
31
  ctx.active_dbc = text
31
32
  ctx.lctx['dbc'] = text
32
33
 
33
- ctx.active_dbc = 0
34
- ctx.db_opening = True
35
- ctx.elapsed = DateUtil.nowSystem() - start_time
36
- datas = [' ', ' ', 'MQ SESSION INFO: ' + text]
37
- async_sender.send_packet(PacketTypeEnum.TX_MSG, ctx, datas)
34
+ try:
35
+ result = fn(*args, **kwargs)
36
+
37
+ ctx.active_dbc = 0
38
+ ctx.db_opening = True
39
+ ctx.elapsed = DateUtil.nowSystem() - start_time
40
+ datas = [' ', ' ', 'MQ SESSION INFO: ' + text]
41
+ async_sender.send_packet(PacketTypeEnum.TX_MSG, ctx, datas)
42
+
43
+ return result
44
+ except Exception as e:
45
+ ctx.active_dbc = 0
46
+ ctx.db_opening = False
47
+ ctx.elapsed = DateUtil.nowSystem() - start_time
48
+ raise e
49
+
38
50
 
39
51
  def instrument_pika(module):
40
52
  def wrapper(fn):
41
53
  @trace_handler(fn)
42
54
  def trace(*args, **kwargs):
43
- callback = intercept_publish(fn, *args, **kwargs)
44
- return callback
45
-
55
+ return intercept_publish(fn, *args, **kwargs)
56
+
46
57
  return trace
47
58
 
48
59
  if hasattr(module, 'Channel') and hasattr(module.Channel, 'basic_publish'):
49
- module.Channel.basic_publish = wrapper(module.Channel.basic_publish)
50
-
51
-
60
+ module.Channel.basic_publish = wrapper(module.Channel.basic_publish)
@@ -65,9 +65,7 @@ def trace_handler(fn, start=False, preload=None):
65
65
  if ctx and ctx.error_step == e:
66
66
  ctx.error_step = None
67
67
  raise e
68
- logging.debug(e, extra={'id': 'WA917'}, exc_info=True)
69
- print(e, dict(extra={'id': 'WA917'}, exc_info=True))
70
- return fn(*args, **kwargs)
68
+ raise
71
69
  else:
72
70
  if ctx and ctx.error_step:
73
71
  e = ctx.error_step
@@ -157,8 +155,6 @@ def interceptor(rn_environ, *args, **kwargs):
157
155
  ctx.userAgentString = environ.get('HTTP_USER_AGENT', '')
158
156
  ctx.referer = environ.get('HTTP_REFERER', '')
159
157
 
160
-
161
-
162
158
  if conf.trace_user_enabled:
163
159
  if conf.trace_user_using_ip:
164
160
  ctx.userid = userid_util.getRemoteAddr(args)
@@ -223,7 +219,7 @@ def interceptor(rn_environ, *args, **kwargs):
223
219
  text = ''
224
220
  for key in keys:
225
221
  text += '{}={}\n'.format(key.split('HTTP_')[1].lower(),
226
- environ[key])
222
+ environ[key])
227
223
 
228
224
  datas = ['HTTP-HEADERS', 'HTTP-HEADERS', text]
229
225
  ctx.start_time = DateUtil.nowSystem()
@@ -232,7 +228,8 @@ def interceptor(rn_environ, *args, **kwargs):
232
228
  finally:
233
229
  end_interceptor(ctx=ctx)
234
230
 
235
- def interceptor_error(status_code, errors, ctx = None):
231
+
232
+ def interceptor_error(status_code, errors, ctx=None):
236
233
  if not ctx:
237
234
  ctx = TraceContextManager.getLocalContext()
238
235
  if not ctx:
@@ -274,10 +271,8 @@ def interceptor_step_error(e, ctx=None):
274
271
  errors = []
275
272
  errors.append(e.__class__.__name__)
276
273
 
277
- if e.args:
278
- errors.append(str(e.args[0]))
279
- elif hasattr(e, "detail"):
280
- errors.append(getattr(e, "detail"))
274
+ error_message = extract_db_error_message(e)
275
+ errors.append(error_message)
281
276
 
282
277
  error = ''
283
278
  frame = sys._current_frames().get(ctx.thread.ident)
@@ -294,7 +289,6 @@ def interceptor_step_error(e, ctx=None):
294
289
  error += '{} ({}:{})\n'.format(method_name, line, line_num)
295
290
 
296
291
  errors.append(error)
297
- # errors.append(''.join(traceback.format_list(traceback.extract_stack(sys._current_frames()[ctx.thread.ident]))))
298
292
  async_sender.send_packet(PacketTypeEnum.TX_ERROR, ctx, errors)
299
293
 
300
294
  if conf.profile_exception_stack:
@@ -304,6 +298,27 @@ def interceptor_step_error(e, ctx=None):
304
298
  async_sender.send_packet(PacketTypeEnum.TX_MSG, ctx, datas)
305
299
 
306
300
 
301
+ def extract_db_error_message(e):
302
+ try:
303
+ # PostgreSQL (psycopg2)
304
+ if hasattr(e, 'pgcode') and hasattr(e, 'pgerror'):
305
+ return str(e.pgerror)
306
+
307
+ # MySQL (PyMySQL, mysql-connector-python)
308
+ if hasattr(e, 'args') and len(e.args) > 1 and isinstance(e.args[1], str):
309
+ return e.args[1]
310
+
311
+ # 기본 에러 메시지
312
+ if hasattr(e, 'args') and len(e.args) > 0:
313
+ if isinstance(e.args[0], str):
314
+ return e.args[0]
315
+ return str(e.args[0])
316
+
317
+ return str(e)
318
+ except:
319
+ return "Unknown database error"
320
+
321
+
307
322
  def interceptor_httpc_request(fn, httpc_url, *args, **kwargs):
308
323
  ctx = TraceContextManager.getLocalContext()
309
324
  if not ctx or ctx.active_httpc_hash:
@@ -311,7 +326,7 @@ def interceptor_httpc_request(fn, httpc_url, *args, **kwargs):
311
326
  return fn(*args, **kwargs)
312
327
  except Exception as e:
313
328
  interceptor_step_error(e, ctx=ctx)
314
- finally:
329
+ finally:
315
330
  return
316
331
  param = None
317
332
  method = None
@@ -387,7 +402,7 @@ def interceptor_db_con(fn, db_type, *args, **kwargs):
387
402
  text = '{}://'.format(db_type)
388
403
  text += kwargs.get('user')
389
404
  text += "@"
390
- text += kwargs.get('host',kwargs.get('dsn','') )
405
+ text += kwargs.get('host', kwargs.get('dsn', ''))
391
406
  text += '/'
392
407
  text += kwargs.get('database', kwargs.get('db', kwargs.get('dbname', '')))
393
408
  ctx.active_dbc = text
@@ -485,7 +500,7 @@ def interceptor_db_close(fn, *args, **kwargs):
485
500
  return
486
501
  start_time = DateUtil.nowSystem()
487
502
  ctx.start_time = start_time
488
-
503
+
489
504
  try:
490
505
  callback = fn(*args, **kwargs)
491
506
  return callback
@@ -496,7 +511,7 @@ def interceptor_db_close(fn, *args, **kwargs):
496
511
  datas = [' ', ' ', text]
497
512
  ctx.elapsed = DateUtil.nowSystem() - start_time
498
513
  async_sender.send_packet(PacketTypeEnum.TX_MSG, ctx, datas)
499
-
514
+
500
515
 
501
516
  check_seq = 1
502
517
 
@@ -70,7 +70,7 @@ class WhatapMongoCmdEventListener(pymongo.monitoring.CommandListener):
70
70
  query +=' query: {}'.format(ctx.active_sqlhash)
71
71
 
72
72
  ctx.db_opening = False
73
- datas = [ctx.lctx.get('dbc', ''), query]
73
+ datas = [ctx.lctx.get('dbc', ''), query, 0]
74
74
  ctx.elapsed = int(event.duration_micros / 1000)
75
75
  async_sender.send_packet(PacketTypeEnum.TX_SQL, ctx,
76
76
  datas)
@@ -1,23 +1,32 @@
1
1
  from whatap.trace import get_dict
2
- from whatap.trace.mod.application_wsgi import trace_handler, \
3
- interceptor_step_error
2
+ from whatap.trace.mod.application_wsgi import trace_handler, interceptor_step_error
4
3
  from whatap.trace.trace_context_manager import TraceContextManager
5
4
  import whatap.net.async_sender as async_sender
6
5
  from whatap.net.packet_type_enum import PacketTypeEnum
7
6
  from whatap.util.date_util import DateUtil
8
7
  import numbers
9
8
 
9
+ _current_command = None
10
+
11
+
10
12
  def intercept_send_command(fn, instance, *args, **kwargs):
13
+ global _current_command
14
+ command = str(args[0]).upper() if args else None
15
+ _current_command = command
16
+
17
+ if command not in {'SET', 'GET', 'DEL', 'HSET', 'HGET'}:
18
+ return fn(instance, *args, **kwargs)
19
+
11
20
  ctx = TraceContextManager.getLocalContext()
12
21
  if not ctx:
13
-
14
22
  return fn(instance, *args, **kwargs)
23
+
15
24
  start_time = DateUtil.nowSystem()
16
25
  ctx.start_time = start_time
17
26
 
18
27
  port_or_path = getattr(instance, 'port', getattr(instance, 'path', None))
19
28
  text = 'redis://'
20
- text += getattr(instance, 'host','localhost')
29
+ text += getattr(instance, 'host', 'localhost')
21
30
  text += ':{}'.format(port_or_path)
22
31
  text += '/'
23
32
  text += str(getattr(instance, 'db', 0))
@@ -29,8 +38,8 @@ def intercept_send_command(fn, instance, *args, **kwargs):
29
38
  datas = [text]
30
39
  ctx.elapsed = DateUtil.nowSystem() - start_time
31
40
  async_sender.send_packet(PacketTypeEnum.TX_DB_CONN, ctx, datas)
32
- query = " ".join([ str(arg)[:20] for arg in args])
33
-
41
+ query = f"{command} " + " ".join([str(arg)[:20] for arg in args[1:]])
42
+
34
43
  start_time = DateUtil.nowSystem()
35
44
  ctx.start_time = start_time
36
45
  ctx.active_sqlhash = query
@@ -42,26 +51,29 @@ def intercept_send_command(fn, instance, *args, **kwargs):
42
51
  interceptor_step_error(e)
43
52
  finally:
44
53
  ctx.db_opening = False
45
- datas = [ctx.lctx.get('dbc', ''), query]
54
+ datas = [ctx.lctx.get('dbc', ''), query, 0]
46
55
  ctx.elapsed = DateUtil.nowSystem() - start_time
47
- async_sender.send_packet(PacketTypeEnum.TX_SQL, ctx,
48
- datas)
56
+ async_sender.send_packet(PacketTypeEnum.TX_SQL, ctx, datas)
49
57
 
50
58
 
51
59
  def interceptor_read_response(fn, *args, **kwargs):
60
+ global _current_command
61
+
62
+ if _current_command not in {'SET', 'GET', 'DEL', 'HSET', 'HGET'}:
63
+ _current_command = None
64
+ return fn(*args, **kwargs)
65
+
52
66
  ctx = TraceContextManager.getLocalContext()
53
67
  if not ctx:
68
+ _current_command = None
54
69
  return fn(*args, **kwargs)
70
+
55
71
  start_time = DateUtil.nowSystem()
56
72
  ctx.start_time = start_time
57
73
 
58
- callback = None
59
74
  try:
60
75
  callback = fn(*args, **kwargs)
61
- return callback
62
- except Exception as e:
63
- interceptor_step_error(e)
64
- finally:
76
+
65
77
  if callback:
66
78
  count = -1
67
79
  if isinstance(callback, int):
@@ -71,11 +83,15 @@ def interceptor_read_response(fn, *args, **kwargs):
71
83
 
72
84
  if count > -1:
73
85
  msg = '{0}: {1}'.format('Fetch bytes', count)
74
- datas = [ msg,' ', ' ']
86
+ datas = [msg, ' ', ' ']
75
87
  ctx.elapsed = 0
76
88
  async_sender.send_packet(PacketTypeEnum.TX_MSG, ctx, datas)
77
89
 
78
90
  ctx.active_sqlhash = 0
91
+ return callback
92
+ finally:
93
+ _current_command = None
94
+
79
95
 
80
96
  def instrument_redis_connection(module):
81
97
  def wrapper(fn):
@@ -83,11 +99,13 @@ def instrument_redis_connection(module):
83
99
  def trace(*args, **kwargs):
84
100
  callback = intercept_send_command(fn, args[0], *args[1:], **kwargs)
85
101
  return callback
86
-
102
+
87
103
  return trace
88
104
 
89
105
  if hasattr(module, 'Connection') and hasattr(module.Connection, 'send_command'):
90
- module.Connection.send_command = wrapper(module.Connection.send_command)
106
+ if not getattr(module.Connection.send_command, '_wrapped', False):
107
+ module.Connection.send_command = wrapper(module.Connection.send_command)
108
+ module.Connection.send_command._wrapped = True
91
109
 
92
110
  def wrapper(fn):
93
111
  @trace_handler(fn)
@@ -98,5 +116,6 @@ def instrument_redis_connection(module):
98
116
  return trace
99
117
 
100
118
  if hasattr(module, 'Connection') and hasattr(module.Connection, 'read_response'):
101
- module.Connection.read_response= wrapper(module.Connection.read_response)
102
-
119
+ if not getattr(module.Connection.read_response, '_wrapped', False):
120
+ module.Connection.read_response = wrapper(module.Connection.read_response)
121
+ module.Connection.read_response._wrapped = True
@@ -85,7 +85,7 @@ def instrument_sqlalchemy_engine(module):
85
85
  # print('instrument_sqlalchemy_engine 6')
86
86
  ctx = TraceContextManager.getLocalContext()
87
87
  if ctx:
88
- datas = [ctx.lctx.get('dbc', ''), query]
88
+ datas = [ctx.lctx.get('dbc', ''), query, 0]
89
89
  ctx.elapsed = DateUtil.nowSystem() - start_time
90
90
  # print('instrument_sqlalchemy_engine 6.1', datas)
91
91
  async_sender.send_packet(PacketTypeEnum.TX_SQL, ctx,
@@ -1,11 +1,17 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: whatap-python
3
- Version: 1.7.3
3
+ Version: 1.7.5
4
4
  Summary: Monitoring and Profiling Service
5
5
  Home-page: https://www.whatap.io
6
6
  Author: whatap
7
7
  Author-email: admin@whatap.io
8
8
  License: Whatap License
9
+ Dynamic: author
10
+ Dynamic: author-email
11
+ Dynamic: description
12
+ Dynamic: home-page
13
+ Dynamic: license
14
+ Dynamic: summary
9
15
 
10
16
 
11
17
  .. image:: https://www.whatap.io/img/common/whatap_logo_re.svg
@@ -1,4 +0,0 @@
1
- app = 'Python'
2
- name = 'whatap-python'
3
- version = '1.7.3'
4
- release_date = '20241219'
File without changes
File without changes
File without changes