diff --git a/go.mod b/go.mod index fad6006..1bb5fd9 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module git.listensoft.net/tool/lxutils go 1.19 require ( + github.com/bwmarrin/snowflake v0.3.0 // indirect github.com/bytedance/sonic v1.9.1 // indirect github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect @@ -23,9 +24,13 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/natefinch/lumberjack v2.0.0+incompatible // indirect + github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/uber/jaeger-client-go v2.30.0+incompatible // indirect + github.com/uber/jaeger-lib v2.4.1+incompatible // indirect github.com/ugorji/go/codec v1.2.11 // indirect + go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.10.0 // indirect go.uber.org/zap v1.26.0 // indirect golang.org/x/arch v0.3.0 // indirect diff --git a/go.sum b/go.sum index 30be144..d080db6 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0= +github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= github.com/bytedance/sonic v1.9.1 h1:6iJ6NqdoxCDr6mbY8h18oSO+cShGSMRGCEo7F2h0x8s= github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U= @@ -47,6 +49,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM= github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -62,8 +66,14 @@ github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= +github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= +github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= diff --git a/lxDb/db.go b/lxDb/db.go index d520a70..36d513d 100644 --- a/lxDb/db.go +++ b/lxDb/db.go @@ -1,8 +1,10 @@ package lxDb import ( + "context" "fmt" "git.listensoft.net/tool/lxutils/lxzap" + "github.com/gin-gonic/gin" "go.uber.org/zap" "gorm.io/driver/mysql" "gorm.io/gorm" @@ -22,6 +24,13 @@ type DbConfig struct { Charset string } +func GetDB(c *gin.Context) *gorm.DB { + v, _ := c.Get("X-Span-ID") + spanId := fmt.Sprintf("%v", v) + ctx := context.WithValue(context.Background(), "X-Span-ID", spanId) + return DB.WithContext(ctx) +} + func InitDB(env string, conf DbConfig) { //dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local" //newLogger := logger.New( diff --git a/lxzap/lxzap.go b/lxzap/lxzap.go index ffee29d..e27dd79 100644 --- a/lxzap/lxzap.go +++ b/lxzap/lxzap.go @@ -6,6 +6,7 @@ import ( "net/http/httputil" "os" "runtime/debug" + "strconv" "strings" "time" @@ -73,11 +74,12 @@ func GinLogger() gin.HandlerFunc { start := time.Now() path := c.Request.URL.Path query := c.Request.URL.RawQuery - c.Next() - + spanID := NewUUID() + c.Set("X-Span-ID", spanID) cost := time.Since(start) Lg.Info(path, zap.Int("status", c.Writer.Status()), + zap.String("spanId", strconv.Itoa(int(spanID))), zap.String("method", c.Request.Method), zap.String("path", path), zap.String("query", query), @@ -86,6 +88,7 @@ func GinLogger() gin.HandlerFunc { zap.String("errors", c.Errors.ByType(gin.ErrorTypePrivate).String()), zap.Duration("cost", cost), ) + c.Next() } } diff --git a/lxzap/snowflake.go b/lxzap/snowflake.go new file mode 100644 index 0000000..e280ee9 --- /dev/null +++ b/lxzap/snowflake.go @@ -0,0 +1,26 @@ +package lxzap + +import ( + "fmt" + "github.com/bwmarrin/snowflake" +) + +var node *snowflake.Node + +func initSnow() { + var err error + node, err = snowflake.NewNode(1) + if err != nil { + panic(err.Error()) + return + } + fmt.Println("雪花算法初始化成功") +} +func NewUUID() (id uint) { + id = uint(node.Generate().Int64()) + return +} + +func init() { + initSnow() +} diff --git a/lxzap/zapGorm2.go b/lxzap/zapGorm2.go index 91ea44c..46b6c28 100644 --- a/lxzap/zapGorm2.go +++ b/lxzap/zapGorm2.go @@ -67,6 +67,7 @@ func (l Logger) Error(ctx context.Context, str string, args ...interface{}) { } func (l Logger) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) { + spanId := ctx.Value("X-Span-ID") if l.LogLevel <= 0 { return } @@ -74,13 +75,13 @@ func (l Logger) Trace(ctx context.Context, begin time.Time, fc func() (string, i switch { case err != nil && l.LogLevel >= gormlogger.Error && (!l.IgnoreRecordNotFoundError || !errors.Is(err, gorm.ErrRecordNotFound)): sql, rows := fc() - l.logger().Error("trace", zap.Error(err), zap.Duration("elapsed", elapsed), zap.Int64("rows", rows), zap.String("sql", sql)) + l.logger().Error("trace", zap.Any("spanId", spanId), zap.Error(err), zap.Duration("elapsed", elapsed), zap.Int64("rows", rows), zap.String("sql", sql)) case l.SlowThreshold != 0 && elapsed > l.SlowThreshold && l.LogLevel >= gormlogger.Warn: sql, rows := fc() - l.logger().Warn("trace", zap.Duration("elapsed", elapsed), zap.Int64("rows", rows), zap.String("sql", sql)) + l.logger().Warn("trace", zap.Any("spanId", spanId), zap.Duration("elapsed", elapsed), zap.Int64("rows", rows), zap.String("sql", sql)) case l.LogLevel >= gormlogger.Info: sql, rows := fc() - l.logger().Info("trace", zap.Duration("elapsed", elapsed), zap.Int64("rows", rows), zap.String("sql", sql)) + l.logger().Info("trace", zap.Any("spanId", spanId), zap.Duration("elapsed", elapsed), zap.Int64("rows", rows), zap.String("sql", sql)) } }