forked from rafecolton/negroni-logrus
/
middleware.go
89 lines (79 loc) · 3.38 KB
/
middleware.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
package negronilogrus
import (
"fmt"
"github.com/Sirupsen/logrus"
"github.com/codegangsta/negroni"
"github.com/jabong/canonburst/conf"
"github.com/jabong/canonburst/log"
"net/http"
"time"
)
// Middleware is a middleware handler that logs the request as it goes in and the response as it goes out.
type Middleware struct {
// Logger is the log.Logger instance used to log messages with the Logger middleware
Logger *logrus.Logger
// Name is the name of the application as recorded in latency metrics
Name string
}
// NewMiddleware returns a new *Middleware, yay!
func NewMiddleware() *Middleware {
return NewCustomMiddleware(logrus.InfoLevel, &logrus.TextFormatter{}, "web")
}
// NewCustomMiddleware builds a *Middleware with the given level and formatter
func NewCustomMiddleware(level logrus.Level, formatter logrus.Formatter, name string) *Middleware {
log := logrus.New()
log.Level = level
log.Formatter = formatter
return &Middleware{Logger: log, Name: name}
}
func (l *Middleware) ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
start := time.Now()
config := conf.GetConfig()
if config.Env == "dev" {
l.Logger.WithFields(logrus.Fields{
"method": r.Method,
"request": r.RequestURI,
"remote": r.RemoteAddr,
"X-Jabong-Reqid": r.Header.Get("X-Jabong-Reqid"),
"X-Jabong-Tid": r.Header.Get("X-Jabong-Tid"),
}).Info("started handling request")
}
var msg string
if config.Env == "dev" {
msg = fmt.Sprintf("started handling request: method=%s remote=%s request=%s X-Jabong-Reqid=%v X-Jabong-Tid=%v", r.Method, r.RemoteAddr, r.RequestURI, r.Header.Get("X-Jabong-Reqid"), r.Header.Get("X-Jabong-Tid"))
if r.RequestURI != "/catalog/v1/healthcheck/" && r.RequestURI != "/catalog/v1/healthcheck" {
log.Info(msg)
}
}
next(rw, r)
latency := time.Since(start)
res := rw.(negroni.ResponseWriter)
if config.Env == "dev" {
l.Logger.WithFields(logrus.Fields{
"status": res.Status(),
"method": r.Method,
"request": r.RequestURI,
"remote": r.RemoteAddr,
"text_status": http.StatusText(res.Status()),
"took": latency,
fmt.Sprintf("measure#%s.latency", l.Name): latency.Nanoseconds(),
"X-Jabong-Reqid": r.Header.Get("X-Jabong-Reqid"),
"X-Jabong-Tid": r.Header.Get("X-Jabong-Tid"),
}).Info("completed handling request")
}
msg = fmt.Sprintf("completed handling request: measure#%s.latency=%d method=%s remote=%s request=%s status=%d text_status=%s took=%s X-Jabong-Reqid=%v X-Jabong-Tid=%v", l.Name, latency.Nanoseconds(), r.Method, r.RemoteAddr, r.RequestURI, res.Status(), http.StatusText(res.Status()), latency, r.Header.Get("X-Jabong-Reqid"), r.Header.Get("X-Jabong-Tid"))
if r.RequestURI == "/catalog/v1/healthcheck/" || r.RequestURI == "/catalog/v1/healthcheck" {
return
}
if res.Status() == http.StatusOK {
if latency > (time.Duration(config.LogLatencyLimit) * time.Millisecond) {
log.Alertf(msg, r.Header.Get("X-Jabong-Reqid"), r.Header.Get("X-Jabong-Tid"))
}
} else if res.Status() == http.StatusInternalServerError {
log.GetDAgent().Histogram(fmt.Sprintf("%d_requests", res.Status()), 1)
log.Errf(msg, r.Header.Get("X-Jabong-Reqid"), r.Header.Get("X-Jabong-Tid"))
} else {
log.GetDAgent().Histogram(fmt.Sprintf("%d_requests", res.Status()), 1)
log.Alertf(msg, r.Header.Get("X-Jabong-Reqid"), r.Header.Get("X-Jabong-Tid"))
}
}