/
req_tracer.go
90 lines (74 loc) · 2.04 KB
/
req_tracer.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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package tracing
import (
"net/http"
"time"
"github.com/opentracing/opentracing-go"
"github.com/sirupsen/logrus"
)
type RequestTracer struct {
*trackingWriter
logrus.FieldLogger
RequestID string
FinalFields map[string]interface{}
remoteAddr string
method string
originalURL string
referrer string
span opentracing.Span
start time.Time
}
// NewTracer creates a new tracer
func NewTracer(w http.ResponseWriter, r *http.Request, log logrus.FieldLogger, service string) (http.ResponseWriter, *http.Request, *RequestTracer) {
reqID := RequestID(r)
log = requestLogger(r, log)
r, span := WrapWithSpan(r, reqID, service)
trackWriter := &trackingWriter{
writer: w,
log: log,
}
rt := &RequestTracer{
originalURL: r.URL.String(),
method: r.Method,
referrer: r.Referer(),
remoteAddr: r.RemoteAddr,
RequestID: reqID,
span: span,
trackingWriter: trackWriter,
FieldLogger: log,
FinalFields: make(map[string]interface{}),
}
r = WrapWithTracer(r, rt)
return rt, r, rt
}
func (rt *RequestTracer) Start() {
rt.start = time.Now()
rt.WithFields(logrus.Fields{
"method": rt.method,
"remote_addr": rt.remoteAddr,
"referer": rt.referrer,
"url": rt.originalURL,
}).Info("Starting Request")
}
func (rt *RequestTracer) Finish() {
dur := time.Since(rt.start)
fields := logrus.Fields{}
for k, v := range rt.FinalFields {
fields[k] = v
}
fields["status_code"] = rt.trackingWriter.status
fields["rsp_bytes"] = rt.trackingWriter.rspBytes
fields["url"] = rt.originalURL
fields["method"] = rt.method
fields["dur"] = dur.String()
fields["dur_ns"] = dur.Nanoseconds()
rt.span.Finish()
rt.WithFields(fields).Info("Completed Request")
}
func (rt *RequestTracer) SetLogField(key string, value interface{}) logrus.FieldLogger {
rt.FieldLogger = rt.FieldLogger.WithField(key, value)
return rt.FieldLogger
}
func (rt *RequestTracer) SetLogFields(fields logrus.Fields) logrus.FieldLogger {
rt.FieldLogger = rt.FieldLogger.WithFields(fields)
return rt.FieldLogger
}