天天看點

Go - 基于 GORM 擷取目前請求所執行的 SQL 資訊

為了便于精準排查問題,需要将目前的請求資訊與目前執行的 SQL 資訊設定對應關系記錄下來,記錄的 SQL 資訊包括:

執行 SQL 的目前時間;

執行 SQL 的檔案位址和行号;

執行 SQL 的花費時長;

執行 SQL 的影響行數;

執行的 SQL 語句;

資料庫元件使用的是 <code>GORM</code>。

1、在執行 SQL 前,設定開始執行時間(計算執行時長會用到);

2、在執行 SQL 後,第一,擷取目前請求的上下文,為什麼擷取上下文,因為需要從上下文中擷取本次請求資訊,第二,擷取 SQL 執行前的時間,用來計算執行時長,第三,擷取執行的 SQL 資訊,然後将資料設定到 <code>Trace</code> 中,<code>Trace</code> 是項目中鍊路包,後面文章會對其介紹;

上面需要用到 <code>GORM</code> 兩個 知識點  <code>Callbacks</code> 和 <code>Context</code>,這兩個是在 <code>GORM V2</code> 才有的,需要 import 的包為 <code>gorm.io/gorm</code>。

<code>Context</code> 的傳遞需要使用 <code>GORM V2</code> 提供的 <code>WithContext()</code> 方法。

編寫 <code>CallBacks</code> 插件代碼,GORM 的 Plugin 接口的編寫非常簡單,隻需要實作兩個方法即可。

下面是我寫的插件代碼:

最後,在 db 連接配接的時候使用這個插件:

Go - 基于 GORM 擷取目前請求所執行的 SQL 資訊

這是編寫的 <code>trace</code> 包的一部分,這個包可以記錄這些資訊(JSON 格式):

支援設定 trace_id

支援設定 request 資訊

支援設定 response 資訊

支援設定 third_party_requests 三方請求資訊

支援設定 debugs 列印調試資訊

支援設定 sqls 執行 SQL 資訊

可記錄 cost_seconds 執行時長

以上代碼在 go-gin-api 項目中,位址:

github.com/xinliangnote/go-gin-api

Go - 基于 GORM 擷取目前請求所執行的 SQL 資訊
sql