Skip to content

Commit c28c309

Browse files
CRE-4405: Add request tracing, add default transport to outgoing HTTP requests
1 parent b538c88 commit c28c309

6 files changed

Lines changed: 36 additions & 10 deletions

File tree

core/cmd/shell.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import (
5151
"github.com/smartcontractkit/chainlink/v2/core/services/ccv/ccvcommon"
5252
"github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
5353
"github.com/smartcontractkit/chainlink/v2/core/services/cre"
54+
gatewaynetwork "github.com/smartcontractkit/chainlink/v2/core/services/gateway/network"
5455
"github.com/smartcontractkit/chainlink/v2/core/services/keystore"
5556
"github.com/smartcontractkit/chainlink/v2/core/services/llo"
5657
"github.com/smartcontractkit/chainlink/v2/core/services/llo/retirement"
@@ -80,6 +81,7 @@ func metricViews() []sdkmetric.View {
8081
ccvcommon.MetricViews(),
8182
ocr3beholderwrapper.MetricViews(),
8283
ocr3_1beholderwrapper.MetricViews(),
84+
gatewaynetwork.HTTPClientMetricViews(),
8385
)
8486
}
8587

core/scripts/go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -648,6 +648,8 @@ require (
648648

649649
replace github.com/fbsobreira/gotron-sdk => github.com/smartcontractkit/chainlink-tron/relayer/gotron-sdk v0.0.5-0.20260218133534-cbd44da2856b
650650

651+
replace github.com/doyensec/safeurl => github.com/cedric-cordenier/safeurl v0.0.0-20260519102940-15f2ee3f8b50
652+
651653
// moby/go-archive v0.2.0 removed deprecated aliases (archive.Gzip, etc.) that
652654
// docker/cli@v28.5.x still uses. docker/compose has not migrated to docker/cli v29
653655
// yet, so we pin to v0.1.0 which has both the old aliases and the new compression API.

core/scripts/go.sum

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

core/services/gateway/network/httpclient.go

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"io"
99
"maps"
1010
"net/http"
11+
"net/http/httptrace"
1112
"slices"
1213
"strings"
1314

@@ -169,9 +170,10 @@ func responseHeadersFromNetHeader(h http.Header) (map[string]string, map[string]
169170
}
170171

171172
type httpClient struct {
172-
client *safeurl.WrappedClient
173-
config HTTPClientConfig
174-
lggr logger.Logger
173+
client *safeurl.WrappedClient
174+
config HTTPClientConfig
175+
lggr logger.Logger
176+
metrics *httpClientMetrics
175177
}
176178

177179
// NewHTTPClient creates a new NewHTTPClient
@@ -194,12 +196,21 @@ func NewHTTPClient(config HTTPClientConfig, lggr logger.Logger) (HTTPClient, err
194196
SetBlockedIPs(config.BlockedIPs...).
195197
SetBlockedIPsCIDR(config.BlockedIPsCIDR...).
196198
SetCheckRedirect(disableRedirects).
199+
SetTransport(
200+
http.DefaultTransport.(*http.Transport),
201+
).
197202
Build()
198203

204+
metrics, err := newHTTPClientMetrics()
205+
if err != nil {
206+
return nil, err
207+
}
208+
199209
return &httpClient{
200-
config: config,
201-
client: safeurl.Client(safeConfig),
202-
lggr: lggr,
210+
config: config,
211+
client: safeurl.Client(safeConfig),
212+
lggr: lggr,
213+
metrics: metrics,
203214
}, nil
204215
}
205216

@@ -297,8 +308,13 @@ func (c *httpClient) Send(ctx context.Context, req HTTPRequest) (*HTTPResponse,
297308
timeoutCtx, cancel := context.WithTimeout(ctx, to)
298309
defer cancel()
299310

311+
requestStart := time.Now()
312+
trace, traceState := newClientTrace(ctx, req.Method, requestStart, c.metrics)
313+
timeoutCtx = httptrace.WithClientTrace(timeoutCtx, trace)
314+
300315
r, err := http.NewRequestWithContext(timeoutCtx, req.Method, req.URL, bytes.NewBuffer(req.Body))
301316
if err != nil {
317+
c.metrics.recordTotal(ctx, req.Method, 0, false, false, time.Since(requestStart))
302318
return nil, err
303319
}
304320
for k, values := range requestToNetHeader(req) {
@@ -309,6 +325,7 @@ func (c *httpClient) Send(ctx context.Context, req HTTPRequest) (*HTTPResponse,
309325

310326
resp, err := c.client.Do(r)
311327
if err != nil {
328+
c.metrics.recordTotal(ctx, req.Method, 0, false, traceState.connReused.Load(), time.Since(requestStart))
312329
if isBlockedRequest(err) {
313330
c.lggr.Warnw("HTTP request blocked", "err", err)
314331
return nil, fmt.Errorf("%w: %w", ErrBlockedRequest, err)
@@ -324,10 +341,13 @@ func (c *httpClient) Send(ctx context.Context, req HTTPRequest) (*HTTPResponse,
324341
reader := http.MaxBytesReader(nil, resp.Body, int64(n))
325342
body, err := io.ReadAll(reader)
326343
if err != nil {
344+
c.metrics.recordTotal(ctx, req.Method, resp.StatusCode, false, traceState.connReused.Load(), time.Since(requestStart))
327345
c.lggr.Errorw("failed to read HTTP response body", "err", err)
328346
return nil, errors.Join(err, ErrHTTPRead)
329347
}
330348

349+
c.metrics.recordTotal(ctx, req.Method, resp.StatusCode, true, traceState.connReused.Load(), time.Since(requestStart))
350+
331351
headers, multiHeaders := responseHeadersFromNetHeader(resp.Header)
332352
c.lggr.Debugw("received HTTP response", "statusCode", resp.StatusCode)
333353
return &HTTPResponse{

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,8 @@ require (
431431

432432
replace github.com/fbsobreira/gotron-sdk => github.com/smartcontractkit/chainlink-tron/relayer/gotron-sdk v0.0.5-0.20260218133534-cbd44da2856b
433433

434+
replace github.com/doyensec/safeurl => github.com/cedric-cordenier/safeurl v0.0.0-20260519102940-15f2ee3f8b50
435+
434436
tool github.com/smartcontractkit/chainlink-common/pkg/loop/cmd/loopinstall
435437

436438
tool github.com/smartcontractkit/chainlink-common/script/cmd/dependabot

go.sum

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)