Skip to content

Commit

Permalink
Updated public methods in confighttp (#9895)
Browse files Browse the repository at this point in the history
Added context.Context to the following functions:

ToClient
ToServer
ToListener
Link:
#9807
  • Loading branch information
AkhigbeEromo committed Apr 5, 2024
1 parent 9959728 commit 79ccf55
Show file tree
Hide file tree
Showing 6 changed files with 91 additions and 41 deletions.
25 changes: 25 additions & 0 deletions .chloggen/confighttp-add-context-to-public-func.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Use this changelog template to create an entry for release notes.

# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
change_type: deprecation

# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver)
component: confighttp

# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: Deprecate `ToClient`,`ToListener`and `ToServer` use `ToClientContext`,`ToListenerContext` and `ToServerContext`instead.

# One or more tracking issues or pull requests related to the change
issues: [9807]

# (Optional) One or more lines of additional information to render under the primary note.
# These lines will be padded with 2 spaces and then inserted directly into the document.
# Use pipe (|) for multiline entries.
subtext:

# Optional: The change log or logs in which this entry should be included.
# e.g. '[user]' or '[user, api]'
# Include 'user' if the change is relevant to end users.
# Include 'api' if there is a change to a library API.
# Default: '[user]'
change_logs: [api]
3 changes: 2 additions & 1 deletion config/confighttp/compression_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"bytes"
"compress/gzip"
"compress/zlib"
"context"
"fmt"
"io"
"net/http"
Expand Down Expand Up @@ -99,7 +100,7 @@ func TestHTTPClientCompression(t *testing.T) {
Endpoint: srv.URL,
Compression: tt.encoding,
}
client, err := clientSettings.ToClient(componenttest.NewNopHost(), componenttest.NewNopTelemetrySettings())
client, err := clientSettings.ToClientContext(context.Background(), componenttest.NewNopHost(), componenttest.NewNopTelemetrySettings())
require.NoError(t, err)
res, err := client.Do(req)
if tt.shouldError {
Expand Down
25 changes: 20 additions & 5 deletions config/confighttp/confighttp.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,14 @@ func NewDefaultClientConfig() ClientConfig {
}
}

// ToClient creates an HTTP client.
// Deprecated: [v0.98.0] Use ToClientContext instead.
func (hcs *ClientConfig) ToClient(host component.Host, settings component.TelemetrySettings) (*http.Client, error) {
tlsCfg, err := hcs.TLSSetting.LoadTLSConfigContext(context.Background())
return hcs.ToClientContext(context.Background(), host, settings)
}

// ToClientContext creates an HTTP client.
func (hcs *ClientConfig) ToClientContext(ctx context.Context, host component.Host, settings component.TelemetrySettings) (*http.Client, error) {
tlsCfg, err := hcs.TLSSetting.LoadTLSConfigContext(ctx)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -277,16 +282,21 @@ type ServerConfig struct {
ResponseHeaders map[string]configopaque.String `mapstructure:"response_headers"`
}

// ToListener creates a net.Listener.
// Deprecated: [v0.98.0] Use ToListenerContext instead.
func (hss *ServerConfig) ToListener() (net.Listener, error) {
return hss.ToListenerContext(context.Background())
}

// ToListenerContext creates a net.Listener.
func (hss *ServerConfig) ToListenerContext(ctx context.Context) (net.Listener, error) {
listener, err := net.Listen("tcp", hss.Endpoint)
if err != nil {
return nil, err
}

if hss.TLSSetting != nil {
var tlsCfg *tls.Config
tlsCfg, err = hss.TLSSetting.LoadTLSConfigContext(context.Background())
tlsCfg, err = hss.TLSSetting.LoadTLSConfigContext(ctx)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -327,8 +337,13 @@ func WithDecoder(key string, dec func(body io.ReadCloser) (io.ReadCloser, error)
}
}

// ToServer creates an http.Server from settings object.
// Deprecated: [v0.98.0] Use ToServerContext instead.
func (hss *ServerConfig) ToServer(host component.Host, settings component.TelemetrySettings, handler http.Handler, opts ...ToServerOption) (*http.Server, error) {
return hss.ToServerContext(context.Background(), host, settings, handler, opts...)
}

// ToServerContext creates an http.Server from settings object.
func (hss *ServerConfig) ToServerContext(_ context.Context, host component.Host, settings component.TelemetrySettings, handler http.Handler, opts ...ToServerOption) (*http.Server, error) {
internal.WarnOnUnspecifiedHost(settings.Logger, hss.Endpoint)

serverOpts := &toServerOptions{}
Expand Down
67 changes: 38 additions & 29 deletions config/confighttp/confighttp_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ func TestAllHTTPClientSettings(t *testing.T) {
t.Run(test.name, func(t *testing.T) {
tt := componenttest.NewNopTelemetrySettings()
tt.TracerProvider = nil
client, err := test.settings.ToClient(host, tt)
client, err := test.settings.ToClientContext(context.Background(), host, tt)
if test.shouldError {
assert.Error(t, err)
return
Expand Down Expand Up @@ -222,7 +222,7 @@ func TestPartialHTTPClientSettings(t *testing.T) {
t.Run(test.name, func(t *testing.T) {
tt := componenttest.NewNopTelemetrySettings()
tt.TracerProvider = nil
client, err := test.settings.ToClient(host, tt)
client, err := test.settings.ToClientContext(context.Background(), host, tt)
assert.NoError(t, err)
transport := client.Transport.(*http.Transport)
assert.EqualValues(t, 1024, transport.ReadBufferSize)
Expand Down Expand Up @@ -272,7 +272,7 @@ func TestProxyURL(t *testing.T) {

tt := componenttest.NewNopTelemetrySettings()
tt.TracerProvider = nil
client, err := s.ToClient(componenttest.NewNopHost(), tt)
client, err := s.ToClientContext(context.Background(), componenttest.NewNopHost(), tt)

if tC.err {
require.Error(t, err)
Expand Down Expand Up @@ -342,7 +342,7 @@ func TestHTTPClientSettingsError(t *testing.T) {
}
for _, test := range tests {
t.Run(test.err, func(t *testing.T) {
_, err := test.settings.ToClient(host, componenttest.NewNopTelemetrySettings())
_, err := test.settings.ToClientContext(context.Background(), host, componenttest.NewNopTelemetrySettings())
assert.Regexp(t, test.err, err)
})
}
Expand Down Expand Up @@ -451,7 +451,7 @@ func TestHTTPClientSettingWithAuthConfig(t *testing.T) {
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
// Omit TracerProvider and MeterProvider in TelemetrySettings as otelhttp.Transport cannot be introspected
client, err := test.settings.ToClient(test.host, component.TelemetrySettings{Logger: zap.NewNop(), MetricsLevel: configtelemetry.LevelNone})
client, err := test.settings.ToClientContext(context.Background(), test.host, component.TelemetrySettings{Logger: zap.NewNop(), MetricsLevel: configtelemetry.LevelNone})
if test.shouldErr {
assert.Error(t, err)
return
Expand Down Expand Up @@ -523,7 +523,7 @@ func TestHTTPServerSettingsError(t *testing.T) {
}
for _, test := range tests {
t.Run(test.err, func(t *testing.T) {
_, err := test.settings.ToListener()
_, err := test.settings.ToListenerContext(context.Background())
assert.Regexp(t, test.err, err)
})
}
Expand Down Expand Up @@ -554,7 +554,8 @@ func TestHTTPServerWarning(t *testing.T) {
logger, observed := observer.New(zap.DebugLevel)
set.Logger = zap.New(logger)

_, err := test.settings.ToServer(
_, err := test.settings.ToServerContext(
context.Background(),
componenttest.NewNopHost(),
set,
http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
Expand Down Expand Up @@ -697,10 +698,11 @@ func TestHttpReception(t *testing.T) {
Endpoint: "localhost:0",
TLSSetting: tt.tlsServerCreds,
}
ln, err := hss.ToListener()
ln, err := hss.ToListenerContext(context.Background())
require.NoError(t, err)

s, err := hss.ToServer(
s, err := hss.ToServerContext(
context.Background(),
componenttest.NewNopHost(),
componenttest.NewNopTelemetrySettings(),
http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
Expand Down Expand Up @@ -731,7 +733,7 @@ func TestHttpReception(t *testing.T) {
return rt, nil
}
}
client, errClient := hcs.ToClient(componenttest.NewNopHost(), component.TelemetrySettings{})
client, errClient := hcs.ToClientContext(context.Background(), componenttest.NewNopHost(), component.TelemetrySettings{})
require.NoError(t, errClient)

resp, errResp := client.Get(hcs.Endpoint)
Expand Down Expand Up @@ -810,10 +812,11 @@ func TestHttpCors(t *testing.T) {
CORS: tt.CORSConfig,
}

ln, err := hss.ToListener()
ln, err := hss.ToListenerContext(context.Background())
require.NoError(t, err)

s, err := hss.ToServer(
s, err := hss.ToServerContext(
context.Background(),
componenttest.NewNopHost(),
componenttest.NewNopTelemetrySettings(),
http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
Expand Down Expand Up @@ -853,7 +856,8 @@ func TestHttpCorsInvalidSettings(t *testing.T) {
}

// This effectively does not enable CORS but should also not cause an error
s, err := hss.ToServer(
s, err := hss.ToServerContext(
context.Background(),
componenttest.NewNopHost(),
componenttest.NewNopTelemetrySettings(),
http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}))
Expand Down Expand Up @@ -883,7 +887,7 @@ func TestHttpCorsWithSettings(t *testing.T) {
},
}

srv, err := hss.ToServer(host, componenttest.NewNopTelemetrySettings(), nil)
srv, err := hss.ToServerContext(context.Background(), host, componenttest.NewNopTelemetrySettings(), nil)
require.NoError(t, err)
require.NotNil(t, srv)

Expand Down Expand Up @@ -926,10 +930,11 @@ func TestHttpServerHeaders(t *testing.T) {
ResponseHeaders: tt.headers,
}

ln, err := hss.ToListener()
ln, err := hss.ToListenerContext(context.Background())
require.NoError(t, err)

s, err := hss.ToServer(
s, err := hss.ToServerContext(
context.Background(),
componenttest.NewNopHost(),
componenttest.NewNopTelemetrySettings(),
http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
Expand Down Expand Up @@ -1012,15 +1017,16 @@ func ExampleServerConfig() {
settings := ServerConfig{
Endpoint: "localhost:443",
}
s, err := settings.ToServer(
s, err := settings.ToServerContext(
context.Background(),
componenttest.NewNopHost(),
componenttest.NewNopTelemetrySettings(),
http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}))
if err != nil {
panic(err)
}

l, err := settings.ToListener()
l, err := settings.ToListenerContext(context.Background())
if err != nil {
panic(err)
}
Expand Down Expand Up @@ -1059,7 +1065,7 @@ func TestHttpClientHeaders(t *testing.T) {
Timeout: 0,
Headers: tt.headers,
}
client, _ := setting.ToClient(componenttest.NewNopHost(), componenttest.NewNopTelemetrySettings())
client, _ := setting.ToClientContext(context.Background(), componenttest.NewNopHost(), componenttest.NewNopTelemetrySettings())
req, err := http.NewRequest(http.MethodGet, setting.Endpoint, nil)
assert.NoError(t, err)
_, err = client.Do(req)
Expand Down Expand Up @@ -1095,7 +1101,7 @@ func TestHttpClientHostHeader(t *testing.T) {
Timeout: 0,
Headers: tt.headers,
}
client, _ := setting.ToClient(componenttest.NewNopHost(), componenttest.NewNopTelemetrySettings())
client, _ := setting.ToClientContext(context.Background(), componenttest.NewNopHost(), componenttest.NewNopTelemetrySettings())
req, err := http.NewRequest(http.MethodGet, setting.Endpoint, nil)
assert.NoError(t, err)
_, err = client.Do(req)
Expand Down Expand Up @@ -1190,7 +1196,7 @@ func TestServerAuth(t *testing.T) {
handlerCalled = true
})

srv, err := hss.ToServer(host, componenttest.NewNopTelemetrySettings(), handler)
srv, err := hss.ToServerContext(context.Background(), host, componenttest.NewNopTelemetrySettings(), handler)
require.NoError(t, err)

// test
Expand All @@ -1208,7 +1214,7 @@ func TestInvalidServerAuth(t *testing.T) {
},
}

srv, err := hss.ToServer(componenttest.NewNopHost(), componenttest.NewNopTelemetrySettings(), http.NewServeMux())
srv, err := hss.ToServerContext(context.Background(), componenttest.NewNopHost(), componenttest.NewNopTelemetrySettings(), http.NewServeMux())
require.Error(t, err)
require.Nil(t, srv)
}
Expand All @@ -1231,7 +1237,7 @@ func TestFailedServerAuth(t *testing.T) {
},
}

srv, err := hss.ToServer(host, componenttest.NewNopTelemetrySettings(), http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}))
srv, err := hss.ToServerContext(context.Background(), host, componenttest.NewNopTelemetrySettings(), http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}))
require.NoError(t, err)

// test
Expand All @@ -1254,7 +1260,8 @@ func TestServerWithErrorHandler(t *testing.T) {
http.Error(w, "invalid request", http.StatusInternalServerError)
}

srv, err := hss.ToServer(
srv, err := hss.ToServerContext(
context.Background(),
componenttest.NewNopHost(),
componenttest.NewNopTelemetrySettings(),
http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}),
Expand Down Expand Up @@ -1282,7 +1289,8 @@ func TestServerWithDecoder(t *testing.T) {
return body, nil
}

srv, err := hss.ToServer(
srv, err := hss.ToServerContext(
context.Background(),
componenttest.NewNopHost(),
componenttest.NewNopTelemetrySettings(),
http.HandlerFunc(func(http.ResponseWriter, *http.Request) {}),
Expand Down Expand Up @@ -1358,15 +1366,16 @@ func BenchmarkHttpRequest(b *testing.B) {
TLSSetting: tlsServerCreds,
}

s, err := hss.ToServer(
s, err := hss.ToServerContext(
context.Background(),
componenttest.NewNopHost(),
componenttest.NewNopTelemetrySettings(),
http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
_, errWrite := fmt.Fprint(w, "test")
require.NoError(b, errWrite)
}))
require.NoError(b, err)
ln, err := hss.ToListener()
ln, err := hss.ToListenerContext(context.Background())
require.NoError(b, err)

go func() {
Expand All @@ -1390,12 +1399,12 @@ func BenchmarkHttpRequest(b *testing.B) {
b.Run(bb.name, func(b *testing.B) {
var c *http.Client
if !bb.clientPerThread {
c, err = hcs.ToClient(componenttest.NewNopHost(), component.TelemetrySettings{})
c, err = hcs.ToClientContext(context.Background(), componenttest.NewNopHost(), component.TelemetrySettings{})
require.NoError(b, err)
}
b.RunParallel(func(pb *testing.PB) {
if c == nil {
c, err = hcs.ToClient(componenttest.NewNopHost(), component.TelemetrySettings{})
c, err = hcs.ToClientContext(context.Background(), componenttest.NewNopHost(), component.TelemetrySettings{})
require.NoError(b, err)
}
for pb.Next() {
Expand Down
4 changes: 2 additions & 2 deletions exporter/otlphttpexporter/otlp.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,8 @@ func newExporter(cfg component.Config, set exporter.CreateSettings) (*baseExport

// start actually creates the HTTP client. The client construction is deferred till this point as this
// is the only place we get hold of Extensions which are required to construct auth round tripper.
func (e *baseExporter) start(_ context.Context, host component.Host) error {
client, err := e.config.ClientConfig.ToClient(host, e.settings)
func (e *baseExporter) start(ctx context.Context, host component.Host) error {
client, err := e.config.ClientConfig.ToClientContext(ctx, host, e.settings)
if err != nil {
return err
}
Expand Down
8 changes: 4 additions & 4 deletions receiver/otlpreceiver/otlp.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ func (r *otlpReceiver) startGRPCServer(host component.Host) error {
return nil
}

func (r *otlpReceiver) startHTTPServer(host component.Host) error {
func (r *otlpReceiver) startHTTPServer(ctx context.Context, host component.Host) error {
// If HTTP is not enabled, nothing to start.
if r.cfg.HTTP == nil {
return nil
Expand Down Expand Up @@ -145,13 +145,13 @@ func (r *otlpReceiver) startHTTPServer(host component.Host) error {
}

var err error
if r.serverHTTP, err = r.cfg.HTTP.ToServer(host, r.settings.TelemetrySettings, httpMux, confighttp.WithErrorHandler(errorHandler)); err != nil {
if r.serverHTTP, err = r.cfg.HTTP.ToServerContext(ctx, host, r.settings.TelemetrySettings, httpMux, confighttp.WithErrorHandler(errorHandler)); err != nil {
return err
}

r.settings.Logger.Info("Starting HTTP server", zap.String("endpoint", r.cfg.HTTP.ServerConfig.Endpoint))
var hln net.Listener
if hln, err = r.cfg.HTTP.ServerConfig.ToListener(); err != nil {
if hln, err = r.cfg.HTTP.ServerConfig.ToListenerContext(ctx); err != nil {
return err
}

Expand All @@ -172,7 +172,7 @@ func (r *otlpReceiver) Start(ctx context.Context, host component.Host) error {
if err := r.startGRPCServer(host); err != nil {
return err
}
if err := r.startHTTPServer(host); err != nil {
if err := r.startHTTPServer(ctx, host); err != nil {
// It's possible that a valid GRPC server configuration was specified,
// but an invalid HTTP configuration. If that's the case, the successfully
// started GRPC server must be shutdown to ensure no goroutines are leaked.
Expand Down

0 comments on commit 79ccf55

Please sign in to comment.