From f55aaaa0db83151d472b18298f05bdc9fd747c3f Mon Sep 17 00:00:00 2001 From: Prabhat Sharma Date: Sun, 14 Jan 2024 09:03:15 -0800 Subject: [PATCH] add retry for http send in case of failure --- transport/http/http.go | 52 +++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/transport/http/http.go b/transport/http/http.go index a07aafd..218ea55 100644 --- a/transport/http/http.go +++ b/transport/http/http.go @@ -4,8 +4,11 @@ import ( "bytes" "encoding/json" "flag" + "fmt" + "math" "net/http" "sync" + "time" "github.com/netsampler/goflow2/v2/transport" ) @@ -54,23 +57,40 @@ func (d *HTTPDriver) Send(key, data []byte) error { return err } - req, err := http.NewRequest("POST", d.httpDestination, bytes.NewBuffer(jsonData)) - if err != nil { - return err + maxRetries := 3 + delay := time.Millisecond * 500 // initial delay + for i := 0; i < maxRetries; i++ { + req, err := http.NewRequest("POST", d.httpDestination, bytes.NewBuffer(jsonData)) + if err != nil { + return err + } + + req.Header.Set("Content-Type", "application/json") + req.Header.Set(d.httpAuthHeader, d.httpAuthCredentials) + + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + if i == maxRetries-1 { + return err + } + continue + } + defer resp.Body.Close() + + // If the status code is not in the 2xx range, retry + if resp.StatusCode < 200 || resp.StatusCode >= 300 { + if i == maxRetries-1 { + return fmt.Errorf("failed to send data, status code: %d", resp.StatusCode) + } + time.Sleep(delay * time.Duration(math.Pow(2, float64(i)))) // exponential backoff + continue + } + + // reset batchData + d.batchData = d.batchData[:0] + break } - - req.Header.Set("Content-Type", "application/json") - req.Header.Set(d.httpAuthHeader, d.httpAuthCredentials) - - client := &http.Client{} - resp, err := client.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - // reset batchData - d.batchData = d.batchData[:0] } return nil