whatap-python 1.8.8__tar.gz → 1.8.9.post0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/PKG-INFO +1 -1
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/agent/linux/amd64/whatap_python +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/agent/linux/arm64/whatap_python +0 -0
- whatap_python-1.8.9.post0/whatap/build.py +4 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/application/wsgi.py +66 -27
- whatap_python-1.8.9.post0/whatap/trace/mod/database/sqlite3.py +130 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/trace_module_definition.py +31 -22
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap_python.egg-info/PKG-INFO +1 -1
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap_python.egg-info/SOURCES.txt +1 -0
- whatap_python-1.8.8/whatap/build.py +0 -4
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/README.md +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/setup.cfg +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/setup.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/LICENSE +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/README.rst +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/__init__.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/__main__.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/agent/darwin/amd64/whatap_python +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/agent/darwin/arm64/whatap_python +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/bootstrap/__init__.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/bootstrap/sitecustomize.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/conf/__init__.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/conf/configuration.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/conf/configure.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/conf/license.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/control/__init__.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/counter/__init__.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/counter/counter_manager.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/counter/tasks/__init__.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/counter/tasks/openfiledescriptor.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/io/__init__.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/io/data_inputx.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/io/data_outputx.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/net/__init__.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/net/async_sender.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/net/packet_enum.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/net/packet_type_enum.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/net/param_def.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/net/stackhelper.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/net/udp_session.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/net/udp_thread.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/pack/__init__.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/pack/logSinkPack.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/pack/pack.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/pack/pack_enum.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/pack/tagCountPack.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/scripts/__init__.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/__init__.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/__init__.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/amqp/__init__.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/amqp/kombu.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/amqp/pika.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/application/__init__.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/application/bottle.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/application/celery.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/application/cherrypy.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/application/django.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/application/django_asgi.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/application/django_py3.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/application/fastapi.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/application/flask.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/application/frappe.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/application/graphql.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/application/nameko.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/application/odoo.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/application/starlette.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/application/tornado.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/database/__init__.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/database/cxoracle.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/database/mongo.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/database/mysql.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/database/neo4j.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/database/postgresql.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/database/redis.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/database/toolkit.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/email/__init__.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/email/smtp.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/httpc/__init__.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/httpc/django.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/httpc/httplib.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/httpc/httpx.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/httpc/requests.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/httpc/urllib3.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/llm/__init__.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/llm/openai.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/logging.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/plugin.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/standalone/__init__.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/standalone/multiple.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/standalone/single.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/simple_trace_context.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/trace_context.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/trace_context_manager.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/trace_import.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/util/__init__.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/util/bit_util.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/util/cardinality/__init__.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/util/cardinality/hyperloglog.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/util/cardinality/murmurhash.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/util/cardinality/registerset.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/util/compare_util.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/util/date_util.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/util/debug_util.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/util/escape_literal_sql.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/util/hash_util.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/util/hexa32.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/util/int_set.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/util/ip_util.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/util/keygen.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/util/linked_list.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/util/linked_map.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/util/metering_util.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/util/request_double_queue.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/util/request_queue.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/util/string_util.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/util/throttle_util.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/util/userid_util.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/value/__init__.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/value/blob_value.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/value/boolean_value.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/value/decimal_value.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/value/double_summary.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/value/double_value.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/value/float_array.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/value/float_value.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/value/int_array.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/value/ip4_value.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/value/list_value.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/value/long_array.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/value/long_summary.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/value/map_value.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/value/null_value.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/value/number_value.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/value/summary_value.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/value/text_array.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/value/text_hash_value.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/value/text_value.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/value/value.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/value/value_enum.py +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/whatap.conf +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap_python.egg-info/dependency_links.txt +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap_python.egg-info/entry_points.txt +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap_python.egg-info/not-zip-safe +0 -0
- {whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap_python.egg-info/top_level.txt +0 -0
|
Binary file
|
|
Binary file
|
|
@@ -403,11 +403,17 @@ def interceptor_db_con(fn, db_info, *args, **kwargs):
|
|
|
403
403
|
kwargs = dict(
|
|
404
404
|
x.split('=') for x in re.sub(r'\s*=\s*', '=', args[0]).split())
|
|
405
405
|
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
406
|
+
db_type = db_info.get('type')
|
|
407
|
+
|
|
408
|
+
if db_type == "sqlite":
|
|
409
|
+
text = "sqlite:"
|
|
410
|
+
else:
|
|
411
|
+
text = '{}://'.format(db_type)
|
|
412
|
+
text += kwargs.get('user', '')
|
|
413
|
+
text += "@"
|
|
414
|
+
text += kwargs.get('host', kwargs.get('dsn', ''))
|
|
415
|
+
text += '/'
|
|
416
|
+
|
|
411
417
|
text += kwargs.get('database', kwargs.get('db', kwargs.get('dbname', '')))
|
|
412
418
|
ctx.active_dbc = text
|
|
413
419
|
ctx.lctx['dbc'] = text
|
|
@@ -445,14 +451,58 @@ def addQuoteList(arg_list):
|
|
|
445
451
|
return tuple(quoted_list)
|
|
446
452
|
|
|
447
453
|
def neo4jQuery(query,paremeter):
|
|
448
|
-
|
|
454
|
+
neo4j_query = query
|
|
449
455
|
|
|
450
456
|
for key, value in paremeter.items():
|
|
451
457
|
placeholder = f"${key}"
|
|
452
458
|
replacement = f"'{str(value)}'"
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
return
|
|
459
|
+
neo4j_query = neo4j_query.replace(placeholder, replacement)
|
|
460
|
+
|
|
461
|
+
return neo4j_query
|
|
462
|
+
|
|
463
|
+
def sqliteQuery(query, paremeter):
|
|
464
|
+
sqlite_query = query
|
|
465
|
+
|
|
466
|
+
def quote(v):
|
|
467
|
+
if v is None: return "NULL"
|
|
468
|
+
if isinstance(v, (bytes, bytearray)): return "X'" + v.hex() + "'"
|
|
469
|
+
return "'" + str(v).replace("'", "''") + "'"
|
|
470
|
+
|
|
471
|
+
# 이름 기반: :name / @name / $name (단일 세트)
|
|
472
|
+
if isinstance(paremeter, dict):
|
|
473
|
+
for pfx in (':', '@', '$'):
|
|
474
|
+
for k, v in paremeter.items():
|
|
475
|
+
sqlite_query = sqlite_query.replace(f"{pfx}{k}", quote(v))
|
|
476
|
+
return sqlite_query
|
|
477
|
+
|
|
478
|
+
# 포지셔널 + executemany 분기
|
|
479
|
+
if isinstance(paremeter, (list, tuple)):
|
|
480
|
+
# ── executemany: [tuple|dict, ...] ──
|
|
481
|
+
if isinstance(paremeter, list) and paremeter and isinstance(paremeter[0], (tuple, dict)):
|
|
482
|
+
stmts = []
|
|
483
|
+
for params in paremeter:
|
|
484
|
+
sqlite_query = query
|
|
485
|
+
if isinstance(params, dict):
|
|
486
|
+
for pfx in (':', '@', '$'):
|
|
487
|
+
for k, v in params.items():
|
|
488
|
+
sqlite_query = sqlite_query.replace(f"{pfx}{k}", quote(v))
|
|
489
|
+
else: # tuple
|
|
490
|
+
for i, v in enumerate(params, 1):
|
|
491
|
+
sqlite_query = sqlite_query.replace(f"?{i}", quote(v))
|
|
492
|
+
for v in params:
|
|
493
|
+
sqlite_query = sqlite_query.replace('?', quote(v), 1)
|
|
494
|
+
stmts.append(sqlite_query)
|
|
495
|
+
return ";\n".join(stmts)
|
|
496
|
+
|
|
497
|
+
# ── 단일 포지셔널 세트 (tuple 또는 스칼라 list) ──
|
|
498
|
+
seq = paremeter if isinstance(paremeter, tuple) else tuple(paremeter)
|
|
499
|
+
for i, v in enumerate(seq, 1):
|
|
500
|
+
sqlite_query = sqlite_query.replace(f"?{i}", quote(v))
|
|
501
|
+
for v in seq:
|
|
502
|
+
sqlite_query = sqlite_query.replace('?', quote(v), 1)
|
|
503
|
+
return sqlite_query
|
|
504
|
+
|
|
505
|
+
return sqlite_query
|
|
456
506
|
|
|
457
507
|
def interceptor_db_execute(fn, db_info, *args, **kwargs):
|
|
458
508
|
ctx = TraceContextManager.getLocalContext()
|
|
@@ -466,6 +516,13 @@ def interceptor_db_execute(fn, db_info, *args, **kwargs):
|
|
|
466
516
|
query = neo4jQuery(args[1], kwargs)
|
|
467
517
|
except Exception as e:
|
|
468
518
|
pass
|
|
519
|
+
|
|
520
|
+
elif db_type == "sqlite" and len(args) > 2:
|
|
521
|
+
try:
|
|
522
|
+
query = sqliteQuery(args[1],args[2])
|
|
523
|
+
except Exception as e:
|
|
524
|
+
pass
|
|
525
|
+
|
|
469
526
|
else:
|
|
470
527
|
if len(args) > 2 and type(args[2]) == dict and args[2]:
|
|
471
528
|
try:
|
|
@@ -486,24 +543,6 @@ def interceptor_db_execute(fn, db_info, *args, **kwargs):
|
|
|
486
543
|
if not query:
|
|
487
544
|
return fn(*args, **kwargs)
|
|
488
545
|
|
|
489
|
-
start_time = DateUtil.nowSystem()
|
|
490
|
-
ctx.start_time = start_time
|
|
491
|
-
|
|
492
|
-
text = '{}://'.format(db_info.get('type'))
|
|
493
|
-
text += db_info.get('user' , '')
|
|
494
|
-
text += "@"
|
|
495
|
-
text += db_info.get('host', db_info.get('dsn', ''))
|
|
496
|
-
text += '/'
|
|
497
|
-
text += db_info.get('database', db_info.get('db', db_info.get('dbname', '')))
|
|
498
|
-
ctx.active_dbc = text
|
|
499
|
-
ctx.lctx['dbc'] = text
|
|
500
|
-
|
|
501
|
-
ctx.active_dbc = 0
|
|
502
|
-
|
|
503
|
-
datas = [text]
|
|
504
|
-
ctx.elapsed = DateUtil.nowSystem() - start_time
|
|
505
|
-
async_sender.send_packet(PacketTypeEnum.TX_DB_CONN, ctx, datas)
|
|
506
|
-
|
|
507
546
|
start_time = DateUtil.nowSystem()
|
|
508
547
|
ctx.start_time = start_time
|
|
509
548
|
ctx.active_sqlhash = query
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
from whatap.trace.mod.application.wsgi import trace_handler, \
|
|
2
|
+
interceptor_db_con, interceptor_db_execute, interceptor_db_close
|
|
3
|
+
|
|
4
|
+
class CursorProxy:
|
|
5
|
+
def __init__(self, real_cursor, db_info):
|
|
6
|
+
self._cur = real_cursor
|
|
7
|
+
self._db_info = db_info
|
|
8
|
+
|
|
9
|
+
def execute_wrapper(self, original_execute_method):
|
|
10
|
+
owner = getattr(original_execute_method, "__self__", None)
|
|
11
|
+
|
|
12
|
+
def safe_execute(*args, **kwargs):
|
|
13
|
+
if args and owner is not None and args[0] is owner:
|
|
14
|
+
args = args[1:]
|
|
15
|
+
return original_execute_method(*args, **kwargs)
|
|
16
|
+
|
|
17
|
+
return safe_execute
|
|
18
|
+
|
|
19
|
+
def execute(self, *args, **kwargs):
|
|
20
|
+
safe_fn = self.execute_wrapper(self._cur.execute)
|
|
21
|
+
callback = interceptor_db_execute(safe_fn, self._db_info, self._cur, *args, **kwargs)
|
|
22
|
+
return callback
|
|
23
|
+
|
|
24
|
+
def executemany(self, *args, **kwargs):
|
|
25
|
+
safe_fn = self.execute_wrapper(self._cur.executemany)
|
|
26
|
+
callback = interceptor_db_execute(safe_fn, self._db_info, self._cur, *args, **kwargs)
|
|
27
|
+
return callback
|
|
28
|
+
|
|
29
|
+
def close(self, *args, **kwargs):
|
|
30
|
+
callback = self._cur.close(*args, **kwargs)
|
|
31
|
+
return callback
|
|
32
|
+
|
|
33
|
+
def __enter__(self):
|
|
34
|
+
self._cur.__enter__()
|
|
35
|
+
return self
|
|
36
|
+
|
|
37
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
38
|
+
return self._cur.__exit__(exc_type, exc_val, exc_tb)
|
|
39
|
+
|
|
40
|
+
def __getattr__(self, name):
|
|
41
|
+
return getattr(self._cur, name)
|
|
42
|
+
|
|
43
|
+
def __setattr__(self, name, value):
|
|
44
|
+
if name.startswith('_'):
|
|
45
|
+
super().__setattr__(name, value)
|
|
46
|
+
else:
|
|
47
|
+
setattr(self._cur, name, value)
|
|
48
|
+
|
|
49
|
+
class ConnectionProxy:
|
|
50
|
+
def __init__(self, real_connection, db_info):
|
|
51
|
+
self._real_connection = real_connection
|
|
52
|
+
self._db_info = db_info
|
|
53
|
+
|
|
54
|
+
def execute_wrapper(self, original_execute_method):
|
|
55
|
+
owner = getattr(original_execute_method, "__self__", None)
|
|
56
|
+
|
|
57
|
+
def safe_execute(*args, **kwargs):
|
|
58
|
+
if args and owner is not None and args[0] is owner:
|
|
59
|
+
args = args[1:]
|
|
60
|
+
return original_execute_method(*args, **kwargs)
|
|
61
|
+
|
|
62
|
+
return safe_execute
|
|
63
|
+
|
|
64
|
+
def execute(self, *args, **kwargs):
|
|
65
|
+
real_cursor = self._real_connection.cursor()
|
|
66
|
+
safe_fn = self.execute_wrapper(real_cursor.execute)
|
|
67
|
+
callback = interceptor_db_execute(safe_fn,self._db_info,real_cursor,*args,**kwargs)
|
|
68
|
+
return callback
|
|
69
|
+
|
|
70
|
+
def executemany(self, *args, **kwargs):
|
|
71
|
+
real_cursor = self._real_connection.cursor()
|
|
72
|
+
safe_fn = self.execute_wrapper(real_cursor.executemany)
|
|
73
|
+
callback = interceptor_db_execute(safe_fn, self._db_info, real_cursor, *args, **kwargs)
|
|
74
|
+
return callback
|
|
75
|
+
|
|
76
|
+
def executescript(self, *args, **kwargs):
|
|
77
|
+
real_cursor = self._real_connection.cursor()
|
|
78
|
+
safe_fn = self.execute_wrapper(real_cursor.executescript)
|
|
79
|
+
callback = interceptor_db_execute(safe_fn, self._db_info, real_cursor, *args, **kwargs)
|
|
80
|
+
return callback
|
|
81
|
+
|
|
82
|
+
def cursor(self, *args, **kwargs):
|
|
83
|
+
real_cursor = self._real_connection.cursor(*args, **kwargs)
|
|
84
|
+
return CursorProxy(real_cursor, self._db_info)
|
|
85
|
+
|
|
86
|
+
def close(self, *args, **kwargs):
|
|
87
|
+
callback = interceptor_db_close(self._real_connection.close, *args, **kwargs)
|
|
88
|
+
return callback
|
|
89
|
+
|
|
90
|
+
def __getattr__(self, name):
|
|
91
|
+
return getattr(self._real_connection, name)
|
|
92
|
+
|
|
93
|
+
def __enter__(self):
|
|
94
|
+
self._real_connection.__enter__()
|
|
95
|
+
return self
|
|
96
|
+
|
|
97
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
98
|
+
return self._real_connection.__exit__(exc_type, exc_val, exc_tb)
|
|
99
|
+
|
|
100
|
+
def __setattr__(self, name, value):
|
|
101
|
+
if name.startswith('_'):
|
|
102
|
+
super().__setattr__(name, value)
|
|
103
|
+
else:
|
|
104
|
+
setattr(self._real_connection, name, value)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def instrument_sqlite3(module):
|
|
108
|
+
|
|
109
|
+
def wrapper(fn):
|
|
110
|
+
@trace_handler(fn)
|
|
111
|
+
def trace(*args, **kwargs):
|
|
112
|
+
if args:
|
|
113
|
+
kwargs['database'] = args[0]
|
|
114
|
+
args = args[1:]
|
|
115
|
+
|
|
116
|
+
db_name = kwargs.get('database', 'unknown')
|
|
117
|
+
db_info = {'type': 'sqlite', 'db': db_name}
|
|
118
|
+
db_info.update(kwargs)
|
|
119
|
+
|
|
120
|
+
real_connection = interceptor_db_con(fn, db_info, *args, **kwargs)
|
|
121
|
+
|
|
122
|
+
if real_connection:
|
|
123
|
+
return ConnectionProxy(real_connection, db_info)
|
|
124
|
+
|
|
125
|
+
return real_connection
|
|
126
|
+
|
|
127
|
+
return trace
|
|
128
|
+
|
|
129
|
+
if hasattr(module, "connect"):
|
|
130
|
+
module.connect = wrapper(module.connect)
|
|
@@ -11,6 +11,21 @@ DEFINITION = {
|
|
|
11
11
|
('', 'instrument_standalone_single'),
|
|
12
12
|
('', 'instrument_standalone_multiple')
|
|
13
13
|
],
|
|
14
|
+
'email.smtp': [
|
|
15
|
+
('smtplib', 'instrument_smtp'),
|
|
16
|
+
],
|
|
17
|
+
'amqp.pika': [
|
|
18
|
+
('pika.channel', 'instrument_pika'),
|
|
19
|
+
],
|
|
20
|
+
'llm.openai': [
|
|
21
|
+
('openai', 'instrument_openai')
|
|
22
|
+
],
|
|
23
|
+
'logging': [
|
|
24
|
+
('logging.handlers', 'instrument_logging'),
|
|
25
|
+
('loguru._handler', 'instrument_loguru'),
|
|
26
|
+
],
|
|
27
|
+
|
|
28
|
+
|
|
14
29
|
'httpc.httplib': [
|
|
15
30
|
('httplib', 'instrument_httplib'),
|
|
16
31
|
('http.client', 'instrument_httplib'),
|
|
@@ -28,6 +43,8 @@ DEFINITION = {
|
|
|
28
43
|
'httpc.httpx' : [
|
|
29
44
|
('httpx', 'instrument_httpx')
|
|
30
45
|
],
|
|
46
|
+
|
|
47
|
+
|
|
31
48
|
'database.mysql': [
|
|
32
49
|
('MySQLdb', 'instrument_MySQLdb'),
|
|
33
50
|
('MySQLdb.cursors', 'instrument_MySQLdb_cursors'),
|
|
@@ -42,12 +59,26 @@ DEFINITION = {
|
|
|
42
59
|
'database.neo4j': [
|
|
43
60
|
('neo4j', 'instrument_neo4j')
|
|
44
61
|
],
|
|
62
|
+
'database.sqlite3': [
|
|
63
|
+
('sqlite3', 'instrument_sqlite3')
|
|
64
|
+
],
|
|
65
|
+
'database.cxoracle':[
|
|
66
|
+
('cx_Oracle', 'instrument_oracle_client'),
|
|
67
|
+
],
|
|
68
|
+
'database.redis': [
|
|
69
|
+
('redis', 'instrument_redis_connection'),
|
|
70
|
+
],
|
|
71
|
+
'database.mongo': [
|
|
72
|
+
('pymongo', 'instrument_mongo_client'),
|
|
73
|
+
],
|
|
45
74
|
'database.toolkit': [
|
|
46
75
|
('sqlalchemy.orm.session', 'instrument_sqlalchemy'),
|
|
47
76
|
('sqlalchemy.engine.default', 'instrument_sqlalchemy_engine'),
|
|
48
77
|
('sqlalchemy.engine.create', 'instrument_sqlalchemy_engine_basic'),
|
|
49
78
|
('sqlalchemy.engine', 'instrument_sqlalchemy_engine_basic'),
|
|
50
79
|
],
|
|
80
|
+
|
|
81
|
+
|
|
51
82
|
'application.starlette' : [
|
|
52
83
|
('starlette.websockets' , 'instrument_starlette_websocket'),
|
|
53
84
|
],
|
|
@@ -88,15 +119,6 @@ DEFINITION = {
|
|
|
88
119
|
('celery.task.trace', 'instrument_celery_execute_trace'),
|
|
89
120
|
('celery.app.trace', 'instrument_celery_execute_trace'),
|
|
90
121
|
],
|
|
91
|
-
'database.redis':[
|
|
92
|
-
('redis','instrument_redis_connection'),
|
|
93
|
-
],
|
|
94
|
-
'email.smtp':[
|
|
95
|
-
('smtplib','instrument_smtp'),
|
|
96
|
-
],
|
|
97
|
-
'amqp.pika':[
|
|
98
|
-
('pika.channel','instrument_pika'),
|
|
99
|
-
],
|
|
100
122
|
'application.nameko': [
|
|
101
123
|
('nameko.containers', 'instrument_nameko_spawn_worker'),
|
|
102
124
|
('spsengine.containers', 'instrument_nameko_spawn_worker'),
|
|
@@ -108,13 +130,6 @@ DEFINITION = {
|
|
|
108
130
|
#graphen-core 2.x
|
|
109
131
|
('graphql.execution.executor','instrument_graphql'),
|
|
110
132
|
],
|
|
111
|
-
'database.mongo':[
|
|
112
|
-
('pymongo','instrument_mongo_client'),
|
|
113
|
-
],
|
|
114
|
-
'logging':[
|
|
115
|
-
('logging.handlers', 'instrument_logging'),
|
|
116
|
-
('loguru._handler','instrument_loguru'),
|
|
117
|
-
],
|
|
118
133
|
'application.fastapi': [
|
|
119
134
|
('fastapi.applications', 'instrument_applications'),
|
|
120
135
|
('fastapi.routing', 'instrument'),
|
|
@@ -127,10 +142,4 @@ DEFINITION = {
|
|
|
127
142
|
'application.odoo': [
|
|
128
143
|
('odoo', 'instrument'),
|
|
129
144
|
],
|
|
130
|
-
'database.cxoracle':[
|
|
131
|
-
('cx_Oracle', 'instrument_oracle_client'),
|
|
132
|
-
],
|
|
133
|
-
'llm.openai':[
|
|
134
|
-
('openai' , 'instrument_openai')
|
|
135
|
-
]
|
|
136
145
|
}
|
|
@@ -74,6 +74,7 @@ whatap/trace/mod/database/mysql.py
|
|
|
74
74
|
whatap/trace/mod/database/neo4j.py
|
|
75
75
|
whatap/trace/mod/database/postgresql.py
|
|
76
76
|
whatap/trace/mod/database/redis.py
|
|
77
|
+
whatap/trace/mod/database/sqlite3.py
|
|
77
78
|
whatap/trace/mod/database/toolkit.py
|
|
78
79
|
whatap/trace/mod/email/__init__.py
|
|
79
80
|
whatap/trace/mod/email/smtp.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/counter/tasks/openfiledescriptor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/application/django_asgi.py
RENAMED
|
File without changes
|
{whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap/trace/mod/application/django_py3.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{whatap_python-1.8.8 → whatap_python-1.8.9.post0}/whatap_python.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|