github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/metric/http.go (about)

     1  package metric
     2  
     3  import (
     4  	"net/http"
     5  
     6  	"code.cloudfoundry.org/lager"
     7  	"github.com/felixge/httpsnoop"
     8  )
     9  
    10  type MetricsHandler struct {
    11  	Logger  lager.Logger
    12  	Route   string
    13  	Handler http.Handler
    14  	Monitor *Monitor
    15  }
    16  
    17  func WrapHandler(
    18  	logger lager.Logger,
    19  	monitor *Monitor,
    20  	route string,
    21  	handler http.Handler,
    22  ) http.Handler {
    23  	return MetricsHandler{
    24  		Logger:  logger,
    25  		Monitor: monitor,
    26  		Route:   route,
    27  		Handler: handler,
    28  	}
    29  }
    30  
    31  func (handler MetricsHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    32  	metrics := httpsnoop.CaptureMetrics(handler.Handler, w, r)
    33  
    34  	HTTPResponseTime{
    35  		Route:      handler.Route,
    36  		Path:       r.URL.Path,
    37  		Method:     r.Method,
    38  		StatusCode: metrics.Code,
    39  		Duration:   metrics.Duration,
    40  	}.Emit(handler.Logger, handler.Monitor)
    41  }