48 lines
1.0 KiB
Go
48 lines
1.0 KiB
Go
package middleware
|
|
|
|
import (
|
|
"net/http"
|
|
"strconv"
|
|
"time"
|
|
|
|
"web-app-template/log"
|
|
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
"github.com/prometheus/client_golang/prometheus/promauto"
|
|
)
|
|
|
|
var (
|
|
metrics = promauto.NewCounterVec(
|
|
prometheus.CounterOpts{
|
|
Name: "mefit_request_total",
|
|
Help: "The total number of requests processed",
|
|
},
|
|
[]string{"path", "method", "status"},
|
|
)
|
|
)
|
|
|
|
type WrappedWriter struct {
|
|
http.ResponseWriter
|
|
StatusCode int
|
|
}
|
|
|
|
func (w *WrappedWriter) WriteHeader(code int) {
|
|
w.ResponseWriter.WriteHeader(code)
|
|
w.StatusCode = code
|
|
}
|
|
|
|
func Log(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
start := time.Now()
|
|
|
|
wrapped := &WrappedWriter{
|
|
ResponseWriter: w,
|
|
StatusCode: http.StatusOK,
|
|
}
|
|
next.ServeHTTP(wrapped, r)
|
|
|
|
log.Info(r.RemoteAddr + " " + strconv.Itoa(wrapped.StatusCode) + " " + r.Method + " " + r.URL.Path + " " + time.Since(start).String())
|
|
metrics.WithLabelValues(r.URL.Path, r.Method, http.StatusText(wrapped.StatusCode)).Inc()
|
|
})
|
|
}
|