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: [] 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 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 } diff --git a/extension/sigv4authextension/signingroundtripper_test.go b/extension/sigv4authextension/signingroundtripper_test.go index 89ba2d3d924a..107026d9e010 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", }, + { + "logs_service_and_region_match_with_no_config", + req6, + createDefaultConfig().(*Config), + "logs", + "us-east-1", + }, + { + "xray_service_and_region_match_with_no_config", + req7, + createDefaultConfig().(*Config), + "xray", + "us-east-1", + }, } // run tests