31 lines
580 B
Go
31 lines
580 B
Go
package trace
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"gitea.loveuer.com/yizhisec/packages/opt"
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/google/uuid"
|
|
"time"
|
|
)
|
|
|
|
func New() gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
trace := c.GetHeader(opt.TraceKey)
|
|
if trace == "" {
|
|
if u, err := uuid.NewV7(); err == nil {
|
|
trace = u.String()
|
|
} else {
|
|
trace = fmt.Sprintf("%d", time.Now().UnixNano())
|
|
}
|
|
}
|
|
|
|
ctx := context.WithValue(c.Request.Context(), opt.TraceKey, trace)
|
|
c.Request = c.Request.WithContext(ctx)
|
|
|
|
c.Writer.Header().Set(opt.TraceKey, trace)
|
|
|
|
c.Next()
|
|
}
|
|
}
|