From 3ce64e6e5d401a05d582815c854aab28be10105a Mon Sep 17 00:00:00 2001 From: Kushal Shukla Date: Mon, 10 Nov 2025 01:09:30 +0530 Subject: [PATCH 1/2] Added oauth header before writing to header Signed-off-by: Kushal Shukla --- .chloggen/chaining.yaml | 30 ++ extension/headerssetterextension/README.md | 66 +++- .../headerssetterextension/chaining_test.go | 316 ++++++++++++++++++ extension/headerssetterextension/config.go | 4 +- .../headerssetterextension/config_test.go | 16 + extension/headerssetterextension/extension.go | 115 ++++++- extension/headerssetterextension/go.mod | 23 +- extension/headerssetterextension/go.sum | 62 ++-- .../testdata/config.yaml | 6 + 9 files changed, 581 insertions(+), 57 deletions(-) create mode 100644 .chloggen/chaining.yaml create mode 100644 extension/headerssetterextension/chaining_test.go diff --git a/.chloggen/chaining.yaml b/.chloggen/chaining.yaml new file mode 100644 index 0000000000000..e90c0c6ce99ef --- /dev/null +++ b/.chloggen/chaining.yaml @@ -0,0 +1,30 @@ +# Use this changelog template to create an entry for release notes. + +# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' +change_type: enhancement + +# The name of the component, or a single word describing the area of concern, (e.g. receiver/filelog) +component: extension/headers_setter + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: "Add support for chaining with other auth extensions via `additional_auth` configuration parameter. This allows combining multiple authentication methods, such as OAuth2 for bearer token authentication and custom headers for additional metadata." + +# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists. +issues: [43797] + +# (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: | + The `additional_auth` parameter enables the `headers_setter` extension to work in conjunction + with other authentication extensions like `oauth2client`. The additional auth extension is called + first to apply its authentication, then headers_setter adds its configured headers on top. + +# If your change doesn't affect end users or the exported elements of any package, +# you should instead start your pull request title with [chore] or use the "Skip Changelog" label. +# 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: [user] diff --git a/extension/headerssetterextension/README.md b/extension/headerssetterextension/README.md index cd41aea25d2fe..98f20f0d27bee 100644 --- a/extension/headerssetterextension/README.md +++ b/extension/headerssetterextension/README.md @@ -23,7 +23,12 @@ header to the value extracted from the context. ## Configuration -The following settings are required: +The following settings are available: + +- `additional_auth` (Optional): The ID of another auth extension to chain with. + When specified, this extension will call the additional auth extension first, + then apply its own headers on top. This allows combining multiple authentication + methods, such as OAuth2 for authorization and custom headers for additional metadata. - `headers`: a list of header configuration objects that specify headers and their value sources. Each configuration object has the following properties: @@ -100,6 +105,65 @@ service: exporters: [ loki ] ``` +## Chaining with other Auth Extensions + +The `headers_setter` extension can be chained with another authentication extension +using the `additional_auth` parameter. This allows combining multiple authentication +methods, such as OAuth2 for bearer token authentication and custom headers for +additional metadata or routing information. + +### Example: Combining OAuth2 and Custom Headers + +```yaml +extensions: + oauth2client: + client_id: someclientid + client_secret: someclientsecret + token_url: https://example.com/oauth2/default/v1/token + scopes: ["api.metrics"] + # The timeout parameter is optional + timeout: 2s + + headers_setter: + # Chain with the oauth2client extension + additional_auth: oauth2client + headers: + - key: X-Scope-OrgID + value: acme-tenant + - key: X-Custom-Header + from_context: custom_metadata + +receivers: + otlp: + protocols: + http: + include_metadata: true + +exporters: + prometheusremotewrite: + endpoint: https://prometheus.example.com/api/v1/write + auth: + # Use headers_setter as the authenticator + # This will apply both OAuth2 and custom headers + authenticator: headers_setter + +service: + extensions: [oauth2client, headers_setter] + pipelines: + metrics: + receivers: [otlp] + exporters: [prometheusremotewrite] +``` + +In this configuration: +1. The `oauth2client` extension provides OAuth2 bearer token authentication +2. The `headers_setter` extension adds custom headers on top of the OAuth2 authentication +3. When the exporter sends data, both authentication methods are applied: + - OAuth2 adds the `Authorization: Bearer ` header + - Headers setter adds `X-Scope-OrgID` and `X-Custom-Header` headers +4. The collector ensures the `oauth2client` extension starts before `headers_setter` + due to the dependency relationship + [batch-processor]: https://github.com/open-telemetry/opentelemetry-collector/tree/main/processor/batchprocessor/README.md [batch-processor-preserve-metadata]: https://github.com/open-telemetry/opentelemetry-collector/tree/main/processor/batchprocessor/README.md#batching-and-client-metadata diff --git a/extension/headerssetterextension/chaining_test.go b/extension/headerssetterextension/chaining_test.go new file mode 100644 index 0000000000000..a9e0fb87192d1 --- /dev/null +++ b/extension/headerssetterextension/chaining_test.go @@ -0,0 +1,316 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package headerssetterextension + +import ( + "context" + "net/http" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/extension/extensionauth" + "go.uber.org/zap" + "google.golang.org/grpc/credentials" +) + +// mockAuthExtension is a mock auth extension for testing +type mockAuthExtension struct { + component.StartFunc + component.ShutdownFunc +} + +func (m *mockAuthExtension) RoundTripper(base http.RoundTripper) (http.RoundTripper, error) { + return &mockAuthRoundTripper{base: base, headerKey: "Authorization", headerValue: "Bearer token123"}, nil +} + +func (m *mockAuthExtension) PerRPCCredentials() (credentials.PerRPCCredentials, error) { + return &mockPerRPCCredentials{metadata: map[string]string{"authorization": "Bearer token123"}}, nil +} + +// mockAuthRoundTripper adds mock auth headers +type mockAuthRoundTripper struct { + base http.RoundTripper + headerKey string + headerValue string +} + +func (m *mockAuthRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + req2 := req.Clone(req.Context()) + if req2.Header == nil { + req2.Header = make(http.Header) + } + req2.Header.Set(m.headerKey, m.headerValue) + return m.base.RoundTrip(req2) +} + +// mockPerRPCCredentials provides mock gRPC credentials +type mockPerRPCCredentials struct { + metadata map[string]string +} + +func (m *mockPerRPCCredentials) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { + return m.metadata, nil +} + +func (m *mockPerRPCCredentials) RequireTransportSecurity() bool { + return false +} + +// mockHost provides a mock component.Host for testing +type mockHost struct { + component.Host + extensions map[component.ID]component.Component +} + +func (m *mockHost) GetExtensions() map[component.ID]component.Component { + return m.extensions +} + +func TestChainingWithAdditionalAuth_HTTP(t *testing.T) { + // Create auth extension ID + authID := component.MustNewIDWithName("mock_auth", "test") + + // Create headerssetter config with additional_auth + cfg := &Config{ + HeadersConfig: []HeaderConfig{ + { + Key: stringp("X-Custom-Header"), + Value: stringp("custom-value"), + Action: UPSERT, + }, + }, + AdditionalAuth: &authID, + } + + // Create headerssetter extension + ext, err := newHeadersSetterExtension(cfg, zap.NewNop()) + require.NoError(t, err) + require.NotNil(t, ext) + + // Create mock host with mock auth extension + host := &mockHost{ + Host: componenttest.NewNopHost(), + extensions: map[component.ID]component.Component{ + authID: &mockAuthExtension{}, + }, + } + + // Start the extension + err = ext.Start(context.Background(), host) + require.NoError(t, err) + + // Get the RoundTripper + captureRT := &requestCaptureRoundTripper{} + rt, err := ext.RoundTripper(captureRT) + require.NoError(t, err) + require.NotNil(t, rt) + + // Create a test request + req, err := http.NewRequest("GET", "http://example.com", nil) + require.NoError(t, err) + + // Execute the round trip + _, err = rt.RoundTrip(req) + require.NoError(t, err) + + // Verify both auth headers are present in the captured request + require.NotNil(t, captureRT.capturedRequest, "Request should be captured") + assert.Equal(t, "Bearer token123", captureRT.capturedRequest.Header.Get("Authorization"), "OAuth2 header should be present") + assert.Equal(t, "custom-value", captureRT.capturedRequest.Header.Get("X-Custom-Header"), "Custom header should be present") +} + +func TestChainingWithAdditionalAuth_gRPC(t *testing.T) { + // Create auth extension ID + authID := component.MustNewIDWithName("mock_auth", "test") + + // Create headerssetter config with additional_auth + cfg := &Config{ + HeadersConfig: []HeaderConfig{ + { + Key: stringp("x-custom-header"), + Value: stringp("custom-value"), + Action: UPSERT, + }, + }, + AdditionalAuth: &authID, + } + + // Create headerssetter extension + ext, err := newHeadersSetterExtension(cfg, zap.NewNop()) + require.NoError(t, err) + require.NotNil(t, ext) + + // Create mock host with mock auth extension + host := &mockHost{ + Host: componenttest.NewNopHost(), + extensions: map[component.ID]component.Component{ + authID: &mockAuthExtension{}, + }, + } + + // Start the extension + err = ext.Start(context.Background(), host) + require.NoError(t, err) + + // Get the PerRPCCredentials + creds, err := ext.PerRPCCredentials() + require.NoError(t, err) + require.NotNil(t, creds) + + // Get metadata + metadata, err := creds.GetRequestMetadata(context.Background()) + require.NoError(t, err) + + // Verify both auth metadata are present + assert.Equal(t, "Bearer token123", metadata["authorization"], "OAuth2 metadata should be present") + assert.Equal(t, "custom-value", metadata["x-custom-header"], "Custom metadata should be present") +} + +func TestChainingWithMissingAuth(t *testing.T) { + // Create auth extension ID that doesn't exist + authID := component.MustNewIDWithName("missing_auth", "test") + + // Create headerssetter config with additional_auth + cfg := &Config{ + HeadersConfig: []HeaderConfig{ + { + Key: stringp("X-Custom-Header"), + Value: stringp("custom-value"), + Action: UPSERT, + }, + }, + AdditionalAuth: &authID, + } + + // Create headerssetter extension + ext, err := newHeadersSetterExtension(cfg, zap.NewNop()) + require.NoError(t, err) + require.NotNil(t, ext) + + // Create mock host with NO auth extension + host := &mockHost{ + Host: componenttest.NewNopHost(), + extensions: map[component.ID]component.Component{}, + } + + // Start the extension + err = ext.Start(context.Background(), host) + require.NoError(t, err) + + // Get the RoundTripper - should fail + captureRT := &requestCaptureRoundTripper{} + _, err = ext.RoundTripper(captureRT) + require.Error(t, err) + assert.Contains(t, err.Error(), "auth extension") + assert.Contains(t, err.Error(), "not found") +} + +func TestWithoutAdditionalAuth(t *testing.T) { + // Create headerssetter config WITHOUT additional_auth + cfg := &Config{ + HeadersConfig: []HeaderConfig{ + { + Key: stringp("X-Custom-Header"), + Value: stringp("custom-value"), + Action: UPSERT, + }, + }, + AdditionalAuth: nil, + } + + // Create headerssetter extension + ext, err := newHeadersSetterExtension(cfg, zap.NewNop()) + require.NoError(t, err) + require.NotNil(t, ext) + + // Start should not be called when AdditionalAuth is nil + assert.Nil(t, ext.StartFunc) + + // Get the RoundTripper - should work without starting + captureRT := &requestCaptureRoundTripper{} + rt, err := ext.RoundTripper(captureRT) + require.NoError(t, err) + require.NotNil(t, rt) + + // Create a test request + req, err := http.NewRequest("GET", "http://example.com", nil) + require.NoError(t, err) + + // Execute the round trip + _, err = rt.RoundTrip(req) + require.NoError(t, err) + + // Verify only custom header is present in captured request + require.NotNil(t, captureRT.capturedRequest, "Request should be captured") + assert.Equal(t, "", captureRT.capturedRequest.Header.Get("Authorization"), "Auth header should not be present") + assert.Equal(t, "custom-value", captureRT.capturedRequest.Header.Get("X-Custom-Header"), "Custom header should be present") +} + +func TestDependencies(t *testing.T) { + authID := component.MustNewIDWithName("oauth2", "test") + + tests := []struct { + name string + additionalAuth *component.ID + expectedDeps []component.ID + }{ + { + name: "with additional auth", + additionalAuth: &authID, + expectedDeps: []component.ID{authID}, + }, + { + name: "without additional auth", + additionalAuth: nil, + expectedDeps: nil, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + cfg := &Config{ + HeadersConfig: []HeaderConfig{ + { + Key: stringp("X-Test"), + Value: stringp("test"), + Action: UPSERT, + }, + }, + AdditionalAuth: tt.additionalAuth, + } + + ext, err := newHeadersSetterExtension(cfg, zap.NewNop()) + require.NoError(t, err) + + deps := ext.Dependencies() + assert.Equal(t, tt.expectedDeps, deps) + }) + } +} + +// requestCaptureRoundTripper captures the request for testing +type requestCaptureRoundTripper struct { + capturedRequest *http.Request +} + +func (m *requestCaptureRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + // Capture the request for verification + m.capturedRequest = req + // Just return a dummy response + return &http.Response{ + StatusCode: 200, + Request: req, + }, nil +} + +// Ensure interface compliance +var ( + _ extensionauth.HTTPClient = (*mockAuthExtension)(nil) + _ extensionauth.GRPCClient = (*mockAuthExtension)(nil) + _ component.Host = (*mockHost)(nil) +) + diff --git a/extension/headerssetterextension/config.go b/extension/headerssetterextension/config.go index caea441f9b5d3..4ca3a20ee6824 100644 --- a/extension/headerssetterextension/config.go +++ b/extension/headerssetterextension/config.go @@ -6,6 +6,7 @@ package headerssetterextension // import "github.com/open-telemetry/opentelemetr import ( "errors" + "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/configopaque" ) @@ -17,7 +18,8 @@ var ( ) type Config struct { - HeadersConfig []HeaderConfig `mapstructure:"headers"` + HeadersConfig []HeaderConfig `mapstructure:"headers"` + AdditionalAuth *component.ID `mapstructure:"additional_auth"` // prevent unkeyed literal initialization _ struct{} diff --git a/extension/headerssetterextension/config_test.go b/extension/headerssetterextension/config_test.go index bddc34363da53..cfe863e3e721e 100644 --- a/extension/headerssetterextension/config_test.go +++ b/extension/headerssetterextension/config_test.go @@ -64,6 +64,22 @@ func TestLoadConfig(t *testing.T) { }, }, }, + { + id: component.NewIDWithName(metadata.Type, "2"), + expected: &Config{ + AdditionalAuth: func() *component.ID { + id := component.MustNewID("oauth2client") + return &id + }(), + HeadersConfig: []HeaderConfig{ + { + Key: stringp("X-Custom-Header"), + Value: stringp("custom-value"), + Action: UPSERT, + }, + }, + }, + }, } for _, tt := range tests { t.Run(tt.id.String(), func(t *testing.T) { diff --git a/extension/headerssetterextension/extension.go b/extension/headerssetterextension/extension.go index 6dc336f20fd41..8de2b6633f5e9 100644 --- a/extension/headerssetterextension/extension.go +++ b/extension/headerssetterextension/extension.go @@ -12,6 +12,7 @@ import ( "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/extension" "go.opentelemetry.io/collector/extension/extensionauth" + "go.opentelemetry.io/collector/extension/extensioncapabilities" "go.uber.org/zap" "google.golang.org/grpc/credentials" @@ -25,27 +26,86 @@ type header struct { } var ( - _ extension.Extension = (*headerSetterExtension)(nil) - _ extensionauth.HTTPClient = (*headerSetterExtension)(nil) - _ extensionauth.GRPCClient = (*headerSetterExtension)(nil) + _ extension.Extension = (*headerSetterExtension)(nil) + _ extensionauth.HTTPClient = (*headerSetterExtension)(nil) + _ extensionauth.GRPCClient = (*headerSetterExtension)(nil) + _ extensioncapabilities.Dependent = (*headerSetterExtension)(nil) ) type headerSetterExtension struct { component.StartFunc component.ShutdownFunc - headers []header + headers []header + additionalAuth *component.ID + host component.Host +} + +// Dependencies implements extensioncapabilities.Dependent. +func (h *headerSetterExtension) Dependencies() []component.ID { + if h.additionalAuth == nil { + return nil + } + return []component.ID{*h.additionalAuth} +} + +// Start stores the host for later use in getting the additional auth extension. +func (h *headerSetterExtension) Start(_ context.Context, host component.Host) error { + h.host = host + return nil } // PerRPCCredentials implements extensionauth.GRPCClient. func (h *headerSetterExtension) PerRPCCredentials() (credentials.PerRPCCredentials, error) { - return &headersPerRPC{headers: h.headers}, nil + var baseCredentials credentials.PerRPCCredentials + + // If additional_auth is configured, chain with it first + if h.additionalAuth != nil && h.host != nil { + ext := h.host.GetExtensions()[*h.additionalAuth] + if ext == nil { + return nil, fmt.Errorf("auth extension %v not found", h.additionalAuth) + } + + if grpcClient, ok := ext.(extensionauth.GRPCClient); ok { + var err error + baseCredentials, err = grpcClient.PerRPCCredentials() + if err != nil { + return nil, fmt.Errorf("failed to get PerRPCCredentials from %v: %w", h.additionalAuth, err) + } + } + } + + return &headersPerRPC{ + headers: h.headers, + baseCredentials: baseCredentials, + }, nil } // RoundTripper implements extensionauth.HTTPClient. func (h *headerSetterExtension) RoundTripper(base http.RoundTripper) (http.RoundTripper, error) { + // If additional_auth is configured, chain with it first + var baseRT http.RoundTripper = base + + if h.additionalAuth != nil && h.host != nil { + // Get the auth extension from host + ext := h.host.GetExtensions()[*h.additionalAuth] + if ext == nil { + return nil, fmt.Errorf("auth extension %v not found", h.additionalAuth) + } + + // Check if it implements HTTPClient + if httpClient, ok := ext.(extensionauth.HTTPClient); ok { + var err error + baseRT, err = httpClient.RoundTripper(base) + if err != nil { + return nil, fmt.Errorf("failed to get RoundTripper from %v: %w", h.additionalAuth, err) + } + } + } + + // Now wrap with our headers return &headersRoundTripper{ - base: base, + base: baseRT, headers: h.headers, }, nil } @@ -101,21 +161,46 @@ func newHeadersSetterExtension(cfg *Config, logger *zap.Logger) (*headerSetterEx headers = append(headers, header{action: a, source: s}) } - return &headerSetterExtension{headers: headers}, nil + ext := &headerSetterExtension{ + headers: headers, + additionalAuth: cfg.AdditionalAuth, + } + + // Enable Start method if additional_auth is configured + if cfg.AdditionalAuth != nil { + ext.StartFunc = ext.Start + } + + return ext, nil } // headersPerRPC is a gRPC credentials.PerRPCCredentials implementation sets // headers with values extracted from provided sources. type headersPerRPC struct { - headers []header + headers []header + baseCredentials credentials.PerRPCCredentials } // GetRequestMetadata returns the request metadata to be used with the RPC. func (h *headersPerRPC) GetRequestMetadata( ctx context.Context, - _ ...string, + uri ...string, ) (map[string]string, error) { - metadata := make(map[string]string, len(h.headers)) + // Start with base credentials if available + metadata := make(map[string]string) + + if h.baseCredentials != nil { + baseMetadata, err := h.baseCredentials.GetRequestMetadata(ctx, uri...) + if err != nil { + return nil, err + } + // Copy base metadata + for k, v := range baseMetadata { + metadata[k] = v + } + } + + // Now apply our headers on top for _, header := range h.headers { value, err := header.source.Get(ctx) if err != nil { @@ -126,10 +211,12 @@ func (h *headersPerRPC) GetRequestMetadata( return metadata, nil } -// RequireTransportSecurity always returns false for this implementation. -// The header setter is not sending auth data, so it should not require -// a transport security. -func (*headersPerRPC) RequireTransportSecurity() bool { +// RequireTransportSecurity returns whether transport security is required. +// If chained with another auth extension, delegate to it. +func (h *headersPerRPC) RequireTransportSecurity() bool { + if h.baseCredentials != nil { + return h.baseCredentials.RequireTransportSecurity() + } return false } diff --git a/extension/headerssetterextension/go.mod b/extension/headerssetterextension/go.mod index 0c8122fa07bff..0ac0266b7ec43 100644 --- a/extension/headerssetterextension/go.mod +++ b/extension/headerssetterextension/go.mod @@ -4,15 +4,16 @@ go 1.24.0 require ( github.com/stretchr/testify v1.11.1 - go.opentelemetry.io/collector/client v1.46.0 - go.opentelemetry.io/collector/component v1.46.0 - go.opentelemetry.io/collector/component/componenttest v0.140.0 - go.opentelemetry.io/collector/config/configopaque v1.46.0 - go.opentelemetry.io/collector/confmap v1.46.0 - go.opentelemetry.io/collector/confmap/xconfmap v0.140.0 - go.opentelemetry.io/collector/extension v1.46.0 - go.opentelemetry.io/collector/extension/extensionauth v1.46.0 - go.opentelemetry.io/collector/extension/extensiontest v0.140.0 + go.opentelemetry.io/collector/client v1.44.1-0.20251028105454-507664fb82dc + go.opentelemetry.io/collector/component v1.45.0 + go.opentelemetry.io/collector/component/componenttest v0.138.1-0.20251028105454-507664fb82dc + go.opentelemetry.io/collector/config/configopaque v1.44.1-0.20251028105454-507664fb82dc + go.opentelemetry.io/collector/confmap v1.45.0 + go.opentelemetry.io/collector/confmap/xconfmap v0.138.1-0.20251028105454-507664fb82dc + go.opentelemetry.io/collector/extension v1.45.0 + go.opentelemetry.io/collector/extension/extensionauth v1.44.1-0.20251028105454-507664fb82dc + go.opentelemetry.io/collector/extension/extensioncapabilities v0.139.0 + go.opentelemetry.io/collector/extension/extensiontest v0.138.1-0.20251028105454-507664fb82dc go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 google.golang.org/grpc v1.76.0 @@ -36,8 +37,8 @@ require ( github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/pmezard/go-difflib v1.0.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/collector/featuregate v1.46.0 // indirect - go.opentelemetry.io/collector/pdata v1.46.0 // indirect + go.opentelemetry.io/collector/featuregate v1.45.0 // indirect + go.opentelemetry.io/collector/pdata v1.45.0 // indirect go.opentelemetry.io/otel v1.38.0 // indirect go.opentelemetry.io/otel/metric v1.38.0 // indirect go.opentelemetry.io/otel/sdk v1.38.0 // indirect diff --git a/extension/headerssetterextension/go.sum b/extension/headerssetterextension/go.sum index 3bd488b8efc4c..f3898b7447a0e 100644 --- a/extension/headerssetterextension/go.sum +++ b/extension/headerssetterextension/go.sum @@ -49,30 +49,32 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/collector/client v1.46.0 h1:nAEVyKIECez8P92RXa78mjRvaynkivYdukT07lzF7Gs= -go.opentelemetry.io/collector/client v1.46.0/go.mod h1:/Y2bm0RdD8LKIEQOX5YqqjglKNb8AYCdDuKb04/fURw= -go.opentelemetry.io/collector/component v1.46.0 h1:m+BF5sT4wQ3AiPcMBVgYPhxTZNGYGDkgMcKFivEznSo= -go.opentelemetry.io/collector/component v1.46.0/go.mod h1:Zp+JaUgGrPvt4JNzJU1MD7KcZhauab9W0pCykgGPSN0= -go.opentelemetry.io/collector/component/componenttest v0.140.0 h1:/g7yETZ7Flq4v9qSmN9jux0LecMPJDwr8HtvhOgN6H4= -go.opentelemetry.io/collector/component/componenttest v0.140.0/go.mod h1:40PZd6rjqHH5UCqxB6nAvnHtDTwZaSWf1En1u1mbA8k= -go.opentelemetry.io/collector/config/configopaque v1.46.0 h1:lEh2VMyxOKJHa02Sj+O5INWTJZygYN2GKa5spWMGQQI= -go.opentelemetry.io/collector/config/configopaque v1.46.0/go.mod h1:OPmPZMkuks+mxK5Mtb0s20o0++BIBPq9oTEh2l4yPqk= -go.opentelemetry.io/collector/confmap v1.46.0 h1:C/LfkYsKGWgGOvsUz70iUuxbSzSLaXZMSi3QVX6oJsw= -go.opentelemetry.io/collector/confmap v1.46.0/go.mod h1:uqrwOuf+1PeZ9Zo/IDV9hJlvFy2eRKYUajkM1Lsmyto= -go.opentelemetry.io/collector/confmap/xconfmap v0.140.0 h1:rTHo7f3d4h00qCpb4hYnu/+n48sd5Hd4E9KT47QTgZA= -go.opentelemetry.io/collector/confmap/xconfmap v0.140.0/go.mod h1:KInqGVGClR7dDDJLkHsl3riO03et7TaBrGKVD5pD4i0= -go.opentelemetry.io/collector/consumer v1.46.0 h1:yG5zCCgbB2d0KobuYNZWdg8fy/HV2cA/ls0fYzVKBQ4= -go.opentelemetry.io/collector/consumer v1.46.0/go.mod h1:3hjV46vdz8zExuTKlxRge3VdeVUr0PJETqIMewKThNc= -go.opentelemetry.io/collector/extension v1.46.0 h1:+ATT9ADkMUR0cRH8J53vU9MRJ9UspRC0B+BqDGW1aRE= -go.opentelemetry.io/collector/extension v1.46.0/go.mod h1:/NGiZQFF7hTyfRULTgtYw27cIW8i0hWUTp12lDftZS0= -go.opentelemetry.io/collector/extension/extensionauth v1.46.0 h1:JvGu9tp+PIPgvXUSSyKMqShtK44ooK6+FAtpBnvaPPc= -go.opentelemetry.io/collector/extension/extensionauth v1.46.0/go.mod h1:6Sh0hqPfPqpg0ErCoNPO/ky2NdfGmUX+G5wekPx7A7U= -go.opentelemetry.io/collector/extension/extensiontest v0.140.0 h1:a4ggfsp73GA9oGCxBtmQJE827SRq36E+YQIZ0MGIKVQ= -go.opentelemetry.io/collector/extension/extensiontest v0.140.0/go.mod h1:TKR1zB0CtJ3tedNyUUaeCw5O2qPlFNjHKmh2ri53uTU= -go.opentelemetry.io/collector/featuregate v1.46.0 h1:z3JlymFdWW6aDo9cYAJ6bCqT+OI2DlurJ9P8HqfuKWQ= -go.opentelemetry.io/collector/featuregate v1.46.0/go.mod h1:d0tiRzVYrytB6LkcYgz2ESFTv7OktRPQe0QEQcPt1L4= -go.opentelemetry.io/collector/pdata v1.46.0 h1:XzhnIWNtc/gbOyFiewRvybR4s3phKHrWxL3yc/wVLDo= -go.opentelemetry.io/collector/pdata v1.46.0/go.mod h1:D2e3BWCUC/bUg29WNzCDVN7Ab0Gzk7hGXZL2pnrDOn0= +go.opentelemetry.io/collector/client v1.44.1-0.20251028105454-507664fb82dc h1:3AUMlcGeApVmn21cYsj1wCjmsg3kTj9D4KBBS25OCcE= +go.opentelemetry.io/collector/client v1.44.1-0.20251028105454-507664fb82dc/go.mod h1:BQQlxV/UB+p9vJy2F33pMCWX9ccANaT1/jb0JFQURk0= +go.opentelemetry.io/collector/component v1.45.0 h1:gGFfVdbQ+1YuyUkJjWo85I7euu3H/CiupuzCHv8OgHA= +go.opentelemetry.io/collector/component v1.45.0/go.mod h1:xoNFnRKE8Iv6gmlqAKgjayWraRnDcYLLgrPt9VgyO2g= +go.opentelemetry.io/collector/component/componenttest v0.138.1-0.20251028105454-507664fb82dc h1:N3cDnzedtD0x2dbTJvdGnTYaCoe/m/j9TO1TyCNpifY= +go.opentelemetry.io/collector/component/componenttest v0.138.1-0.20251028105454-507664fb82dc/go.mod h1:eSlTDfT9WUAdbjnXORjLCxtKgZl+Mm+dkJkez8PnoM0= +go.opentelemetry.io/collector/config/configopaque v1.44.1-0.20251028105454-507664fb82dc h1:TvZVJ2AnpvNThlLcZ1vD+qejP2PwUyLzn8MeB23MnBA= +go.opentelemetry.io/collector/config/configopaque v1.44.1-0.20251028105454-507664fb82dc/go.mod h1:z4EOVwhc3D7IT4W58Ez7Pjqm1pJkM+oVOWFuxxMHvWA= +go.opentelemetry.io/collector/confmap v1.45.0 h1:7M7TTlpzX4r+mIzP/ARdxZBAvI4N+1V96phDane+akU= +go.opentelemetry.io/collector/confmap v1.45.0/go.mod h1:AE1dnkjv0T9gptsh5+mTX0XFGdXx0n7JS4b7CcPfJ6Q= +go.opentelemetry.io/collector/confmap/xconfmap v0.138.1-0.20251028105454-507664fb82dc h1:VfMLnwEBf3CXe/x64G61DvmjOGnawaB6mk6OOSnVIvM= +go.opentelemetry.io/collector/confmap/xconfmap v0.138.1-0.20251028105454-507664fb82dc/go.mod h1:rk8hjMqoHX2KYUjGUPaiWo3qapj4o8UpQWWsdEqvorg= +go.opentelemetry.io/collector/consumer v1.44.0 h1:vkKJTfQYBQNuKas0P1zv1zxJjHvmMa/n7d6GiSHT0aw= +go.opentelemetry.io/collector/consumer v1.44.0/go.mod h1:t6u5+0FBUtyZLVFhVPgFabd4Iph7rP+b9VkxaY8dqXU= +go.opentelemetry.io/collector/extension v1.45.0 h1:yZQwPkqeE4cq1VUOd/tsZQ1lXVaIyhqxKTlev1mEa+0= +go.opentelemetry.io/collector/extension v1.45.0/go.mod h1:8LDwM7it8T17zprOMx6scpU42dHNfKhtxueleHx1Bho= +go.opentelemetry.io/collector/extension/extensionauth v1.44.1-0.20251028105454-507664fb82dc h1:UNKb54RO9ezeWspFJRyyxx6yeFluEl3al3UpU/IKJ50= +go.opentelemetry.io/collector/extension/extensionauth v1.44.1-0.20251028105454-507664fb82dc/go.mod h1:6Sh0hqPfPqpg0ErCoNPO/ky2NdfGmUX+G5wekPx7A7U= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.139.0 h1:z+buXvUCCH78iyR7NaG9+a5xBEZ5nx5G7sdDZw/i4Io= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.139.0/go.mod h1:mrsfSmuj3HxIeL8kmqUYp2Kc9Zzi3/FTzwAtjVPlt0I= +go.opentelemetry.io/collector/extension/extensiontest v0.138.1-0.20251028105454-507664fb82dc h1:Fm7v5PlAqcYVXS0e+/8S+x8+mjiEUGEWyKa0eAnUZ/o= +go.opentelemetry.io/collector/extension/extensiontest v0.138.1-0.20251028105454-507664fb82dc/go.mod h1:zzGCEaLIx9bM5SwnJECiJNSj8aKiOpjB0c/uGx1ujdk= +go.opentelemetry.io/collector/featuregate v1.45.0 h1:D06hpf1F2KzKC+qXLmVv5e8IZpgCyZVeVVC8iOQxVmw= +go.opentelemetry.io/collector/featuregate v1.45.0/go.mod h1:d0tiRzVYrytB6LkcYgz2ESFTv7OktRPQe0QEQcPt1L4= +go.opentelemetry.io/collector/pdata v1.45.0 h1:q4XaISpeX640BcwXwb2mKOVw/gb67r22HjGWl8sbWsk= +go.opentelemetry.io/collector/pdata v1.45.0/go.mod h1:5q2f001YhwMQO8QvpFhCOa4Cq/vtwX9W4HRMsXkU/nE= go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= @@ -83,12 +85,12 @@ go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6 go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= -go.opentelemetry.io/proto/slim/otlp v1.9.0 h1:fPVMv8tP3TrsqlkH1HWYUpbCY9cAIemx184VGkS6vlE= -go.opentelemetry.io/proto/slim/otlp v1.9.0/go.mod h1:xXdeJJ90Gqyll+orzUkY4bOd2HECo5JofeoLpymVqdI= -go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.2.0 h1:o13nadWDNkH/quoDomDUClnQBpdQQ2Qqv0lQBjIXjE8= -go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.2.0/go.mod h1:Gyb6Xe7FTi/6xBHwMmngGoHqL0w29Y4eW8TGFzpefGA= -go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.2.0 h1:EiUYvtwu6PMrMHVjcPfnsG3v+ajPkbUeH+IL93+QYyk= -go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.2.0/go.mod h1:mUUHKFiN2SST3AhJ8XhJxEoeVW12oqfXog0Bo8W3Ec4= +go.opentelemetry.io/proto/slim/otlp v1.8.0 h1:afcLwp2XOeCbGrjufT1qWyruFt+6C9g5SOuymrSPUXQ= +go.opentelemetry.io/proto/slim/otlp v1.8.0/go.mod h1:Yaa5fjYm1SMCq0hG0x/87wV1MP9H5xDuG/1+AhvBcsI= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.1.0 h1:Uc+elixz922LHx5colXGi1ORbsW8DTIGM+gg+D9V7HE= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.1.0/go.mod h1:VyU6dTWBWv6h9w/+DYgSZAPMabWbPTFTuxp25sM8+s0= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.1.0 h1:i8YpvWGm/Uq1koL//bnbJ/26eV3OrKWm09+rDYo7keU= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.1.0/go.mod h1:pQ70xHY/ZVxNUBPn+qUWPl8nwai87eWdqL3M37lNi9A= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= diff --git a/extension/headerssetterextension/testdata/config.yaml b/extension/headerssetterextension/testdata/config.yaml index 4762f609d97f0..e2384f6e097cf 100644 --- a/extension/headerssetterextension/testdata/config.yaml +++ b/extension/headerssetterextension/testdata/config.yaml @@ -15,3 +15,9 @@ headers_setter/1: value: "user_id" - key: User-ID action: delete +headers_setter/2: + additional_auth: oauth2client + headers: + - key: X-Custom-Header + action: upsert + value: custom-value From 730b20979243f739dd1ce73b7d8b0f0239119ae0 Mon Sep 17 00:00:00 2001 From: Kushal Shukla Date: Wed, 12 Nov 2025 01:04:05 +0530 Subject: [PATCH 2/2] Modify some lingtin errors Signed-off-by: Kushal Shukla --- .../headerssetterextension/chaining_test.go | 25 ++++---- extension/headerssetterextension/extension.go | 40 ++++++++---- extension/headerssetterextension/go.mod | 24 +++---- extension/headerssetterextension/go.sum | 64 +++++++++---------- 4 files changed, 82 insertions(+), 71 deletions(-) diff --git a/extension/headerssetterextension/chaining_test.go b/extension/headerssetterextension/chaining_test.go index a9e0fb87192d1..e2c167bfc162c 100644 --- a/extension/headerssetterextension/chaining_test.go +++ b/extension/headerssetterextension/chaining_test.go @@ -23,11 +23,11 @@ type mockAuthExtension struct { component.ShutdownFunc } -func (m *mockAuthExtension) RoundTripper(base http.RoundTripper) (http.RoundTripper, error) { +func (*mockAuthExtension) RoundTripper(base http.RoundTripper) (http.RoundTripper, error) { return &mockAuthRoundTripper{base: base, headerKey: "Authorization", headerValue: "Bearer token123"}, nil } -func (m *mockAuthExtension) PerRPCCredentials() (credentials.PerRPCCredentials, error) { +func (*mockAuthExtension) PerRPCCredentials() (credentials.PerRPCCredentials, error) { return &mockPerRPCCredentials{metadata: map[string]string{"authorization": "Bearer token123"}}, nil } @@ -52,11 +52,11 @@ type mockPerRPCCredentials struct { metadata map[string]string } -func (m *mockPerRPCCredentials) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { +func (m *mockPerRPCCredentials) GetRequestMetadata(_ context.Context, _ ...string) (map[string]string, error) { return m.metadata, nil } -func (m *mockPerRPCCredentials) RequireTransportSecurity() bool { +func (*mockPerRPCCredentials) RequireTransportSecurity() bool { return false } @@ -100,7 +100,7 @@ func TestChainingWithAdditionalAuth_HTTP(t *testing.T) { } // Start the extension - err = ext.Start(context.Background(), host) + err = ext.Start(t.Context(), host) require.NoError(t, err) // Get the RoundTripper @@ -110,7 +110,7 @@ func TestChainingWithAdditionalAuth_HTTP(t *testing.T) { require.NotNil(t, rt) // Create a test request - req, err := http.NewRequest("GET", "http://example.com", nil) + req, err := http.NewRequest(http.MethodGet, "http://example.com", http.NoBody) require.NoError(t, err) // Execute the round trip @@ -153,7 +153,7 @@ func TestChainingWithAdditionalAuth_gRPC(t *testing.T) { } // Start the extension - err = ext.Start(context.Background(), host) + err = ext.Start(t.Context(), host) require.NoError(t, err) // Get the PerRPCCredentials @@ -162,7 +162,7 @@ func TestChainingWithAdditionalAuth_gRPC(t *testing.T) { require.NotNil(t, creds) // Get metadata - metadata, err := creds.GetRequestMetadata(context.Background()) + metadata, err := creds.GetRequestMetadata(t.Context()) require.NoError(t, err) // Verify both auth metadata are present @@ -198,7 +198,7 @@ func TestChainingWithMissingAuth(t *testing.T) { } // Start the extension - err = ext.Start(context.Background(), host) + err = ext.Start(t.Context(), host) require.NoError(t, err) // Get the RoundTripper - should fail @@ -237,7 +237,7 @@ func TestWithoutAdditionalAuth(t *testing.T) { require.NotNil(t, rt) // Create a test request - req, err := http.NewRequest("GET", "http://example.com", nil) + req, err := http.NewRequest(http.MethodGet, "http://example.com", http.NoBody) require.NoError(t, err) // Execute the round trip @@ -246,7 +246,7 @@ func TestWithoutAdditionalAuth(t *testing.T) { // Verify only custom header is present in captured request require.NotNil(t, captureRT.capturedRequest, "Request should be captured") - assert.Equal(t, "", captureRT.capturedRequest.Header.Get("Authorization"), "Auth header should not be present") + assert.Empty(t, captureRT.capturedRequest.Header.Get("Authorization"), "Auth header should not be present") assert.Equal(t, "custom-value", captureRT.capturedRequest.Header.Get("X-Custom-Header"), "Custom header should be present") } @@ -302,7 +302,7 @@ func (m *requestCaptureRoundTripper) RoundTrip(req *http.Request) (*http.Respons m.capturedRequest = req // Just return a dummy response return &http.Response{ - StatusCode: 200, + StatusCode: http.StatusOK, Request: req, }, nil } @@ -313,4 +313,3 @@ var ( _ extensionauth.GRPCClient = (*mockAuthExtension)(nil) _ component.Host = (*mockHost)(nil) ) - diff --git a/extension/headerssetterextension/extension.go b/extension/headerssetterextension/extension.go index 8de2b6633f5e9..2c1b34d112bca 100644 --- a/extension/headerssetterextension/extension.go +++ b/extension/headerssetterextension/extension.go @@ -55,19 +55,33 @@ func (h *headerSetterExtension) Start(_ context.Context, host component.Host) er return nil } +// getAdditionalAuthExtension retrieves the configured additional auth extension if present. +// Returns nil if no additional auth is configured. +func (h *headerSetterExtension) getAdditionalAuthExtension() (component.Component, error) { + if h.additionalAuth == nil || h.host == nil { + return nil, nil + } + + ext := h.host.GetExtensions()[*h.additionalAuth] + if ext == nil { + return nil, fmt.Errorf("auth extension %v not found", h.additionalAuth) + } + + return ext, nil +} + // PerRPCCredentials implements extensionauth.GRPCClient. func (h *headerSetterExtension) PerRPCCredentials() (credentials.PerRPCCredentials, error) { var baseCredentials credentials.PerRPCCredentials // If additional_auth is configured, chain with it first - if h.additionalAuth != nil && h.host != nil { - ext := h.host.GetExtensions()[*h.additionalAuth] - if ext == nil { - return nil, fmt.Errorf("auth extension %v not found", h.additionalAuth) - } + ext, err := h.getAdditionalAuthExtension() + if err != nil { + return nil, err + } + if ext != nil { if grpcClient, ok := ext.(extensionauth.GRPCClient); ok { - var err error baseCredentials, err = grpcClient.PerRPCCredentials() if err != nil { return nil, fmt.Errorf("failed to get PerRPCCredentials from %v: %w", h.additionalAuth, err) @@ -84,18 +98,16 @@ func (h *headerSetterExtension) PerRPCCredentials() (credentials.PerRPCCredentia // RoundTripper implements extensionauth.HTTPClient. func (h *headerSetterExtension) RoundTripper(base http.RoundTripper) (http.RoundTripper, error) { // If additional_auth is configured, chain with it first - var baseRT http.RoundTripper = base + baseRT := base - if h.additionalAuth != nil && h.host != nil { - // Get the auth extension from host - ext := h.host.GetExtensions()[*h.additionalAuth] - if ext == nil { - return nil, fmt.Errorf("auth extension %v not found", h.additionalAuth) - } + ext, err := h.getAdditionalAuthExtension() + if err != nil { + return nil, err + } + if ext != nil { // Check if it implements HTTPClient if httpClient, ok := ext.(extensionauth.HTTPClient); ok { - var err error baseRT, err = httpClient.RoundTripper(base) if err != nil { return nil, fmt.Errorf("failed to get RoundTripper from %v: %w", h.additionalAuth, err) diff --git a/extension/headerssetterextension/go.mod b/extension/headerssetterextension/go.mod index 0ac0266b7ec43..6b54a1d3408ec 100644 --- a/extension/headerssetterextension/go.mod +++ b/extension/headerssetterextension/go.mod @@ -4,16 +4,16 @@ go 1.24.0 require ( github.com/stretchr/testify v1.11.1 - go.opentelemetry.io/collector/client v1.44.1-0.20251028105454-507664fb82dc - go.opentelemetry.io/collector/component v1.45.0 - go.opentelemetry.io/collector/component/componenttest v0.138.1-0.20251028105454-507664fb82dc - go.opentelemetry.io/collector/config/configopaque v1.44.1-0.20251028105454-507664fb82dc - go.opentelemetry.io/collector/confmap v1.45.0 - go.opentelemetry.io/collector/confmap/xconfmap v0.138.1-0.20251028105454-507664fb82dc - go.opentelemetry.io/collector/extension v1.45.0 - go.opentelemetry.io/collector/extension/extensionauth v1.44.1-0.20251028105454-507664fb82dc - go.opentelemetry.io/collector/extension/extensioncapabilities v0.139.0 - go.opentelemetry.io/collector/extension/extensiontest v0.138.1-0.20251028105454-507664fb82dc + go.opentelemetry.io/collector/client v1.46.0 + go.opentelemetry.io/collector/component v1.46.0 + go.opentelemetry.io/collector/component/componenttest v0.140.0 + go.opentelemetry.io/collector/config/configopaque v1.46.0 + go.opentelemetry.io/collector/confmap v1.46.0 + go.opentelemetry.io/collector/confmap/xconfmap v0.140.0 + go.opentelemetry.io/collector/extension v1.46.0 + go.opentelemetry.io/collector/extension/extensionauth v1.46.0 + go.opentelemetry.io/collector/extension/extensioncapabilities v0.140.0 + go.opentelemetry.io/collector/extension/extensiontest v0.140.0 go.uber.org/goleak v1.3.0 go.uber.org/zap v1.27.0 google.golang.org/grpc v1.76.0 @@ -37,8 +37,8 @@ require ( github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/pmezard/go-difflib v1.0.0 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/collector/featuregate v1.45.0 // indirect - go.opentelemetry.io/collector/pdata v1.45.0 // indirect + go.opentelemetry.io/collector/featuregate v1.46.0 // indirect + go.opentelemetry.io/collector/pdata v1.46.0 // indirect go.opentelemetry.io/otel v1.38.0 // indirect go.opentelemetry.io/otel/metric v1.38.0 // indirect go.opentelemetry.io/otel/sdk v1.38.0 // indirect diff --git a/extension/headerssetterextension/go.sum b/extension/headerssetterextension/go.sum index f3898b7447a0e..3f9b38fcf5497 100644 --- a/extension/headerssetterextension/go.sum +++ b/extension/headerssetterextension/go.sum @@ -49,32 +49,32 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/collector/client v1.44.1-0.20251028105454-507664fb82dc h1:3AUMlcGeApVmn21cYsj1wCjmsg3kTj9D4KBBS25OCcE= -go.opentelemetry.io/collector/client v1.44.1-0.20251028105454-507664fb82dc/go.mod h1:BQQlxV/UB+p9vJy2F33pMCWX9ccANaT1/jb0JFQURk0= -go.opentelemetry.io/collector/component v1.45.0 h1:gGFfVdbQ+1YuyUkJjWo85I7euu3H/CiupuzCHv8OgHA= -go.opentelemetry.io/collector/component v1.45.0/go.mod h1:xoNFnRKE8Iv6gmlqAKgjayWraRnDcYLLgrPt9VgyO2g= -go.opentelemetry.io/collector/component/componenttest v0.138.1-0.20251028105454-507664fb82dc h1:N3cDnzedtD0x2dbTJvdGnTYaCoe/m/j9TO1TyCNpifY= -go.opentelemetry.io/collector/component/componenttest v0.138.1-0.20251028105454-507664fb82dc/go.mod h1:eSlTDfT9WUAdbjnXORjLCxtKgZl+Mm+dkJkez8PnoM0= -go.opentelemetry.io/collector/config/configopaque v1.44.1-0.20251028105454-507664fb82dc h1:TvZVJ2AnpvNThlLcZ1vD+qejP2PwUyLzn8MeB23MnBA= -go.opentelemetry.io/collector/config/configopaque v1.44.1-0.20251028105454-507664fb82dc/go.mod h1:z4EOVwhc3D7IT4W58Ez7Pjqm1pJkM+oVOWFuxxMHvWA= -go.opentelemetry.io/collector/confmap v1.45.0 h1:7M7TTlpzX4r+mIzP/ARdxZBAvI4N+1V96phDane+akU= -go.opentelemetry.io/collector/confmap v1.45.0/go.mod h1:AE1dnkjv0T9gptsh5+mTX0XFGdXx0n7JS4b7CcPfJ6Q= -go.opentelemetry.io/collector/confmap/xconfmap v0.138.1-0.20251028105454-507664fb82dc h1:VfMLnwEBf3CXe/x64G61DvmjOGnawaB6mk6OOSnVIvM= -go.opentelemetry.io/collector/confmap/xconfmap v0.138.1-0.20251028105454-507664fb82dc/go.mod h1:rk8hjMqoHX2KYUjGUPaiWo3qapj4o8UpQWWsdEqvorg= -go.opentelemetry.io/collector/consumer v1.44.0 h1:vkKJTfQYBQNuKas0P1zv1zxJjHvmMa/n7d6GiSHT0aw= -go.opentelemetry.io/collector/consumer v1.44.0/go.mod h1:t6u5+0FBUtyZLVFhVPgFabd4Iph7rP+b9VkxaY8dqXU= -go.opentelemetry.io/collector/extension v1.45.0 h1:yZQwPkqeE4cq1VUOd/tsZQ1lXVaIyhqxKTlev1mEa+0= -go.opentelemetry.io/collector/extension v1.45.0/go.mod h1:8LDwM7it8T17zprOMx6scpU42dHNfKhtxueleHx1Bho= -go.opentelemetry.io/collector/extension/extensionauth v1.44.1-0.20251028105454-507664fb82dc h1:UNKb54RO9ezeWspFJRyyxx6yeFluEl3al3UpU/IKJ50= -go.opentelemetry.io/collector/extension/extensionauth v1.44.1-0.20251028105454-507664fb82dc/go.mod h1:6Sh0hqPfPqpg0ErCoNPO/ky2NdfGmUX+G5wekPx7A7U= -go.opentelemetry.io/collector/extension/extensioncapabilities v0.139.0 h1:z+buXvUCCH78iyR7NaG9+a5xBEZ5nx5G7sdDZw/i4Io= -go.opentelemetry.io/collector/extension/extensioncapabilities v0.139.0/go.mod h1:mrsfSmuj3HxIeL8kmqUYp2Kc9Zzi3/FTzwAtjVPlt0I= -go.opentelemetry.io/collector/extension/extensiontest v0.138.1-0.20251028105454-507664fb82dc h1:Fm7v5PlAqcYVXS0e+/8S+x8+mjiEUGEWyKa0eAnUZ/o= -go.opentelemetry.io/collector/extension/extensiontest v0.138.1-0.20251028105454-507664fb82dc/go.mod h1:zzGCEaLIx9bM5SwnJECiJNSj8aKiOpjB0c/uGx1ujdk= -go.opentelemetry.io/collector/featuregate v1.45.0 h1:D06hpf1F2KzKC+qXLmVv5e8IZpgCyZVeVVC8iOQxVmw= -go.opentelemetry.io/collector/featuregate v1.45.0/go.mod h1:d0tiRzVYrytB6LkcYgz2ESFTv7OktRPQe0QEQcPt1L4= -go.opentelemetry.io/collector/pdata v1.45.0 h1:q4XaISpeX640BcwXwb2mKOVw/gb67r22HjGWl8sbWsk= -go.opentelemetry.io/collector/pdata v1.45.0/go.mod h1:5q2f001YhwMQO8QvpFhCOa4Cq/vtwX9W4HRMsXkU/nE= +go.opentelemetry.io/collector/client v1.46.0 h1:nAEVyKIECez8P92RXa78mjRvaynkivYdukT07lzF7Gs= +go.opentelemetry.io/collector/client v1.46.0/go.mod h1:/Y2bm0RdD8LKIEQOX5YqqjglKNb8AYCdDuKb04/fURw= +go.opentelemetry.io/collector/component v1.46.0 h1:m+BF5sT4wQ3AiPcMBVgYPhxTZNGYGDkgMcKFivEznSo= +go.opentelemetry.io/collector/component v1.46.0/go.mod h1:Zp+JaUgGrPvt4JNzJU1MD7KcZhauab9W0pCykgGPSN0= +go.opentelemetry.io/collector/component/componenttest v0.140.0 h1:/g7yETZ7Flq4v9qSmN9jux0LecMPJDwr8HtvhOgN6H4= +go.opentelemetry.io/collector/component/componenttest v0.140.0/go.mod h1:40PZd6rjqHH5UCqxB6nAvnHtDTwZaSWf1En1u1mbA8k= +go.opentelemetry.io/collector/config/configopaque v1.46.0 h1:lEh2VMyxOKJHa02Sj+O5INWTJZygYN2GKa5spWMGQQI= +go.opentelemetry.io/collector/config/configopaque v1.46.0/go.mod h1:OPmPZMkuks+mxK5Mtb0s20o0++BIBPq9oTEh2l4yPqk= +go.opentelemetry.io/collector/confmap v1.46.0 h1:C/LfkYsKGWgGOvsUz70iUuxbSzSLaXZMSi3QVX6oJsw= +go.opentelemetry.io/collector/confmap v1.46.0/go.mod h1:uqrwOuf+1PeZ9Zo/IDV9hJlvFy2eRKYUajkM1Lsmyto= +go.opentelemetry.io/collector/confmap/xconfmap v0.140.0 h1:rTHo7f3d4h00qCpb4hYnu/+n48sd5Hd4E9KT47QTgZA= +go.opentelemetry.io/collector/confmap/xconfmap v0.140.0/go.mod h1:KInqGVGClR7dDDJLkHsl3riO03et7TaBrGKVD5pD4i0= +go.opentelemetry.io/collector/consumer v1.46.0 h1:yG5zCCgbB2d0KobuYNZWdg8fy/HV2cA/ls0fYzVKBQ4= +go.opentelemetry.io/collector/consumer v1.46.0/go.mod h1:3hjV46vdz8zExuTKlxRge3VdeVUr0PJETqIMewKThNc= +go.opentelemetry.io/collector/extension v1.46.0 h1:+ATT9ADkMUR0cRH8J53vU9MRJ9UspRC0B+BqDGW1aRE= +go.opentelemetry.io/collector/extension v1.46.0/go.mod h1:/NGiZQFF7hTyfRULTgtYw27cIW8i0hWUTp12lDftZS0= +go.opentelemetry.io/collector/extension/extensionauth v1.46.0 h1:JvGu9tp+PIPgvXUSSyKMqShtK44ooK6+FAtpBnvaPPc= +go.opentelemetry.io/collector/extension/extensionauth v1.46.0/go.mod h1:6Sh0hqPfPqpg0ErCoNPO/ky2NdfGmUX+G5wekPx7A7U= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.140.0 h1:TX2w5PGNVTHDn6phZb6W897A9h/9gjtxlSF60C5wIYo= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.140.0/go.mod h1:CjrwUex7ImIBBTSB84XujWDdK/u+NTRsd4DTjbHGMck= +go.opentelemetry.io/collector/extension/extensiontest v0.140.0 h1:a4ggfsp73GA9oGCxBtmQJE827SRq36E+YQIZ0MGIKVQ= +go.opentelemetry.io/collector/extension/extensiontest v0.140.0/go.mod h1:TKR1zB0CtJ3tedNyUUaeCw5O2qPlFNjHKmh2ri53uTU= +go.opentelemetry.io/collector/featuregate v1.46.0 h1:z3JlymFdWW6aDo9cYAJ6bCqT+OI2DlurJ9P8HqfuKWQ= +go.opentelemetry.io/collector/featuregate v1.46.0/go.mod h1:d0tiRzVYrytB6LkcYgz2ESFTv7OktRPQe0QEQcPt1L4= +go.opentelemetry.io/collector/pdata v1.46.0 h1:XzhnIWNtc/gbOyFiewRvybR4s3phKHrWxL3yc/wVLDo= +go.opentelemetry.io/collector/pdata v1.46.0/go.mod h1:D2e3BWCUC/bUg29WNzCDVN7Ab0Gzk7hGXZL2pnrDOn0= go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= @@ -85,12 +85,12 @@ go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6 go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= -go.opentelemetry.io/proto/slim/otlp v1.8.0 h1:afcLwp2XOeCbGrjufT1qWyruFt+6C9g5SOuymrSPUXQ= -go.opentelemetry.io/proto/slim/otlp v1.8.0/go.mod h1:Yaa5fjYm1SMCq0hG0x/87wV1MP9H5xDuG/1+AhvBcsI= -go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.1.0 h1:Uc+elixz922LHx5colXGi1ORbsW8DTIGM+gg+D9V7HE= -go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.1.0/go.mod h1:VyU6dTWBWv6h9w/+DYgSZAPMabWbPTFTuxp25sM8+s0= -go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.1.0 h1:i8YpvWGm/Uq1koL//bnbJ/26eV3OrKWm09+rDYo7keU= -go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.1.0/go.mod h1:pQ70xHY/ZVxNUBPn+qUWPl8nwai87eWdqL3M37lNi9A= +go.opentelemetry.io/proto/slim/otlp v1.9.0 h1:fPVMv8tP3TrsqlkH1HWYUpbCY9cAIemx184VGkS6vlE= +go.opentelemetry.io/proto/slim/otlp v1.9.0/go.mod h1:xXdeJJ90Gqyll+orzUkY4bOd2HECo5JofeoLpymVqdI= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.2.0 h1:o13nadWDNkH/quoDomDUClnQBpdQQ2Qqv0lQBjIXjE8= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.2.0/go.mod h1:Gyb6Xe7FTi/6xBHwMmngGoHqL0w29Y4eW8TGFzpefGA= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.2.0 h1:EiUYvtwu6PMrMHVjcPfnsG3v+ajPkbUeH+IL93+QYyk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.2.0/go.mod h1:mUUHKFiN2SST3AhJ8XhJxEoeVW12oqfXog0Bo8W3Ec4= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=