@@ -2,6 +2,7 @@ package meters
22
33import (
44 "net/http"
5+ "time"
56
67 "github.com/interline-io/log"
78 "github.com/interline-io/transitland-lib/server/auth/authn"
@@ -46,13 +47,17 @@ func WithMeter(apiMeter MeterProvider, meterName string, meterValue float64, dim
4647 return
4748 }
4849 // Call next handler
50+ start := time .Now ()
4951 next .ServeHTTP (wr , r )
52+ duration := time .Since (start )
5053
5154 // Create a new MeterEvent with the current time in UTC
5255 event := NewMeterEvent (meterName , meterValue , dims )
5356 event .RequestID = log .GetReqID (r .Context ())
5457 event .StatusCode = wr .statusCode
5558 event .Success = wr .statusCode < 400
59+ event .Duration = duration
60+ event .ResponseSize = wr .responseSize
5661 // Fetch meterer again from context
5762 if err := ForContext (ctx ).Meter (ctx , event ); err != nil {
5863 meterLog .Error ().Err (err ).Msg ("failed to meter event" )
@@ -62,11 +67,18 @@ func WithMeter(apiMeter MeterProvider, meterName string, meterValue float64, dim
6267}
6368
6469type responseWriterWrapper struct {
65- statusCode int
70+ statusCode int
71+ responseSize int64
6672 http.ResponseWriter
6773}
6874
6975func (w * responseWriterWrapper ) WriteHeader (statusCode int ) {
7076 w .statusCode = statusCode
7177 w .ResponseWriter .WriteHeader (statusCode )
7278}
79+
80+ func (w * responseWriterWrapper ) Write (b []byte ) (int , error ) {
81+ n , err := w .ResponseWriter .Write (b )
82+ w .responseSize += int64 (n )
83+ return n , err
84+ }
0 commit comments