為了便于精準排查問題,需要将目前的請求資訊與目前執行的 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 連接配接的時候使用這個插件:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SMklzMjVTMxMWNkRTOwQDOjJDMhhjY4Y2Y0ATM5EDMl9CX3IzLcRDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLzM3Lc9CX6MHc0RHaiojIsJye.png)
這是編寫的 <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