/
trace.go
67 lines (61 loc) · 1.65 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
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
package trace
import (
"bytes"
"io"
"io/ioutil"
"net/http"
"net/http/httputil"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"github.com/opentracing/opentracing-go"
"github.com/uber/jaeger-client-go"
"github.com/uber/jaeger-client-go/transport"
)
type Tracer struct {
ServiceName string
Trace opentracing.Tracer
closer io.Closer
}
func NewTracer(c *Config) (trace *Tracer) {
ht := transport.NewHTTPTransport(c.Endpoint)
tracer, closer := jaeger.NewTracer(
c.ServiceName,
jaeger.NewConstSampler(true),
jaeger.NewRemoteReporter(ht),
c.TraceOpts...,
)
trace = &Tracer{
ServiceName: c.ServiceName,
Trace: tracer,
closer: closer,
}
return
}
func (t *Tracer) GinTrace() gin.HandlerFunc {
return func(c *gin.Context) {
// span
spanCtx, _ := t.Trace.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(c.Request.Header))
span := t.Trace.StartSpan(c.FullPath(), opentracing.ChildOf(spanCtx))
defer span.Finish()
traceId := uuid.New().String()
span.SetTag(TagTraceId, traceId)
span.SetTag(TagComponent, "net/http")
span.SetTag(TagHTTPMethod, c.Request.Method)
span.SetTag(TagHTTPURL, c.Request.URL.String())
rawReq, _ := httputil.DumpRequest(c.Request, false)
span.SetTag(TagHTTPRaw, string(rawReq))
switch c.Request.Method {
case http.MethodPost, http.MethodDelete, http.MethodPatch, http.MethodPut:
bs, _ := ioutil.ReadAll(c.Request.Body)
c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(bs))
span.SetTag(TagHTTPBody, string(bs))
default:
}
// export trace id to user.
c.Writer.Header().Set(TagTraceId, traceId)
c.Next()
}
}
func (t *Tracer) Close() {
t.closer.Close()
}