From 652458427e73bb9b8080821b88fa250388899b3b Mon Sep 17 00:00:00 2001 From: Tyler Yahn Date: Mon, 8 Dec 2025 13:35:15 -0800 Subject: [PATCH 1/2] Remove the deprecated otelhttp client --- CHANGELOG.md | 5 + instrumentation/net/http/otelhttp/client.go | 65 ----------- .../net/http/otelhttp/client_test.go | 107 ------------------ 3 files changed, 5 insertions(+), 172 deletions(-) delete mode 100644 instrumentation/net/http/otelhttp/client.go delete mode 100644 instrumentation/net/http/otelhttp/client_test.go diff --git a/CHANGELOG.md b/CHANGELOG.md index be57bd589ac..97118d92026 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,11 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ## [Unreleased] +### Removed + +- The deprecated `DefaultClient`, `Get`, `Head`, `Post`, and `PostForm` in `go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp`. + Use a custom `*http.Client` with `otelhttp.NewTransport(http.DefaultTransport)` instead. (#TBD) + diff --git a/instrumentation/net/http/otelhttp/client.go b/instrumentation/net/http/otelhttp/client.go deleted file mode 100644 index e980ab62b85..00000000000 --- a/instrumentation/net/http/otelhttp/client.go +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package otelhttp // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" - -import ( - "context" - "io" - "net/http" - "net/url" - "strings" -) - -// DefaultClient is the default Client and is used by Get, Head, Post and PostForm. -// Please be careful of initialization order - for example, if you change -// the global propagator, the DefaultClient might still be using the old one. -// -// Deprecated: [DefaultClient] will be removed in a future release. -// Create your own [http.Client] based on the [Transport] example: https://pkg.go.dev/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp#example-NewTransport -var DefaultClient = &http.Client{Transport: NewTransport(http.DefaultTransport)} - -// Get is a convenient replacement for http.Get that adds a span around the request. -// -// Deprecated: [Get] will be removed in a future release. -// Create your own [http.Client] based on the [Transport] example: https://pkg.go.dev/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp#example-NewTransport -func Get(ctx context.Context, targetURL string) (resp *http.Response, err error) { - req, err := http.NewRequestWithContext(ctx, http.MethodGet, targetURL, http.NoBody) - if err != nil { - return nil, err - } - return DefaultClient.Do(req) -} - -// Head is a convenient replacement for http.Head that adds a span around the request. -// -// Deprecated: [Head] will be removed in a future release. -// Create your own [http.Client] based on the [Transport] example: https://pkg.go.dev/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp#example-NewTransport -func Head(ctx context.Context, targetURL string) (resp *http.Response, err error) { - req, err := http.NewRequestWithContext(ctx, http.MethodHead, targetURL, http.NoBody) - if err != nil { - return nil, err - } - return DefaultClient.Do(req) -} - -// Post is a convenient replacement for http.Post that adds a span around the request. -// -// Deprecated: [Post] will be removed in a future release. -// Create your own [http.Client] based on the [Transport] example: https://pkg.go.dev/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp#example-NewTransport -func Post(ctx context.Context, targetURL, contentType string, body io.Reader) (resp *http.Response, err error) { - req, err := http.NewRequestWithContext(ctx, http.MethodPost, targetURL, body) - if err != nil { - return nil, err - } - req.Header.Set("Content-Type", contentType) - return DefaultClient.Do(req) -} - -// PostForm is a convenient replacement for http.PostForm that adds a span around the request. -// -// Deprecated: [PostForm] will be removed in a future release. -// Create your own [http.Client] based on the [Transport] example: https://pkg.go.dev/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp#example-NewTransport -func PostForm(ctx context.Context, targetURL string, data url.Values) (resp *http.Response, err error) { - return Post(ctx, targetURL, "application/x-www-form-urlencoded", strings.NewReader(data.Encode())) -} diff --git a/instrumentation/net/http/otelhttp/client_test.go b/instrumentation/net/http/otelhttp/client_test.go deleted file mode 100644 index bf5311099e9..00000000000 --- a/instrumentation/net/http/otelhttp/client_test.go +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package otelhttp_test - -import ( - "net/http" - "net/http/httptest" - "net/url" - "strings" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.opentelemetry.io/otel/sdk/trace" - "go.opentelemetry.io/otel/sdk/trace/tracetest" - - "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" -) - -func TestConvenienceWrappers(t *testing.T) { - sr := tracetest.NewSpanRecorder() - provider := trace.NewTracerProvider(trace.WithSpanProcessor(sr)) - orig := otelhttp.DefaultClient - otelhttp.DefaultClient = &http.Client{ - Transport: otelhttp.NewTransport( - http.DefaultTransport, - otelhttp.WithTracerProvider(provider), - ), - } - defer func() { otelhttp.DefaultClient = orig }() - - content := []byte("Hello, world!") - - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { - if _, err := w.Write(content); err != nil { - t.Fatal(err) - } - })) - defer ts.Close() - - ctx := t.Context() - res, err := otelhttp.Get(ctx, ts.URL) - if err != nil { - t.Fatal(err) - } - res.Body.Close() - - res, err = otelhttp.Head(ctx, ts.URL) - if err != nil { - t.Fatal(err) - } - res.Body.Close() - - res, err = otelhttp.Post(ctx, ts.URL, "text/plain", strings.NewReader("test")) - if err != nil { - t.Fatal(err) - } - res.Body.Close() - - form := make(url.Values) - form.Set("foo", "bar") - res, err = otelhttp.PostForm(ctx, ts.URL, form) - if err != nil { - t.Fatal(err) - } - res.Body.Close() - - spans := sr.Ended() - require.Len(t, spans, 4) - assert.Equal(t, "HTTP GET", spans[0].Name()) - assert.Equal(t, "HTTP HEAD", spans[1].Name()) - assert.Equal(t, "HTTP POST", spans[2].Name()) - assert.Equal(t, "HTTP POST", spans[3].Name()) -} - -func TestClientWithTraceContext(t *testing.T) { - sr := tracetest.NewSpanRecorder() - provider := trace.NewTracerProvider(trace.WithSpanProcessor(sr)) - - tracer := provider.Tracer("") - ctx, span := tracer.Start(t.Context(), "http requests") - - content := []byte("Hello, world!") - - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { - if _, err := w.Write(content); err != nil { - t.Fatal(err) - } - })) - defer ts.Close() - - res, err := otelhttp.Get(ctx, ts.URL) - if err != nil { - t.Fatal(err) - } - res.Body.Close() - - span.End() - - spans := sr.Ended() - require.Len(t, spans, 2) - assert.Equal(t, "HTTP GET", spans[0].Name()) - assert.Equal(t, "http requests", spans[1].Name()) - assert.NotEmpty(t, spans[0].Parent().SpanID()) - assert.Equal(t, spans[1].SpanContext().SpanID(), spans[0].Parent().SpanID()) -} From 439f909ac8582c5bfd2e949a344455567a20dec8 Mon Sep 17 00:00:00 2001 From: Tyler Yahn Date: Mon, 8 Dec 2025 14:23:18 -0800 Subject: [PATCH 2/2] Add PR number --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 97118d92026..580e946baae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ### Removed - The deprecated `DefaultClient`, `Get`, `Head`, `Post`, and `PostForm` in `go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp`. - Use a custom `*http.Client` with `otelhttp.NewTransport(http.DefaultTransport)` instead. (#TBD) + Use a custom `*http.Client` with `otelhttp.NewTransport(http.DefaultTransport)` instead. (#8266)