whatap-python 1.6.8__tar.gz → 1.6.10__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 (124) hide show
  1. {whatap_python-1.6.8 → whatap_python-1.6.10}/PKG-INFO +1 -1
  2. whatap_python-1.6.10/whatap/build.py +4 -0
  3. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/conf/configure.py +1 -1
  4. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/application_django.py +18 -2
  5. whatap_python-1.6.10/whatap/trace/mod/application_django_asgi.py +263 -0
  6. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/application_wsgi.py +1 -3
  7. whatap_python-1.6.10/whatap/trace/mod/database_cxoracle.py +28 -0
  8. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/trace_context.py +1 -1
  9. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/trace_module_definition.py +6 -14
  10. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap_python.egg-info/PKG-INFO +1 -1
  11. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap_python.egg-info/SOURCES.txt +2 -0
  12. whatap_python-1.6.8/whatap/build.py +0 -4
  13. {whatap_python-1.6.8 → whatap_python-1.6.10}/README.md +0 -0
  14. {whatap_python-1.6.8 → whatap_python-1.6.10}/setup.cfg +0 -0
  15. {whatap_python-1.6.8 → whatap_python-1.6.10}/setup.py +0 -0
  16. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/LICENSE +0 -0
  17. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/README.rst +0 -0
  18. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/__init__.py +0 -0
  19. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/__main__.py +0 -0
  20. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/agent/darwin/amd64/whatap_python +0 -0
  21. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/agent/darwin/arm64/whatap_python +0 -0
  22. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/agent/linux/amd64/whatap_python +0 -0
  23. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/agent/linux/arm64/whatap_python +0 -0
  24. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/bootstrap/__init__.py +0 -0
  25. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/bootstrap/sitecustomize.py +0 -0
  26. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/conf/__init__.py +0 -0
  27. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/conf/configuration.py +0 -0
  28. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/conf/license.py +0 -0
  29. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/control/__init__.py +0 -0
  30. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/io/__init__.py +0 -0
  31. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/io/data_inputx.py +0 -0
  32. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/io/data_outputx.py +0 -0
  33. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/net/__init__.py +0 -0
  34. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/net/async_sender.py +0 -0
  35. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/net/packet_enum.py +0 -0
  36. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/net/packet_type_enum.py +0 -0
  37. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/net/param_def.py +0 -0
  38. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/net/stackhelper.py +0 -0
  39. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/net/udp_session.py +0 -0
  40. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/net/udp_thread.py +0 -0
  41. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/pack/__init__.py +0 -0
  42. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/pack/logSinkPack.py +0 -0
  43. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/pack/pack.py +0 -0
  44. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/pack/pack_enum.py +0 -0
  45. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/scripts/__init__.py +0 -0
  46. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/__init__.py +0 -0
  47. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/__init__.py +0 -0
  48. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/amqp_kombu.py +0 -0
  49. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/amqp_pika.py +0 -0
  50. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/application_bottle.py +0 -0
  51. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/application_celery.py +0 -0
  52. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/application_cherrypy.py +0 -0
  53. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/application_django_py3.py +0 -0
  54. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/application_fastapi.py +0 -0
  55. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/application_flask.py +0 -0
  56. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/application_frappe.py +0 -0
  57. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/application_graphql.py +0 -0
  58. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/application_nameko.py +0 -0
  59. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/application_tornado.py +0 -0
  60. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/database_mongo.py +0 -0
  61. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/database_mysql.py +0 -0
  62. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/database_postgresql.py +0 -0
  63. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/database_redis.py +0 -0
  64. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/database_toolkit.py +0 -0
  65. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/email_smtp.py +0 -0
  66. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/httpc_django.py +0 -0
  67. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/httpc_httplib.py +0 -0
  68. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/httpc_requests.py +0 -0
  69. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/httpc_urllib3.py +0 -0
  70. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/logging.py +0 -0
  71. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/mod/plugin.py +0 -0
  72. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/simple_trace_context.py +0 -0
  73. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/trace_context_manager.py +0 -0
  74. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/trace/trace_import.py +0 -0
  75. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/util/__init__.py +0 -0
  76. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/util/bit_util.py +0 -0
  77. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/util/cardinality/__init__.py +0 -0
  78. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/util/cardinality/hyperloglog.py +0 -0
  79. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/util/cardinality/murmurhash.py +0 -0
  80. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/util/cardinality/registerset.py +0 -0
  81. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/util/compare_util.py +0 -0
  82. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/util/date_util.py +0 -0
  83. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/util/debug_util.py +0 -0
  84. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/util/escape_literal_sql.py +0 -0
  85. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/util/hash_util.py +0 -0
  86. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/util/hexa32.py +0 -0
  87. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/util/int_set.py +0 -0
  88. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/util/ip_util.py +0 -0
  89. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/util/keygen.py +0 -0
  90. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/util/linked_list.py +0 -0
  91. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/util/linked_map.py +0 -0
  92. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/util/metering_util.py +0 -0
  93. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/util/request_double_queue.py +0 -0
  94. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/util/request_queue.py +0 -0
  95. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/util/string_util.py +0 -0
  96. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/util/throttle_util.py +0 -0
  97. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/util/userid_util.py +0 -0
  98. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/value/__init__.py +0 -0
  99. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/value/blob_value.py +0 -0
  100. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/value/boolean_value.py +0 -0
  101. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/value/decimal_value.py +0 -0
  102. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/value/double_summary.py +0 -0
  103. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/value/double_value.py +0 -0
  104. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/value/float_array.py +0 -0
  105. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/value/float_value.py +0 -0
  106. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/value/int_array.py +0 -0
  107. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/value/ip4_value.py +0 -0
  108. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/value/list_value.py +0 -0
  109. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/value/long_array.py +0 -0
  110. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/value/long_summary.py +0 -0
  111. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/value/map_value.py +0 -0
  112. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/value/null_value.py +0 -0
  113. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/value/number_value.py +0 -0
  114. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/value/summary_value.py +0 -0
  115. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/value/text_array.py +0 -0
  116. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/value/text_hash_value.py +0 -0
  117. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/value/text_value.py +0 -0
  118. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/value/value.py +0 -0
  119. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/value/value_enum.py +0 -0
  120. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap/whatap.conf +0 -0
  121. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap_python.egg-info/dependency_links.txt +0 -0
  122. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap_python.egg-info/entry_points.txt +0 -0
  123. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap_python.egg-info/not-zip-safe +0 -0
  124. {whatap_python-1.6.8 → whatap_python-1.6.10}/whatap_python.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: whatap-python
3
- Version: 1.6.8
3
+ Version: 1.6.10
4
4
  Summary: Monitoring and Profiling Service
5
5
  Home-page: https://www.whatap.io
6
6
  Author: whatap
@@ -0,0 +1,4 @@
1
+ app = 'Python'
2
+ name = 'whatap-python'
3
+ version = '1.6.10'
4
+ release_date = '20240905'
@@ -15,7 +15,7 @@ class Configure(object):
15
15
  observers = []
16
16
  POD_NAME = os.environ.get("POD_NAME") if os.environ.get('POD_NAME') else os.environ.get("PODNAME") if os.environ.get("PODNAME") else ''
17
17
  license = None
18
- max_send_queue_size = 1000
18
+ max_send_queue_size = 2000
19
19
 
20
20
  @classmethod
21
21
  def init(cls, display=True):
@@ -130,7 +130,6 @@ def instrument_handlers_base(module):
130
130
  return callback
131
131
 
132
132
  return trace
133
-
134
133
  if hasattr(module.BaseHandler, 'apply_response_fixes'):
135
134
  module.BaseHandler.apply_response_fixes = wrapper(
136
135
  module.BaseHandler.apply_response_fixes)
@@ -152,7 +151,6 @@ def instrument_handlers_base(module):
152
151
  return callback
153
152
 
154
153
  return trace
155
-
156
154
  if hasattr(module.BaseHandler, 'handle_uncaught_exception'):
157
155
  module.BaseHandler.handle_uncaught_exception = wrapper(
158
156
  module.BaseHandler.handle_uncaught_exception)
@@ -183,6 +181,24 @@ def instrument_handlers_base(module):
183
181
  module.BaseHandler.get_response = get_response_wrapper(
184
182
  module.BaseHandler.get_response)
185
183
 
184
+ def wrapper_async(fn):
185
+ @trace_handler_async(fn)
186
+ async def trace(*args, **kwargs):
187
+ ## asgi applicaiton 에서 threading.local()을 사용할 경우 데이터가 침해 될 수 있다.
188
+ ## contextvars 를 이용하여 현재 실행중인 코루틴 콘텍스트를 유지한다.
189
+ request = args[1]
190
+ scope = request.scope
191
+ ctx = scope.get(WHATAP_CTX)
192
+ callback = await fn(*args, **kwargs)
193
+ ctx.asgi_response = callback
194
+ if ctx and conf.trace_user_enabled:
195
+ if not conf.trace_user_using_ip:
196
+ userid_util.setUserId(request, callback, ctx._rawuserid)
197
+
198
+ return callback
199
+ return trace
200
+ if hasattr(module, 'BaseHandler') and hasattr(module.BaseHandler, 'get_response_async'):
201
+ module.BaseHandler.get_response_async = wrapper_async(module.BaseHandler.get_response_async)
186
202
  # if django_py3_loaded:
187
203
  # instrument_handlers_async(module)
188
204
 
@@ -0,0 +1,263 @@
1
+ import logging as logging_module
2
+ import traceback
3
+ from whatap.conf.configure import Configure as conf
4
+ from whatap.net import async_sender
5
+ from whatap.trace.trace_context_manager import TraceContextManager
6
+ from whatap.trace.trace_context import TraceContext
7
+ from whatap.trace.mod.application_wsgi import isIgnore, start_interceptor, end_interceptor
8
+ from whatap.util.hash_util import HashUtil as hash_util
9
+ from whatap.util.userid_util import UseridUtil
10
+ from whatap.util.date_util import DateUtil
11
+ from whatap.util.hexa32 import Hexa32 as hexa32
12
+ from whatap.util.keygen import KeyGen
13
+ import whatap.util.throttle_util as throttle_util
14
+ from whatap.net.packet_type_enum import PacketTypeEnum
15
+ from whatap import logging
16
+ import sys
17
+
18
+ SCOPE_ARGS_LENGTH = 2
19
+ HEADER = 'headers'
20
+ PATH = 'path'
21
+ USER_AGENT = 'user-agent'
22
+ REFERER = 'referer'
23
+ CLIENT = 'client'
24
+ COOKIE = 'cookie'
25
+ HOST = 'host'
26
+ QUERY_STRING = 'query_string'
27
+ WHATAP_CTX = '__whatap__ctx'
28
+ logger = logging_module.getLogger(__name__)
29
+
30
+ def blocking_handler_asgi():
31
+ def handler(func):
32
+ from django.http import HttpResponse, HttpResponseRedirect
33
+ async def wrapper(instance, scope, receive, send):
34
+ args = (instance, scope, receive, send)
35
+ scope, headers = parseHeaders(args)
36
+ assert scope, headers
37
+ if conf.throttle_enabled:
38
+ remote_ip = parseRemoteAddr(scope, headers)
39
+ path = scope.get(PATH)
40
+ if throttle_util.isblocking(remote_ip, path):
41
+ if conf.reject_event_enabled:
42
+ ctx = TraceContextManager.getLocalContext()
43
+ if not ctx:
44
+ ctx = TraceContext()
45
+ throttle_util.sendrejectevent(ctx, path, remote_ip)
46
+
47
+ if conf.throttle_blocked_forward:
48
+ response = HttpResponseRedirect(status=302, redirect_to=conf.throttle_blocked_forward)
49
+
50
+ if path == conf.throttle_blocked_forward:
51
+ response = HttpResponse(content=conf.throttle_blocked_message, status=200)
52
+
53
+ return await instance.send_response(response, send)
54
+
55
+ response = HttpResponse(content=conf.throttle_blocked_message, status=403)
56
+ return await instance.send_response(response, send)
57
+ return await func(instance, scope, receive, send)
58
+ return wrapper
59
+ return handler
60
+
61
+ def trace_handler_asgi(fn):
62
+ def handler(func):
63
+ async def wrapper(instance, scope, receive, send):
64
+ if scope["type"] != "http":
65
+ await fn(instance, scope, receive, send)
66
+ try:
67
+ await func(instance, scope, receive, send)
68
+ except Exception as e:
69
+ logging.debug(e, extra={'id': 'WA917'}, exc_info=True)
70
+ print(e, dict(extra={'id': 'WA917'}, exc_info=True))
71
+ import traceback
72
+ traceback.print_exc()
73
+ return wrapper
74
+ return handler
75
+
76
+ def trace_handler_async(fn):
77
+ def handler(func):
78
+ async def wrapper(*args, **kwargs):
79
+ try:
80
+ response = await func(*args, **kwargs)
81
+ except Exception as e:
82
+ logging.debug(e, extra={'id': 'WA917'}, exc_info=True)
83
+ print(e, dict(extra={'id': 'WA917'}, exc_info=True))
84
+ import traceback
85
+ traceback.print_exc()
86
+ return await fn(*args, **kwargs)
87
+ else:
88
+ return response
89
+ return wrapper
90
+ return handler
91
+
92
+ def parseServiceName(environ):
93
+ return environ.get('PATH_INFO', '')
94
+
95
+ def parseHeaders(args):
96
+ headers = {}
97
+ if len(args) > SCOPE_ARGS_LENGTH:
98
+ scope = args[1]
99
+ if HEADER in scope:
100
+ for arg in scope[HEADER]:
101
+ headers[str(arg[0].decode()).lower()] = str(arg[1].decode())
102
+
103
+ return scope, headers
104
+ return None, None
105
+
106
+ def parseRemoteAddr(scope, headers):
107
+ remoteIp = ''
108
+ if CLIENT in scope:
109
+ remoteIp = scope.get(CLIENT)[0]
110
+ if conf.trace_http_client_ip_header_key:
111
+ header_val = headers.get(conf.trace_http_client_ip_header_key, '')
112
+ remoteIp = header_val.split(',')[0].strip()
113
+
114
+ return remoteIp
115
+
116
+ def getUserId(scope, headers, defValue):
117
+ try:
118
+ if conf.user_header_ticket:
119
+ ticket = headers.get(conf.user_header_ticket, "")
120
+ if ticket:
121
+ return hash_util.hashFromString(ticket), ticket
122
+ return 0, ""
123
+ cookie = headers.get(COOKIE, "")
124
+ if cookie:
125
+ if len(cookie) >= conf.trace_user_cookie_limit:
126
+ return defValue
127
+
128
+ x1 = cookie.find(UseridUtil.WHATAP_R)
129
+ if x1 >= 0:
130
+ x2 = cookie.find(';', x1)
131
+ if x2 > 0:
132
+ value = cookie[x1 + len(UseridUtil.WHATAP_R) + 1: x2]
133
+ else:
134
+ value = cookie[x1 + len(UseridUtil.WHATAP_R) + 1:]
135
+ return hexa32.toLong32(value), value
136
+ userid = KeyGen.next()
137
+ return userid, hexa32.toString32(userid)
138
+ except Exception:
139
+ exc_type, exc_value, exc_traceback = sys.exc_info()
140
+ logger.debug("A502", 10, str(exc_value))
141
+
142
+ def interceptor_error_asgi(ctx, status_code, errors):
143
+ ctx.status = int(status_code/ 100)
144
+ if ctx.status >= 4:
145
+ ctx.error = 1
146
+
147
+ error = ''
148
+ frame = sys._current_frames().get(ctx.thread.ident)
149
+ if not frame:
150
+ return
151
+
152
+ for stack in traceback.extract_stack(frame):
153
+ line = stack[0]
154
+ line_num = stack[1]
155
+ method_name = stack[2]
156
+
157
+ if line.find('/whatap/trace') > -1 or line.find(
158
+ '/threading.py') > -1:
159
+ continue
160
+ error += '{} ({}:{})\n'.format(method_name, line, line_num)
161
+
162
+ errors.append(error)
163
+
164
+ # errors.append(''.join(traceback.format_list(traceback.extract_stack(sys._current_frames()[ctx.thread.ident]))))
165
+ async_sender.send_packet(PacketTypeEnum.TX_ERROR, ctx, errors)
166
+
167
+ async def interceptor_asgi(fn, *args, **kwargs):
168
+ scope, headers = parseHeaders(args)
169
+ if scope == None and headers == None:
170
+ return await fn(*args, **kwargs)
171
+
172
+ ctx = TraceContext()
173
+ ctx.host = headers.get(HOST, '').split(':')[0]
174
+ ctx.service_name = scope.get(PATH)
175
+
176
+ ctx.remoteIp = parseRemoteAddr(scope, headers)
177
+
178
+ ctx.userAgentString = headers.get(USER_AGENT, '')
179
+ ctx.referer = headers.get(REFERER, '')
180
+
181
+ if conf.trace_user_enabled:
182
+ if conf.trace_user_using_ip:
183
+ ctx.userid = parseRemoteAddr(scope, headers)
184
+ else:
185
+ ctx.userid, ctx._rawuserid = getUserId(scope, headers, ctx.remoteIp)
186
+
187
+ mstt = headers.get(
188
+ conf._trace_mtrace_caller_key.lower().replace('-', '_'), '')
189
+
190
+ if mstt:
191
+ ctx.setTransfer(mstt)
192
+ if conf.stat_mtrace_enabled:
193
+ val = headers.get(
194
+ conf._trace_mtrace_info_key.lower().replace('-', '_'), '')
195
+ if val and len(val):
196
+ ctx.setTransferInfo(val)
197
+ pass
198
+
199
+ myid = headers.get(
200
+ conf._trace_mtrace_callee_key.lower().replace('-', '_'), '')
201
+ if myid:
202
+ ctx.setTxid(myid)
203
+ caller_poid = headers.get(
204
+ conf._trace_mtrace_caller_poid_key.upper().replace('-', '_'), '')
205
+
206
+ if caller_poid:
207
+ ctx.mcaller_poid = caller_poid
208
+
209
+ try:
210
+ if isIgnore(ctx.service_name):
211
+ ctx.is_ignored = True
212
+ return fn(*args, **kwargs)
213
+ except Exception as e:
214
+ pass
215
+
216
+ start_interceptor(ctx)
217
+ try:
218
+ scope[WHATAP_CTX] = ctx
219
+ await fn(*args, **kwargs)
220
+ response = ctx.asgi_response
221
+
222
+ query_string = str(scope.get(QUERY_STRING, ''))
223
+ if query_string:
224
+ ctx.service_name += '?{}'.format(query_string)
225
+
226
+ if ctx.service_name.find('.') > -1 and ctx.service_name.split('.')[
227
+ 1] in conf.web_static_content_extensions:
228
+ ctx.isStaticContents = 'true'
229
+
230
+ if response:
231
+ status_code = response.status_code
232
+ errors = [response.__class__.__name__, response.reason_phrase]
233
+ interceptor_error_asgi(ctx, status_code, errors)
234
+
235
+
236
+ if conf.profile_http_header_enabled:
237
+ keys = []
238
+ for key, value in headers.items():
239
+ keys.append(key)
240
+ keys.sort()
241
+
242
+ text = ''
243
+ for key in keys:
244
+ text += '{}={}\n'.format(key.lower(),
245
+ headers[key])
246
+
247
+ datas = ['HTTP-HEADERS', 'HTTP-HEADERS', text]
248
+ ctx.start_time = DateUtil.nowSystem()
249
+ async_sender.send_packet(PacketTypeEnum.TX_MSG, ctx, datas)
250
+ finally:
251
+ if ctx:
252
+ end_interceptor(ctx=ctx)
253
+
254
+ def instrument_asgi(module):
255
+ def wrapper(fn):
256
+ @trace_handler_asgi(fn)
257
+ @blocking_handler_asgi()
258
+ async def trace(instance, scope, receive, send):
259
+ await interceptor_asgi(fn, instance, scope, receive, send)
260
+ return trace
261
+
262
+ ### module 있는지 체크 하고 파일을 분리해야함.
263
+ module.ASGIHandler.__call__ = wrapper(module.ASGIHandler.__call__)
@@ -380,11 +380,10 @@ def interceptor_db_con(fn, db_type, *args, **kwargs):
380
380
  if not kwargs:
381
381
  kwargs = dict(
382
382
  x.split('=') for x in re.sub(r'\s*=\s*', '=', args[0]).split())
383
- ctx = TraceContextManager.getLocalContext()
384
383
  text = '{}://'.format(db_type)
385
384
  text += kwargs.get('user')
386
385
  text += "@"
387
- text += kwargs.get('host')
386
+ text += kwargs.get('host',kwargs.get('dsn','') )
388
387
  text += '/'
389
388
  text += kwargs.get('database', kwargs.get('db', kwargs.get('dbname', '')))
390
389
  ctx.active_dbc = text
@@ -456,7 +455,6 @@ def interceptor_db_execute(fn, *args, **kwargs):
456
455
  except Exception as e:
457
456
  interceptor_step_error(e)
458
457
  finally:
459
- ctx = TraceContextManager.getLocalContext()
460
458
  datas = [ctx.lctx.get('dbc', ''), query]
461
459
  ctx.elapsed = DateUtil.nowSystem() - start_time
462
460
  async_sender.send_packet(PacketTypeEnum.TX_SQL, ctx,
@@ -0,0 +1,28 @@
1
+ from whatap.trace import get_dict
2
+ from whatap.trace.mod.application_wsgi import trace_handler, \
3
+ interceptor_db_con, interceptor_db_execute, interceptor_db_close
4
+
5
+ def instrument_oracle_client(module):
6
+ def wrapper(fn):
7
+ @trace_handler(fn)
8
+ def trace(*args, **kwargs):
9
+ db_type = 'oracle'
10
+ callback = interceptor_db_con(fn, db_type, *args, **kwargs)
11
+ return callback
12
+
13
+ return trace
14
+ if hasattr(module, "connect"):
15
+ module.connect = wrapper(module.connect)
16
+
17
+ def wrapper(fn):
18
+ @trace_handler(fn)
19
+ def trace(*args, **kwargs):
20
+ callback = interceptor_db_close(fn, *args, **kwargs)
21
+ return callback
22
+
23
+ return trace
24
+
25
+ if hasattr(module, "Connection") and hasattr(module.Connection, "close"):
26
+ get_dict(module.Connection)['close'] = wrapper(
27
+ module.Connection.close)
28
+
@@ -32,7 +32,7 @@ class TraceContext(object):
32
32
  self.start_malloc = 0
33
33
 
34
34
  self.status = 0
35
-
35
+ self.asgi_response= None
36
36
  self.service_hash = 0
37
37
  self.service_name = ''
38
38
  self.remoteIp = ''
@@ -17,7 +17,6 @@ DEFINITION = {
17
17
  ],
18
18
  'httpc_urllib3': [
19
19
  ('urllib3.request', 'instrument_urllib3'),
20
- # ('requests.packages.urllib3.request', 'instrument_urllib3'),
21
20
  ],
22
21
  'httpc_django': [
23
22
  ('revproxy.views', 'instrument_revproxy_views'),
@@ -50,8 +49,6 @@ DEFINITION = {
50
49
  ],
51
50
  'application_django': [
52
51
  ('django.core.handlers.wsgi', 'instrument'),
53
- ('django.core.handlers.asgi', 'instrument_asgi'),
54
-
55
52
  ('django.core.handlers.base', 'instrument_handlers_base'),
56
53
  ('django.views.generic.base', 'instrument_generic_base'),
57
54
  ('django.contrib.staticfiles.handlers', 'instrument_handlers_static'),
@@ -64,6 +61,9 @@ DEFINITION = {
64
61
  False),
65
62
 
66
63
  ],
64
+ 'application_django_asgi': [
65
+ ('django.core.handlers.asgi', 'instrument_asgi'),
66
+ ],
67
67
  'application_flask': [
68
68
  ('flask', 'instrument'),
69
69
  ],
@@ -71,15 +71,9 @@ DEFINITION = {
71
71
  ('tornado.web', 'instrument'),
72
72
  ],
73
73
  'application_celery': [
74
- # ('celery.task.base', 'instrument_task_base'),
75
- #('celery.app.task', 'instrument_app_task'),
76
- #('celery.worker', 'instrument_celery_worker'),
77
- #('celery.concurrency.processes', 'instrument_celery_worker'),
78
- #('celery.concurrency.prefork', 'instrument_celery_worker'),
79
74
  ('celery.execute.trace', 'instrument_celery_execute_trace'),
80
75
  ('celery.task.trace', 'instrument_celery_execute_trace'),
81
76
  ('celery.app.trace', 'instrument_celery_execute_trace'),
82
- #('billiard.pool', 'instrument_billiard_pool'),
83
77
  ],
84
78
  'database_redis':[
85
79
  ('redis','instrument_redis_connection'),
@@ -87,9 +81,6 @@ DEFINITION = {
87
81
  'email_smtp':[
88
82
  ('smtplib','instrument_smtp'),
89
83
  ],
90
- # 'amqp_kombu':[
91
- # ('kombu','instrument_kombu'),
92
- # ],
93
84
  'amqp_pika':[
94
85
  ('pika.channel','instrument_pika'),
95
86
  ],
@@ -98,8 +89,6 @@ DEFINITION = {
98
89
  ('spsengine.containers', 'instrument_nameko_spawn_worker'),
99
90
  ],
100
91
  'application_graphql':[
101
- #('graphql','instrument_graphql'),
102
-
103
92
  #graphen-core 3.x~
104
93
  ('graphql.execution.execute','instrument_graphql'),
105
94
 
@@ -122,4 +111,7 @@ DEFINITION = {
122
111
  'application_frappe': [
123
112
  ('frappe.app', 'instrument'),
124
113
  ],
114
+ 'database_cxoracle':[
115
+ ('cx_Oracle', 'instrument_oracle_client'),
116
+ ],
125
117
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: whatap-python
3
- Version: 1.6.8
3
+ Version: 1.6.10
4
4
  Summary: Monitoring and Profiling Service
5
5
  Home-page: https://www.whatap.io
6
6
  Author: whatap
@@ -47,6 +47,7 @@ whatap/trace/mod/application_bottle.py
47
47
  whatap/trace/mod/application_celery.py
48
48
  whatap/trace/mod/application_cherrypy.py
49
49
  whatap/trace/mod/application_django.py
50
+ whatap/trace/mod/application_django_asgi.py
50
51
  whatap/trace/mod/application_django_py3.py
51
52
  whatap/trace/mod/application_fastapi.py
52
53
  whatap/trace/mod/application_flask.py
@@ -55,6 +56,7 @@ whatap/trace/mod/application_graphql.py
55
56
  whatap/trace/mod/application_nameko.py
56
57
  whatap/trace/mod/application_tornado.py
57
58
  whatap/trace/mod/application_wsgi.py
59
+ whatap/trace/mod/database_cxoracle.py
58
60
  whatap/trace/mod/database_mongo.py
59
61
  whatap/trace/mod/database_mysql.py
60
62
  whatap/trace/mod/database_postgresql.py
@@ -1,4 +0,0 @@
1
- app = 'Python'
2
- name = 'whatap-python'
3
- version = '1.6.8'
4
- release_date = '20240827'
File without changes
File without changes
File without changes