@@ -16,10 +16,16 @@ limitations under the License.
1616package mock
1717
1818import (
19+ "encoding/json"
1920 "net/http"
2021 "sync"
22+ "time"
23+
24+ "github.com/gorilla/mux"
2125)
2226
27+ var _ RequestMetrics = & NoopMetrics {}
28+
2329// NoopMetrics implements RequestMetrics but does nothing
2430type NoopMetrics struct {}
2531
@@ -32,56 +38,69 @@ func NewNoopMetrics() *NoopMetrics {
3238func (m * NoopMetrics ) RecordRequest (path string ) {}
3339
3440// GetMetrics implements RequestMetrics but returns empty map
35- func (m * NoopMetrics ) GetMetrics () map [ string ] int {
36- return make ( map [ string ] int )
41+ func (m * NoopMetrics ) GetMetrics () MetricData {
42+ return MetricData {}
3743}
3844
3945// AddMetricsHandler implements RequestMetrics but does nothing
40- func (m * NoopMetrics ) AddMetricsHandler (mux * http.ServeMux , prefix string ) {}
46+ func (m * NoopMetrics ) AddMetricsHandler (mux MetricsHandler ) {}
47+
48+ type MetricsHandler interface {
49+ HandleFunc (path string , f func (http.ResponseWriter , * http.Request )) * mux.Route
50+ }
51+
52+ type MetricData struct {
53+ FirstRequestTime time.Time
54+ LastRequestTime time.Time
55+ Requests map [string ]int
56+ }
4157
4258// RequestMetrics represents an interface for collecting request metrics
4359type RequestMetrics interface {
4460 RecordRequest (path string )
45- GetMetrics () map [ string ] int
46- AddMetricsHandler (mux * http. ServeMux , prefix string )
61+ GetMetrics () MetricData
62+ AddMetricsHandler (MetricsHandler )
4763}
4864
65+ var _ RequestMetrics = & InMemoryMetrics {}
66+
4967// InMemoryMetrics implements RequestMetrics with in-memory storage
5068type InMemoryMetrics struct {
51- requests map [ string ] int
52- mu sync.RWMutex
69+ MetricData
70+ mu sync.RWMutex
5371}
5472
5573// NewInMemoryMetrics creates a new InMemoryMetrics instance
5674func NewInMemoryMetrics () * InMemoryMetrics {
5775 return & InMemoryMetrics {
58- requests : make (map [string ]int ),
76+ MetricData : MetricData {
77+ Requests : make (map [string ]int ),
78+ },
5979 }
6080}
6181
6282// RecordRequest records a request for the given path
6383func (m * InMemoryMetrics ) RecordRequest (path string ) {
6484 m .mu .Lock ()
6585 defer m .mu .Unlock ()
66- m .requests [path ]++
86+ m .Requests [path ]++
87+ if m .FirstRequestTime .IsZero () {
88+ m .FirstRequestTime = time .Now ()
89+ }
90+ m .LastRequestTime = time .Now ()
6791}
6892
6993// GetMetrics returns a copy of the current metrics
70- func (m * InMemoryMetrics ) GetMetrics () map [ string ] int {
94+ func (m * InMemoryMetrics ) GetMetrics () MetricData {
7195 m .mu .RLock ()
7296 defer m .mu .RUnlock ()
73-
74- // Return a copy to avoid map races
75- result := make (map [string ]int )
76- for k , v := range m .requests {
77- result [k ] = v
78- }
79- return result
97+ return m .MetricData
8098}
8199
82- func (m * InMemoryMetrics ) AddMetricsHandler (mux * http. ServeMux , prefix string ) {
100+ func (m * InMemoryMetrics ) AddMetricsHandler (mux MetricsHandler ) {
83101 // Add metrics endpoint
84- mux .HandleFunc (prefix + "/metrics" , func (w http.ResponseWriter , r * http.Request ) {
85- // metrics handling code
102+ mux .HandleFunc ("/metrics" , func (w http.ResponseWriter , r * http.Request ) {
103+ metrics := m .GetMetrics ()
104+ _ = json .NewEncoder (w ).Encode (metrics )
86105 })
87106}
0 commit comments