diff --git a/api/server.go b/api/server.go index 5bb785c9..37d1a5e0 100644 --- a/api/server.go +++ b/api/server.go @@ -248,6 +248,7 @@ func (h *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { } requestBody := make(map[string]any) + requestMethod := "" if b, err := io.ReadAll(r.Body); err == nil { _ = json.Unmarshal(b, &requestBody) @@ -255,6 +256,7 @@ func (h *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // JSON-RPC methods. if methodValue, ok := requestBody["method"]; ok { if methodStr, ok := methodValue.(string); ok && eth.IsValidMethod(methodStr) { + requestMethod = methodStr h.logger.Debug(). Str("IP", r.RemoteAddr). Str("url", r.URL.String()). @@ -284,13 +286,16 @@ func (h *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { return } - if h.httpHandler != nil { - if checkPath(r, "") { - metrics. - NewMetricsHandler(h.httpHandler, h.collector, h.logger). - ServeHTTP(logW, r) - return + if h.httpHandler != nil && checkPath(r, "") { + start := time.Now() + + h.httpHandler.ServeHTTP(logW, r) + + if eth.IsValidMethod(requestMethod) { + h.collector.MeasureRequestDuration(start, requestMethod) } + + return } w.WriteHeader(http.StatusNotFound) diff --git a/metrics/handler.go b/metrics/handler.go deleted file mode 100644 index 55ab1c70..00000000 --- a/metrics/handler.go +++ /dev/null @@ -1,68 +0,0 @@ -package metrics - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" - "time" - - "github.com/rs/zerolog" - - "github.com/onflow/flow-evm-gateway/eth" -) - -// HttpHandler is a thin middleware for gathering metrics about http request. -// It makes no decision about error handling. If one occurred, we log it and -// pass request on to the underlying handler to make a decision -type HttpHandler struct { - handler http.Handler - collector Collector - logger zerolog.Logger -} - -func NewMetricsHandler(handler http.Handler, collector Collector, log zerolog.Logger) *HttpHandler { - return &HttpHandler{ - handler: handler, - collector: collector, - logger: log, - } -} - -func (h *HttpHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { - var start time.Time - - method, err := extractMethod(r, h.logger) - if err != nil { - h.logger.Debug().Err(err).Msg("error extracting method") - } else if eth.IsValidMethod(method) { - start = time.Now() - defer h.collector.MeasureRequestDuration(start, method) - } - - h.handler.ServeHTTP(w, r) -} - -func extractMethod(r *http.Request, logger zerolog.Logger) (string, error) { - defer func() { - if rec := recover(); rec != nil { - logger.Error().Msgf("failed to extract method: %v", r) - } - }() - - body, err := io.ReadAll(r.Body) - if err != nil { - return "", fmt.Errorf("error reading request body: %w", err) - } - r.Body = io.NopCloser(bytes.NewBuffer(body)) - - var requestBody struct { - Method string `json:"method"` - } - if err := json.Unmarshal(body, &requestBody); err != nil { - return "", fmt.Errorf("error extracting method from body: %w", err) - } - - return requestBody.Method, nil -}