69 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Package define ...
 | |
| //
 | |
| // Description : define ...
 | |
| //
 | |
| // Author : go_developer@163.com<白茶清欢>
 | |
| //
 | |
| // Date : 2025-04-12 20:57
 | |
| package define
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"strings"
 | |
| 	"time"
 | |
| 
 | |
| 	networkUtil "git.zhangdeman.cn/zhangdeman/network/util"
 | |
| 	"git.zhangdeman.cn/zhangdeman/wrapper/op_string"
 | |
| 
 | |
| 	"git.zhangdeman.cn/zhangdeman/trace"
 | |
| 	"github.com/gin-gonic/gin"
 | |
| )
 | |
| 
 | |
| type Context struct {
 | |
| 	Context     *gin.Context   // 继承 gin context
 | |
| 	Trace       *trace.Runtime // trace 实例
 | |
| 	TraceID     string
 | |
| 	RequestID   string
 | |
| 	RequestTime time.Time
 | |
| }
 | |
| 
 | |
| // NewContext 创建context
 | |
| func NewContext(ginCtx *gin.Context) *Context {
 | |
| 	existCtx, exist := ginCtx.Get(CustomContextKey)
 | |
| 	if exist && existCtx != nil {
 | |
| 		if c, ok := existCtx.(*Context); ok {
 | |
| 			return c
 | |
| 		}
 | |
| 	}
 | |
| 	traceID := fmt.Sprintf(
 | |
| 		"%v-%v-%v-%v",
 | |
| 		time.Now().UnixNano()/1e6,
 | |
| 		strings.ReplaceAll(networkUtil.IP.GetHostIP(), ".", ""),
 | |
| 		strings.ReplaceAll(networkUtil.IP.GetRemoteIP(ginCtx.Request), ".", ""),
 | |
| 		op_string.Md5(op_string.Random(32, "")),
 | |
| 	)
 | |
| 	getRequestID := func(ctx *gin.Context, traceID string) string {
 | |
| 		requestID := ctx.GetHeader("X-Forward-Request-Id")
 | |
| 		if len(requestID) > 0 {
 | |
| 			return requestID
 | |
| 		}
 | |
| 		if len(traceID) > 0 {
 | |
| 			return traceID
 | |
| 		}
 | |
| 		return traceID
 | |
| 	}
 | |
| 	ctx := &Context{
 | |
| 		Context:     ginCtx,
 | |
| 		Trace:       trace.NewRuntime(traceID, 1),
 | |
| 		TraceID:     traceID,
 | |
| 		RequestID:   getRequestID(ginCtx, traceID),
 | |
| 		RequestTime: time.Now(),
 | |
| 	}
 | |
| 	httpHandleConfig := GetHttpHandleConfig()
 | |
| 	ginCtx.Set(CustomContextKey, ctx)
 | |
| 	ginCtx.Set(httpHandleConfig.TraceIDField, traceID)
 | |
| 	ginCtx.Set(httpHandleConfig.RequestIDField, ctx.RequestID)
 | |
| 	ginCtx.Set(httpHandleConfig.StartRequestTimeField, ctx.RequestTime.UnixMilli())
 | |
| 	return ctx
 | |
| }
 |