您好,登錄后才能下訂單哦!
這篇文章主要介紹python怎么制作探針模塊,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
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怎么制作探針模塊”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。