diff options
author | Martin Polden <mpolden@mpolden.no> | 2023-04-05 12:26:48 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2023-04-11 10:27:09 +0200 |
commit | ffc9c7e4f350f58a70f46844f04cb1007f83cafc (patch) | |
tree | 5f96ef063037b88e2039fc464138a8636faf9b1d | |
parent | 071da64bb540ded7f56b83cf68419d885184079b (diff) |
Simplify stats collecting
-rw-r--r-- | client/go/internal/vespa/document/feeder.go | 2 | ||||
-rw-r--r-- | client/go/internal/vespa/document/http.go | 47 | ||||
-rw-r--r-- | client/go/internal/vespa/document/http_test.go | 28 |
3 files changed, 47 insertions, 30 deletions
diff --git a/client/go/internal/vespa/document/feeder.go b/client/go/internal/vespa/document/feeder.go index 4ff612067b7..9e6768d0eb4 100644 --- a/client/go/internal/vespa/document/feeder.go +++ b/client/go/internal/vespa/document/feeder.go @@ -17,8 +17,6 @@ const ( // StatusTransportFailure indicates that there was failure in the transport layer error while sending the document // operation to Vespa. StatusTransportFailure - // StatusError is a catch-all status for any other error that might occur. - StatusError ) // Result represents the result of a feeding operation. diff --git a/client/go/internal/vespa/document/http.go b/client/go/internal/vespa/document/http.go index de3e48a8e33..588330a0574 100644 --- a/client/go/internal/vespa/document/http.go +++ b/client/go/internal/vespa/document/http.go @@ -151,42 +151,35 @@ func (c *Client) leastBusyClient() *countingHTTPClient { // Send given document to the endpoint configured in this client. func (c *Client) Send(document Document) Result { start := c.now() - result := Result{Id: document.Id} - result.Stats.Requests = 1 + result := Result{Id: document.Id, Stats: Stats{Requests: 1}} method, url, err := c.feedURL(document, c.queryParams()) if err != nil { - result.Stats.Errors = 1 - result.Err = err - return result + return resultWithErr(result, err) } req, err := http.NewRequest(method, url.String(), bytes.NewReader(document.Body)) if err != nil { - result.Stats.Errors = 1 - result.Status = StatusError - result.Err = err - return result + return resultWithErr(result, err) } resp, err := c.leastBusyClient().Do(req, 190*time.Second) if err != nil { - result.Stats.Errors = 1 - result.Status = StatusTransportFailure - result.Err = err - return result + return resultWithErr(result, err) } defer resp.Body.Close() - result.Stats.Responses = 1 - result.Stats.ResponsesByCode = map[int]int64{ - resp.StatusCode: 1, - } - result.Stats.BytesSent = int64(len(document.Body)) elapsed := c.now().Sub(start) - result.Stats.TotalLatency = elapsed - result.Stats.MinLatency = elapsed - result.Stats.MaxLatency = elapsed - return c.resultWithResponse(resp, result) + return c.resultWithResponse(resp, result, document, elapsed) +} + +func resultWithErr(result Result, err error) Result { + result.Stats.Errors++ + result.Status = StatusTransportFailure + result.Err = err + return result } -func (c *Client) resultWithResponse(resp *http.Response, result Result) Result { +func (c *Client) resultWithResponse(resp *http.Response, result Result, document Document, elapsed time.Duration) Result { + result.HTTPStatus = resp.StatusCode + result.Stats.Responses++ + result.Stats.ResponsesByCode = map[int]int64{resp.StatusCode: 1} switch resp.StatusCode { case 200: result.Status = StatusSuccess @@ -204,14 +197,18 @@ func (c *Client) resultWithResponse(resp *http.Response, result Result) Result { cr := countingReader{reader: resp.Body} jsonDec := json.NewDecoder(&cr) if err := jsonDec.Decode(&body); err != nil { - result.Status = StatusError + result.Status = StatusVespaFailure result.Err = fmt.Errorf("failed to decode json response: %w", err) } result.Message = body.Message result.Trace = string(body.Trace) + result.Stats.BytesSent = int64(len(document.Body)) result.Stats.BytesRecv = cr.bytesRead if !result.Success() { - result.Stats.Errors = 1 + result.Stats.Errors++ } + result.Stats.TotalLatency = elapsed + result.Stats.MinLatency = elapsed + result.Stats.MaxLatency = elapsed return result } diff --git a/client/go/internal/vespa/document/http_test.go b/client/go/internal/vespa/document/http_test.go index 7c18111bb5d..43eaf1bfdf9 100644 --- a/client/go/internal/vespa/document/http_test.go +++ b/client/go/internal/vespa/document/http_test.go @@ -72,16 +72,38 @@ func TestClientSend(t *testing.T) { client.now = clock.now var stats Stats for i, doc := range docs { + wantRes := Result{ + Id: doc.Id, + Stats: Stats{ + Requests: 1, + Responses: 1, + TotalLatency: time.Second, + MinLatency: time.Second, + MaxLatency: time.Second, + BytesSent: 25, + }, + } if i < 2 { httpClient.NextResponseString(200, `{"message":"All good!"}`) + wantRes.Status = StatusSuccess + wantRes.HTTPStatus = 200 + wantRes.Message = "All good!" + wantRes.Stats.ResponsesByCode = map[int]int64{200: 1} + wantRes.Stats.BytesRecv = 23 } else { httpClient.NextResponseString(502, `{"message":"Good bye, cruel world!"}`) + wantRes.Status = StatusVespaFailure + wantRes.HTTPStatus = 502 + wantRes.Message = "Good bye, cruel world!" + wantRes.Stats.ResponsesByCode = map[int]int64{502: 1} + wantRes.Stats.Errors = 1 + wantRes.Stats.BytesRecv = 36 } res := client.Send(doc) - stats.Add(res.Stats) - if res.Err != nil { - t.Fatalf("got unexpected error %q", res.Err) + if !reflect.DeepEqual(res, wantRes) { + t.Fatalf("got result %+v, want %+v", res, wantRes) } + stats.Add(res.Stats) r := httpClient.LastRequest if r.Method != http.MethodPut { t.Errorf("got r.Method = %q, want %q", r.Method, http.MethodPut) |