Skip to content

Commit 5abc658

Browse files
genesordarccio
authored andcommitted
fix(contrib/net/http): WithStatusCheck option (#4018)
1 parent 98eec1c commit 5abc658

File tree

4 files changed

+46
-24
lines changed

4 files changed

+46
-24
lines changed

contrib/net/http/internal/config/config.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,6 @@ type RoundTripperConfig struct {
9494
Propagation bool
9595
ErrCheck func(err error) bool
9696
QueryString bool // reports whether the query string is included in the URL tag for http client spans
97-
IsStatusError func(statusCode int) bool
9897
ClientTimings bool // reports whether httptrace.ClientTrace should be enabled for detailed timing
9998
}
10099

contrib/net/http/internal/orchestrion/roundtrip.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,15 @@ func defaultRoundTripperConfig() *config.RoundTripperConfig {
4848

4949
return func(req *http.Request) string { return fmt.Sprintf("%s %s", req.Method, req.URL.Path) }
5050
}(),
51+
IsStatusError: func() func(int) bool {
52+
envVal := env.Get(config.EnvClientErrorStatuses)
53+
if fn := httptrace.GetErrorCodesFromInput(envVal); fn != nil {
54+
return fn
55+
}
56+
return func(statusCode int) bool { return statusCode >= 400 && statusCode < 500 }
57+
}(),
5158
ServiceName: config.Instrumentation.ServiceName(instrumentation.ComponentClient, nil),
5259
},
53-
IsStatusError: func() func(int) bool {
54-
envVal := env.Get(config.EnvClientErrorStatuses)
55-
if fn := httptrace.GetErrorCodesFromInput(envVal); fn != nil {
56-
return fn
57-
}
58-
return func(statusCode int) bool { return statusCode >= 400 && statusCode < 500 }
59-
}(),
6060
Propagation: true,
6161
QueryString: options.GetBoolEnv(config.EnvClientQueryStringEnabled, true),
6262
SpanNamer: func(*http.Request) string {

contrib/net/http/option.go

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -127,18 +127,21 @@ func newRoundTripperConfig() *internal.RoundTripperConfig {
127127
AnalyticsRate: instr.GlobalAnalyticsRate(),
128128
ResourceNamer: defaultResourceNamer,
129129
IgnoreRequest: func(_ *http.Request) bool { return false },
130-
}
131-
rtConfig := internal.RoundTripperConfig{
132-
CommonConfig: sharedCfg,
133-
Propagation: true,
134-
SpanNamer: defaultSpanNamer,
135-
QueryString: options.GetBoolEnv(internal.EnvClientQueryStringEnabled, true),
136130
IsStatusError: isClientError,
137131
}
132+
138133
v := env.Get(internal.EnvClientErrorStatuses)
139134
if fn := httptrace.GetErrorCodesFromInput(v); fn != nil {
140-
rtConfig.IsStatusError = fn
135+
sharedCfg.IsStatusError = fn
141136
}
137+
138+
rtConfig := internal.RoundTripperConfig{
139+
CommonConfig: sharedCfg,
140+
Propagation: true,
141+
SpanNamer: defaultSpanNamer,
142+
QueryString: options.GetBoolEnv(internal.EnvClientQueryStringEnabled, true),
143+
}
144+
142145
return &rtConfig
143146
}
144147

contrib/net/http/roundtripper_test.go

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
"net/http"
1313
"net/http/httptest"
1414
"net/url"
15-
"os"
1615
"regexp"
1716
"strconv"
1817
"strings"
@@ -145,8 +144,7 @@ func TestRoundTripperErrors(t *testing.T) {
145144
assert.Equal(t, "200", s.Tag(ext.HTTPCode))
146145
})
147146
t.Run("custom", func(t *testing.T) {
148-
os.Setenv("DD_TRACE_HTTP_CLIENT_ERROR_STATUSES", "500-510")
149-
defer os.Unsetenv("DD_TRACE_HTTP_CLIENT_ERROR_STATUSES")
147+
t.Setenv("DD_TRACE_HTTP_CLIENT_ERROR_STATUSES", "500-510")
150148
mt := mocktracer.Start()
151149
defer mt.Stop()
152150
rt := WrapRoundTripper(http.DefaultTransport)
@@ -426,7 +424,12 @@ func TestRoundTripperStatusCheck(t *testing.T) {
426424
defer mt.Stop()
427425

428426
s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
429-
w.WriteHeader(http.StatusNotFound)
427+
if r.URL.Path == "/not-found" {
428+
w.WriteHeader(http.StatusNotFound)
429+
return
430+
}
431+
432+
w.WriteHeader(http.StatusTeapot)
430433
}))
431434
defer s.Close()
432435

@@ -437,17 +440,35 @@ func TestRoundTripperStatusCheck(t *testing.T) {
437440
client := &http.Client{
438441
Transport: rt,
439442
}
440-
resp, err := client.Get(s.URL + "/hello/world")
443+
444+
// First request is not marked as an error as it's a 404
445+
resp, err := client.Get(s.URL + "/not-found")
441446
assert.Nil(t, err)
442-
defer resp.Body.Close()
447+
resp.Body.Close()
443448

444449
spans := mt.FinishedSpans()
450+
mt.Reset()
445451
assert.Len(t, spans, 1)
446452
assert.Equal(t, "http.request", spans[0].OperationName())
447453
assert.Equal(t, "http.request", spans[0].Tag(ext.ResourceName))
448454
assert.Equal(t, "404", spans[0].Tag(ext.HTTPCode))
449455
assert.Equal(t, "GET", spans[0].Tag(ext.HTTPMethod))
450-
assert.Nil(t, spans[0].Tag(ext.Error))
456+
assert.Nil(t, spans[0].Tag("http.errors"))
457+
assert.Nil(t, spans[0].Tag(ext.ErrorNoStackTrace))
458+
459+
// Second request is marked as an error as it's a 418
460+
resp, err = client.Get(s.URL + "/hello/world")
461+
assert.Nil(t, err)
462+
resp.Body.Close()
463+
464+
spans = mt.FinishedSpans()
465+
assert.Len(t, spans, 1)
466+
assert.Equal(t, "http.request", spans[0].OperationName())
467+
assert.Equal(t, "http.request", spans[0].Tag(ext.ResourceName))
468+
assert.Equal(t, "418", spans[0].Tag(ext.HTTPCode))
469+
assert.Equal(t, "GET", spans[0].Tag(ext.HTTPMethod))
470+
assert.EqualValues(t, "418 I'm a teapot", spans[0].Tag("http.errors"))
471+
assert.EqualValues(t, "418: I'm a teapot", spans[0].Tag(ext.ErrorMsg))
451472
}
452473

453474
func TestRoundTripperURLWithoutPort(t *testing.T) {
@@ -642,8 +663,7 @@ func TestClientQueryStringCollected(t *testing.T) {
642663
mt := mocktracer.Start()
643664
defer mt.Stop()
644665

645-
os.Setenv("DD_TRACE_HTTP_CLIENT_TAG_QUERY_STRING", "false")
646-
defer os.Unsetenv("DD_TRACE_HTTP_CLIENT_TAG_QUERY_STRING")
666+
t.Setenv("DD_TRACE_HTTP_CLIENT_TAG_QUERY_STRING", "false")
647667

648668
rt := WrapRoundTripper(http.DefaultTransport)
649669
client := &http.Client{

0 commit comments

Comments
 (0)