SQL的追蹤正確插入到微服務(wù)的調(diào)用鏈之間
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專(zhuān)注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、微信小程序定制開(kāi)發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶(hù)創(chuàng)新互聯(lián)還提供了新樂(lè)免費(fèi)建站歡迎大家使用!
詳細(xì)記錄了SQL的執(zhí)行內(nèi)容和消耗時(shí)間
搜索SQL的類(lèi)型
多線(xiàn)程(goroutine)下的追蹤效果
在 Kubernetes 中部署微服務(wù)后,通過(guò) Istio 管控微服務(wù)之間的流量,Istio 默認(rèn)會(huì)將微服務(wù)之間的調(diào)用關(guān)系生成追蹤,放入追蹤收集器。但他不支持更細(xì)化的SQL操作,比如執(zhí)行了哪些SQL,每條SQL消耗多長(zhǎng)時(shí)間。為此,我寫(xiě)了一個(gè)簡(jiǎn)單的支持gorm
查詢(xún)并生成追蹤的插件:istio-gorm-tracing
在kubernetes
上使用Istio
管控微服務(wù)后,微服務(wù)之間的調(diào)用會(huì)自動(dòng)上傳到Jaeger
的收集器。但只能追蹤到服務(wù)層,這是我不能接受的,我希望能進(jìn)一步追蹤到服務(wù)中的所有MySQL
查詢(xún),記錄每個(gè) sql 的耗時(shí),所以,我簡(jiǎn)單寫(xiě)了這個(gè)插件。
Istio
在Istio
管控下的容器請(qǐng)求之間,會(huì)自動(dòng)攜帶x-b3-traceid
、x-b3-parentspanid
、x-b3-spanid
、x-b3-sampled
等請(qǐng)求頭,這些請(qǐng)求頭都是與zipkin
對(duì)齊的。此插件中會(huì)根據(jù)傳遞進(jìn)來(lái)的請(qǐng)求頭信息,自動(dòng)解析出父span
,并綁定上下服務(wù)之間的調(diào)用關(guān)系。
每次查詢(xún)都會(huì)記錄下執(zhí)行的SQL語(yǔ)句以及執(zhí)行耗時(shí)等信息,作為后期微服務(wù)追蹤的依據(jù)。
package main
import (
istiogormtracing "github.com/liamhao/istio-gorm-tracing"
"log"
"fmt"
"github.com/gin-gonic/gin"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
router := gin.Default()
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", "dbuser", "dbpswd", "dbhost", 3306, "dbname")
gormDb, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Println("mysql連接出現(xiàn)了問(wèn)題:", err.Error())
} else {
log.Println("mysql連接成功:", dsn)
}
// 這一步很關(guān)鍵,一定要加上,為了啟用我們的插件
gormDb.Use(istiogormtracing.NewDefault(
// 你的微服務(wù)名稱(chēng)
"istiogormtracing-service",
// 你的 Jaeger 收集器地址
"http://127.0.0.1:/api/traces",
))
router.GET("/", func(c *gin.Context) {
// 這一步很關(guān)鍵,一定要加上,為了SQL能與上下游服務(wù)做關(guān)聯(lián)
istiogormtracing.H = c.Request.Header
list := []map[string]interface{}{}
gormDb.Table("users").Where("name = 'xiaoming'").Find(&list)
c.JSON(http.StatusOK, map[string]interface{}{
"istiogormtracing": "ok",
})
})
router.Run(":7000")
}
然后即可在Jaeger
面板中看到我們記錄的SQL了。