/
trace.go
40 lines (32 loc) 路 1.04 KB
/
trace.go
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
package middleware
import (
"github.com/gin-gonic/gin"
"github.com/opentracing/opentracing-go"
"github.com/opentracing/opentracing-go/ext"
)
const (
// DefaultServiceName service name
DefaultServiceName = "snake"
)
func Trace() gin.HandlerFunc {
return func(c *gin.Context) {
tracer := opentracing.GlobalTracer()
var sp opentracing.Span
carrier := opentracing.HTTPHeadersCarrier(c.Request.Header)
ctx, _ := tracer.Extract(opentracing.HTTPHeaders, carrier)
sp = tracer.StartSpan(c.Request.URL.Path, ext.RPCServerOption(ctx))
// or use under statement
// sp = tracing.StartSpanFromRequest(c.Request.URL.Path, tracer, c.Request)
defer sp.Finish()
// record HTTP method
ext.HTTPMethod.Set(sp, c.Request.Method)
// record HTTP url
ext.HTTPUrl.Set(sp, c.Request.URL.String())
// record component name
// ext.Component.Set(sp, componentName)
c.Request = c.Request.WithContext(opentracing.ContextWithSpan(c.Request.Context(), sp))
c.Next()
// record HTTP status code
ext.HTTPStatusCode.Set(sp, uint16(c.Writer.Status()))
}
}