-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgin.go
More file actions
68 lines (57 loc) · 1.99 KB
/
gin.go
File metadata and controls
68 lines (57 loc) · 1.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package dgotel
import (
"github.com/darwinOrg/go-common/constants"
"github.com/darwinOrg/go-web/utils"
"github.com/darwinOrg/go-web/wrapper"
"github.com/gin-gonic/gin"
"go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin"
"go.opentelemetry.io/otel/trace"
)
func DefaultGinEngine() *gin.Engine {
var middlewares []gin.HandlerFunc
middlewares = append(middlewares, TraceIdHandler())
middlewares = append(middlewares, wrapper.DefaultMiddlewares...)
return wrapper.NewEngine(middlewares...)
}
func TraceIdHandler() gin.HandlerFunc {
return func(c *gin.Context) {
spanContext := trace.SpanContextFromContext(c.Request.Context())
hasParentSpan := spanContext.IsValid() && spanContext.HasTraceID()
if !hasParentSpan {
traceId := utils.GetOrGenerateTraceId(c)
traceIDFromHex, err := trace.TraceIDFromHex(traceId)
if err == nil {
// 构建新的 span context 配置
config := trace.SpanContextConfig{
TraceID: traceIDFromHex,
}
// 如果原 span context 有效,继承其他属性
if spanContext.IsValid() {
config.SpanID = spanContext.SpanID()
config.TraceFlags = spanContext.TraceFlags()
config.TraceState = spanContext.TraceState()
config.Remote = spanContext.IsRemote()
}
// 创建新的 span context
newSpanContext := trace.NewSpanContext(config)
// 将新的 span context 注入到请求上下文中
ctxWithTraceID := trace.ContextWithSpanContext(c.Request.Context(), newSpanContext)
c.Request = c.Request.WithContext(ctxWithTraceID)
// 设置响应头
c.Header(constants.TraceId, traceIDFromHex.String())
}
} else {
// 如果已有有效的 trace ID,直接使用
c.Header(constants.TraceId, spanContext.TraceID().String())
}
c.Next()
}
}
func TracerHandler() gin.HandlerFunc {
if tracerServiceName == "" {
tracerServiceName = "gin-server"
}
return otelgin.Middleware(tracerServiceName, otelgin.WithSpanNameFormatter(func(c *gin.Context) string {
return c.Request.URL.Path
}))
}