diff --git a/estransport/estransport_internal_test.go b/estransport/estransport_internal_test.go index 9f8778d677..d0971a5152 100644 --- a/estransport/estransport_internal_test.go +++ b/estransport/estransport_internal_test.go @@ -1109,3 +1109,37 @@ func TestRequestCompression(t *testing.T) { }) } } + +func TestTransportPerformAndReadMetricsResponses(t *testing.T) { + t.Run("Read Metrics.Responses", func(t *testing.T) { + u, _ := url.Parse("https://foo.com/bar") + tp, _ := New(Config{ + EnableMetrics: true, + URLs: []*url.URL{u}, + Transport: &mockTransp{ + RoundTripFunc: func(req *http.Request) (*http.Response, error) { return &http.Response{Status: "MOCK"}, nil }, + }}) + + ch := make(chan struct{}) + go func() { + for { + select { + case <-ch: + break + default: + metrics, _ := tp.Metrics() + for range metrics.Responses { + } + } + } + }() + + for i := 0; i < 100000; i++ { + req, _ := http.NewRequest("GET", "/abc", nil) + _, _ = tp.Perform(req) + } + + ch <- struct{}{} + close(ch) + }) +} diff --git a/estransport/metrics.go b/estransport/metrics.go index 591c262543..a25b1a6db1 100644 --- a/estransport/metrics.go +++ b/estransport/metrics.go @@ -92,7 +92,11 @@ func (c *Client) Metrics() (Metrics, error) { m := Metrics{ Requests: c.metrics.requests, Failures: c.metrics.failures, - Responses: c.metrics.responses, + Responses: make(map[int]int, len(c.metrics.responses)), + } + + for code, num := range c.metrics.responses { + m.Responses[code] = num } if pool, ok := c.pool.(connectionable); ok {