design sketch
SQL The trace of is correctly inserted between the call chains of microservices

Detailed records of SQL Execution content and time consumption

Search for SQL The type of

Multithreading (goroutine) Tracking effect under

stay Kubernetes After the wechat service in Central China , adopt Istio Control the traffic between microservices ,Istio By default, trace will be generated for the calling relationship between microservices , Put it into the tracking collector . But he does not support more detailed SQL operation , For example, what has been implemented SQL, Every one of them SQL How long does it take . So , I wrote a simple support gorm Query and generate tracking plug-ins :istio-gorm-tracing
Microservice tracking gorm plug-in unit
stay kubernetes Upper use Istio After controlling the micro service , Calls between microservices will be automatically uploaded to Jaeger The collector of . But it can only be traced to the service layer , This is something I can't accept , I hope to further track all of the services MySQL Inquire about , Record each sql Time consuming , therefore , I simply wrote this plug-in .
characteristic
Support Istio
stay Istio Between container requests under control , It'll carry it automatically x-b3-traceid、x-b3-parentspanid、x-b3-spanid、x-b3-sampled Equal request header , These request headers are all related to zipkin The alignment of the . According to the request header information passed in, this plug-in , Auto resolve parent span, And bind the calling relationship between the upper and lower Services .
Record SQL Information
Each query will record the execution SQL Statement and execution time , As the basis for later microservice tracking .
Use
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:%[email protected](%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 There's a problem with the connection :", err.Error())
} else {
log.Println("mysql Successful connection :", dsn)
}
// This step is crucial , We must add , To enable our plug-in
gormDb.Use(istiogormtracing.NewDefault(
// Your microservice name
"istiogormtracing-service",
// Yours Jaeger Collector address
"http://127.0.0.1:14268/api/traces",
))
router.GET("/", func(c *gin.Context) {
// This step is crucial , We must add , in order to SQL It can be related to upstream and downstream Services
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")
}
Then you can Jaeger We can see what we recorded in the panel SQL 了 .








