package middleware import ( "net/http" "strconv" "time" "spend-sparrow/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.StatusCode = code w.ResponseWriter.WriteHeader(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() }) }