Skip to content

Commit

Permalink
[extension/sigv4authextension] Add support for endpoint based names f…
Browse files Browse the repository at this point in the history
…or logs and traces (#36828)

#### Description

Adds support for default endpoint based service name and region
detection for AWS CloudWatchLogs and Traces endpoints

#### Link to tracking issue
Fixes

#### Testing
* Added unit tests
  • Loading branch information
schannag authored Dec 23, 2024
1 parent f21f718 commit 58aaa64
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 18 deletions.
27 changes: 27 additions & 0 deletions .chloggen/sigv4_logs_traces_support.yaml
Original file line number Diff line number Diff line change
@@ -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: []
2 changes: 1 addition & 1 deletion extension/sigv4authextension/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
39 changes: 22 additions & 17 deletions extension/sigv4authextension/signingroundtripper.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down
20 changes: 20 additions & 0 deletions extension/sigv4authextension/signingroundtripper_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 58aaa64

Please sign in to comment.