国产成人AV无码一二三区,少女1到100集,国产精品久久久久精品综合紧,巜公妇之诱感肉欲HD在线播放

文章 > Python基础教程 > python如何制作探针模块

python如何制作探针模块

python探针

头像

小妮浅浅

2021-09-25 09:33:593642浏览 · 0收藏 · 0评论

1、涉及aiomysql模块,在MetaPathFinder.find_module中只需要处理aiomysql模块。

其他先忽略,然后确定需要替换aiomysql的功能。从业务上来说,一般我们只需要cursor.execute、cursor.fetchone、cursor.fetchall、cursor.executemany这些主要操作。

2、先cursor.execute的源代码(其他同理),调用self.nextset的方法。

完成上一个请求的数据,然后合并sql语句,最后通过self._query查询。

实例

import importlib
import time
import sys
from functools import wraps
 
from typing import cast, Any, Callable, Optional, Tuple, TYPE_CHECKING
from types import ModuleType
if TYPE_CHECKING:
    import aiomysql
 
 
def func_wrapper(func: Callable):
    @wraps(func)
    async def wrapper(*args, **kwargs) -> Any:
        start: float = time.time()
        func_result: Any = await func(*args, **kwargs)
        end: float = time.time()
 
        # 根据_query可以知道, 第一格参数是self, 第二个参数是sql
        self: aiomysql.Cursor = args[0]
        sql: str = args[1]
        # 通过self,我们可以拿到其他的数据
        db: str = self._connection.db
        user: str = self._connection.user
        host: str = self._connection.host
        port: str = self._connection.port
        execute_result: Tuple[Tuple] = self._rows
        # 可以根据自己定义的agent把数据发送到指定的平台, 然后我们就可以在平台上看到对应的数据或进行监控了,
        # 这里只是打印一部分数据出来
        print({
            "sql": sql,
            "db": db,
            "user": user,
            "host": host,
            "port": port,
            "result": execute_result,
            "speed time": end - start
        })
        return func_result
    return cast(Callable, wrapper)
 
 
class MetaPathFinder:
 
    @staticmethod
    def find_module(fullname: str, path: Optional[str] = None) -> Optional["MetaPathLoader"]:
        if fullname == 'aiomysql':
            # 只有aiomysql才进行hook
            return MetaPathLoader()
        else:
            return None
 
 
class MetaPathLoader:
 
    @staticmethod
    def load_module(fullname: str):
        if fullname in sys.modules:
            return sys.modules[fullname]
        # 防止递归调用
        finder: "MetaPathFinder" = sys.meta_path.pop(0)
        # 导入 module
        module: ModuleType = importlib.import_module(fullname)
        # 针对_query进行hook
        module.Cursor._query = func_wrapper(module.Cursor._query)
        sys.meta_path.insert(0, finder)
        return module
 
 
async def test_mysql() -> None:
    import aiomysql
    pool: aiomysql.Pool = await aiomysql.create_pool(
        host='127.0.0.1', port=3306, user='root', password='123123', db='mysql'
    )
    async with pool.acquire() as conn:
        async with conn.cursor() as cur:
            await cur.execute("SELECT 42;")
            (r,) = await cur.fetchone()
            assert r == 42
    pool.close()
    await pool.wait_closed()
 
if __name__ == '__main__':
    sys.meta_path.insert(0, MetaPathFinder())
    import asyncio
 
    asyncio.run(test_mysql())
 
# 输出示例:
# 可以看出sql语句与我们输入的一样, db, user, host, port等参数也是, 还能知道执行的结果和运行时间
# {'sql': 'SELECT 42;', 'db': 'mysql', 'user': 'root', 'host': '127.0.0.1', 'port': 3306, 'result': ((42,),), 'speed time': 0.00045609474182128906}

以上就是python制作探针模块的方法,希望对大家有所帮助。更多Python学习指路:python基础教程

本文教程操作环境:windows7系统、Python 3.9.1,DELL G3电脑。

关注

关注公众号,随时随地在线学习

本教程部分素材来源于网络,版权问题联系站长!

《办公室高潮秘书2》| 《家访的老师》动漫在线观看| 《艳妻互换》完整版| 秘书奶头好大下面好紧| 泡妞网站| 三女片免费观看电视剧杨贵妃传| 吃瓜群众在线爆料免费观看| 林语惊| 《熟妇的荡欲》免费看| 免费观看已满十八岁的电视剧大全| 女教师免费观看全集电视剧| REAL529| 男同| 内衣秀| 人与动物免费观看电视剧完整版| 麻花星空传剧原创MV在线| 翁虹任达华《玉尺经》| 我在公车被蹭水后当晚就来了月经 | 《再来一次好吗》免费观看| 满清十大酷刑| 小洞流口水了 是不是饿了 | 小洞流口水了 是不是饿了| 我要和你在一起电视剧免费观看| 找找色| 小妹3| 国产真实乱人偷精品视频免费| 美国禁忌6 结局| 我妈妈同意你再做一次心理咨询| 甜蜜惩罚~我是看守专用宠物| 人犬兽人在线观看免费完整一| 双乳被四个男人吃奶H文| 小妈妈2免费观看完整电视剧| 三年大片免费观看完整版高清 | 妈妈用嘴巴帮我消火怎么办| 法国急救宝贝2| 二人努力生猴子免费观看| 《妻子的肉体偿还》5| 《暴力强伦轩》电影影| 丁字裤阴唇肥大的地方叫什么| 爷爷的鸡又黑又长下一句怎么接 | 日本大片又大又好看的PPT