mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-18 07:26:50 +00:00
request: provide observability over HTTP request latency (#848)
This commit is contained in:
@@ -20,3 +20,10 @@ func WithRetryPolicy(p RetryPolicy) RequesterOption {
|
||||
r.retryPolicy = p
|
||||
}
|
||||
}
|
||||
|
||||
// WithReporter configures the reporter for a Requester.
|
||||
func WithReporter(rep Reporter) RequesterOption {
|
||||
return func(r *Requester) {
|
||||
r.reporter = rep
|
||||
}
|
||||
}
|
||||
|
||||
17
exchanges/request/report.go
Normal file
17
exchanges/request/report.go
Normal file
@@ -0,0 +1,17 @@
|
||||
package request
|
||||
|
||||
import (
|
||||
"time"
|
||||
)
|
||||
|
||||
// Reporter interface groups observability functionality over
|
||||
// HTTP request latency.
|
||||
type Reporter interface {
|
||||
Latency(name, method, path string, t time.Duration)
|
||||
}
|
||||
|
||||
// SetupGlobalReporter sets a reporter interface to be used
|
||||
// for all exchange requests
|
||||
func SetupGlobalReporter(r Reporter) {
|
||||
globalReporter = r
|
||||
}
|
||||
@@ -39,6 +39,7 @@ func New(name string, httpRequester *http.Client, opts ...RequesterOption) *Requ
|
||||
retryPolicy: DefaultRetryPolicy,
|
||||
maxRetries: MaxRetryAttempts,
|
||||
timedLock: timedmutex.NewTimedMutex(DefaultMutexLockTimeout),
|
||||
reporter: globalReporter,
|
||||
}
|
||||
|
||||
for _, o := range opts {
|
||||
@@ -150,7 +151,14 @@ func (r *Requester) doRequest(ctx context.Context, endpoint EndpointLimit, newRe
|
||||
}
|
||||
}
|
||||
|
||||
start := time.Now()
|
||||
|
||||
resp, err := r.HTTPClient.Do(req)
|
||||
|
||||
if r.reporter != nil {
|
||||
r.reporter.Latency(r.Name, p.Method, p.Path, time.Since(start))
|
||||
}
|
||||
|
||||
if retry, checkErr := r.retryPolicy(resp, err); checkErr != nil {
|
||||
return checkErr
|
||||
} else if retry {
|
||||
|
||||
@@ -23,12 +23,14 @@ const (
|
||||
var (
|
||||
MaxRequestJobs = DefaultMaxRequestJobs
|
||||
MaxRetryAttempts = DefaultMaxRetryAttempts
|
||||
globalReporter Reporter
|
||||
)
|
||||
|
||||
// Requester struct for the request client
|
||||
type Requester struct {
|
||||
HTTPClient *http.Client
|
||||
limiter Limiter
|
||||
reporter Reporter
|
||||
Name string
|
||||
UserAgent string
|
||||
maxRetries int
|
||||
|
||||
Reference in New Issue
Block a user