python探針模塊怎么制作

這篇文章主要介紹了python探針模塊怎么制作的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇python探針模塊怎么制作文章都會有所收獲,下面我們一起來看看吧。

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網綜合服務,包含不限于成都做網站、網站建設、雞西網絡推廣、成都小程序開發(fā)、雞西網絡營銷、雞西企業(yè)策劃、雞西品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學生創(chuàng)業(yè)者提供雞西建站搭建服務,24小時服務熱線:18982081108,官方網址:muchs.cn

1、涉及aioMySQL模塊,在MetaPathFinder.find_module中只需要處理aiomysql模塊。

其他先忽略,然后確定需要替換aiomysql的功能。從業(yè)務上來說,一般我們只需要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把數據發(fā)送到指定的平臺, 然后我們就可以在平臺上看到對應的數據或進行監(jiān)控了,
        # 這里只是打印一部分數據出來
        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等參數也是, 還能知道執(zhí)行的結果和運行時間
# {'sql': 'SELECT 42;', 'db': 'mysql', 'user': 'root', 'host': '127.0.0.1', 'port': 3306, 'result': ((42,),), 'speed time': 0.00045609474182128906}

關于“python探針模塊怎么制作”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“python探針模塊怎么制作”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當前標題:python探針模塊怎么制作
本文網址:http://muchs.cn/article28/ghgjjp.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站導航、網站建設、App開發(fā)手機網站建設、面包屑導航

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)