diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d39efc8407..4b01b5fd449 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,12 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ### Added - Change `Version()` function in `go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp` to a `const Version` string. (#8142) + +### 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. (#8266) + 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()) -}