From 04c8c641407f71de4b5ef24dcf5b916c6f0fea46 Mon Sep 17 00:00:00 2001 From: Sai Raj MK Channagiri <92116010+schannag@users.noreply.github.com> Date: Fri, 13 Dec 2024 15:56:34 -0800 Subject: [PATCH 1/5] [extension/sigv4authextension] Add support for endpoint based names for logs and traces Adds support for default endpoint based service name and region detection for AWS CloudWatchLogs and Traces endpoints --- .../sigv4authextension/signingroundtripper.go | 39 +++++++++++-------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/extension/sigv4authextension/signingroundtripper.go b/extension/sigv4authextension/signingroundtripper.go index 564a6a6b9616..c155284446f4 100644 --- a/extension/sigv4authextension/signingroundtripper.go +++ b/extension/sigv4authextension/signingroundtripper.go @@ -114,28 +114,33 @@ func (si *signingRoundTripper) inferServiceAndRegion(r *http.Request) (service s service = si.service region = si.region - h := r.Host - if strings.HasPrefix(h, "aps-workspaces") { - if service == "" { - service = "aps" - } - rest := h[strings.Index(h, ".")+1:] - if region == "" { - region = rest[0:strings.Index(rest, ".")] - } - } else if strings.HasPrefix(h, "search-") { - if service == "" { - service = "es" - } - rest := h[strings.Index(h, ".")+1:] - if region == "" { - region = rest[0:strings.Index(rest, ".")] - } + host := r.Host + switch { + case strings.HasPrefix(host, "aps-workspaces"): + service, region = extractServiceAndRegion(service, region, host, "aps") + case strings.HasPrefix(host, "search-"): + service, region = extractServiceAndRegion(service, region, host, "es") + case strings.HasPrefix(host, "logs"): + service, region = extractServiceAndRegion(service, region, host, "logs") + case strings.HasPrefix(host, "xray"): + service, region = extractServiceAndRegion(service, region, host, "xray") } if service == "" || region == "" { si.logger.Warn("Unable to infer region and/or service from the URL. Please provide values for region and/or service in the collector configuration.") } + + return service, region +} + +func extractServiceAndRegion(service, region, host, defaultService string) (string, string) { + if service == "" { + service = defaultService + } + rest := host[strings.Index(host, ".")+1:] + if region == "" { + region = rest[0:strings.Index(rest, ".")] + } return service, region } From 546085ad564ea7cbd801ffef558ff1b129c517d5 Mon Sep 17 00:00:00 2001 From: Sai Raj MK Channagiri <92116010+schannag@users.noreply.github.com> Date: Fri, 13 Dec 2024 15:57:01 -0800 Subject: [PATCH 2/5] Update signingroundtripper_test.go --- .../signingroundtripper_test.go | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/extension/sigv4authextension/signingroundtripper_test.go b/extension/sigv4authextension/signingroundtripper_test.go index 89ba2d3d924a..6d9eb78c9ad5 100644 --- a/extension/sigv4authextension/signingroundtripper_test.go +++ b/extension/sigv4authextension/signingroundtripper_test.go @@ -110,6 +110,12 @@ func TestInferServiceAndRegion(t *testing.T) { req5, err := http.NewRequest(http.MethodGet, "https://aps-workspaces.us-east-1.amazonaws.com/workspaces/ws-XXX/api/v1/remote_write", nil) assert.NoError(t, err) + req6, err := http.NewRequest(http.MethodGet, "https://logs.us-east-1.amazonaws.com/v1/logs", nil) + assert.NoError(t, err) + + req7, err := http.NewRequest(http.MethodGet, "https://xray.us-east-1.amazonaws.com/v1/traces", nil) + assert.NoError(t, err) + tests := []struct { name string request *http.Request @@ -152,6 +158,20 @@ func TestInferServiceAndRegion(t *testing.T) { "service", "region", }, + { + "match_with_config", + req6, + &Config{Region: "region", Service: "service", AssumeRole: AssumeRole{ARN: "rolearn", STSRegion: "region"}}, + "service", + "region", + }, + { + "match_with_config", + req7, + &Config{Region: "region", Service: "service", AssumeRole: AssumeRole{ARN: "rolearn", STSRegion: "region"}}, + "service", + "region", + }, } // run tests From 37f0ae91ff387733599df115f6bb20182a71c749 Mon Sep 17 00:00:00 2001 From: Sai Raj MK Channagiri <92116010+schannag@users.noreply.github.com> Date: Fri, 13 Dec 2024 15:57:47 -0800 Subject: [PATCH 3/5] Update README.md --- extension/sigv4authextension/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extension/sigv4authextension/README.md b/extension/sigv4authextension/README.md index ca78fd9ddef8..9a9b5cc37186 100644 --- a/extension/sigv4authextension/README.md +++ b/extension/sigv4authextension/README.md @@ -26,7 +26,7 @@ The configuration fields are as follows: * Note that an attempt will be made to obtain a valid region from the endpoint of the service you are exporting to * [List of AWS regions](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RegionsAndAvailabilityZones.html) * `service`: **Optional**. The AWS service for AWS Sigv4 - * Note that an attempt will be made to obtain a valid service from the endpoint of the service you are exporting to + * Note for supported services an attempt will be made to obtain a valid service from the endpoint of the service you are exporting to. Supported services include - workspaces, es, logs and traces. ```yaml From 7ce89223f35ab9f56d6ffae1e4f64fc8aa370100 Mon Sep 17 00:00:00 2001 From: Sai Raj MK Channagiri <92116010+schannag@users.noreply.github.com> Date: Fri, 13 Dec 2024 19:17:21 -0800 Subject: [PATCH 4/5] Update tests for Logs and Traces config as well as names --- .../signingroundtripper_test.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/extension/sigv4authextension/signingroundtripper_test.go b/extension/sigv4authextension/signingroundtripper_test.go index 6d9eb78c9ad5..107026d9e010 100644 --- a/extension/sigv4authextension/signingroundtripper_test.go +++ b/extension/sigv4authextension/signingroundtripper_test.go @@ -159,18 +159,18 @@ func TestInferServiceAndRegion(t *testing.T) { "region", }, { - "match_with_config", + "logs_service_and_region_match_with_no_config", req6, - &Config{Region: "region", Service: "service", AssumeRole: AssumeRole{ARN: "rolearn", STSRegion: "region"}}, - "service", - "region", + createDefaultConfig().(*Config), + "logs", + "us-east-1", }, { - "match_with_config", + "xray_service_and_region_match_with_no_config", req7, - &Config{Region: "region", Service: "service", AssumeRole: AssumeRole{ARN: "rolearn", STSRegion: "region"}}, - "service", - "region", + createDefaultConfig().(*Config), + "xray", + "us-east-1", }, } From 3de1d71ad4b1b3ac6fb7b7b8affd5b8b256928f9 Mon Sep 17 00:00:00 2001 From: Sai Raj MK Channagiri <92116010+schannag@users.noreply.github.com> Date: Fri, 20 Dec 2024 11:22:28 -0800 Subject: [PATCH 5/5] Add changelog --- .chloggen/sigv4_logs_traces_support.yaml | 27 ++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 .chloggen/sigv4_logs_traces_support.yaml diff --git a/.chloggen/sigv4_logs_traces_support.yaml b/.chloggen/sigv4_logs_traces_support.yaml new file mode 100644 index 000000000000..7f36b0f06bf4 --- /dev/null +++ b/.chloggen/sigv4_logs_traces_support.yaml @@ -0,0 +1,27 @@ +# 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. filelogreceiver) +component: sigv4authextension + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: "Add support for endpoint based names for logs and traces" + +# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists. +issues: [36828] + +# (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: + +# 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: []