Skip to content

Commit

Permalink
[8.5](backport #33472) [AWS] Add tags to events based on parsed ident…
Browse files Browse the repository at this point in the history
…ifier (#33518)

* [AWS] Add tags to events based on parsed identifier (#33472)

(cherry picked from commit 50c6ae5)

# Conflicts:
#	x-pack/metricbeat/module/aws/cloudwatch/cloudwatch.go
#	x-pack/metricbeat/module/aws/cloudwatch/cloudwatch_test.go

* Update CHANGELOG.next.asciidoc

* fix merge conflict

Co-authored-by: kaiyan-sheng <[email protected]>
  • Loading branch information
mergify[bot] and kaiyan-sheng committed Nov 1, 2022
1 parent 44c5573 commit 0693623
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 23 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.next.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ https://github.com/elastic/beats/compare/v8.2.0\...main[Check the HEAD diff]

*Metricbeat*

- Add tags to events based on parsed identifier. {pull}33472[33472]

*Packetbeat*

Expand Down
52 changes: 30 additions & 22 deletions x-pack/metricbeat/module/aws/cloudwatch/cloudwatch.go
Original file line number Diff line number Diff line change
Expand Up @@ -585,7 +585,23 @@ func (m *MetricSet) createEvents(svcCloudwatch cloudwatch.GetMetricDataAPIClient
events[identifierValue] = insertRootFields(events[identifierValue], output.Values[timestampIdx], labels)

// add tags to event based on identifierValue
insertTags(events, identifierValue, resourceTagMap)
// Check if identifier includes dimensionSeparator (comma in this case),
// split the identifier and check for each sub-identifier.
// For example, identifier might be [storageType, s3BucketName].
// And tags are only store under s3BucketName in resourceTagMap.
subIdentifiers := strings.Split(identifierValue, dimensionSeparator)
for _, subIdentifier := range subIdentifiers {
if _, ok := events[identifierValue]; !ok {
// when tagsFilter is not empty but no entry in
// resourceTagMap for this identifier, do not initialize
// an event for this identifier.
if len(tagsFilter) != 0 && resourceTagMap[subIdentifier] == nil {
continue
}
events[identifierValue] = aws.InitEvent(regionName, m.AccountName, m.AccountID, timestamp)
insertTags(events, identifierValue, subIdentifier, resourceTagMap)
}
}
}
}
}
Expand Down Expand Up @@ -625,28 +641,20 @@ func compareAWSDimensions(dim1 []types.Dimension, dim2 []types.Dimension) bool {
return reflect.DeepEqual(dim1NameToValue, dim2NameToValue)
}

func insertTags(events map[string]mb.Event, identifier string, resourceTagMap map[string][]resourcegroupstaggingapitypes.Tag) {
// Check if identifier includes dimensionSeparator (comma in this case),
// split the identifier and check for each sub-identifier.
// For example, identifier might be [storageType, s3BucketName].
// And tags are only store under s3BucketName in resourceTagMap.
subIdentifiers := strings.Split(identifier, dimensionSeparator)
for _, v := range subIdentifiers {
tags := resourceTagMap[v]
// some metric dimension values are arn format, eg: AWS/DDOS namespace metric
if len(tags) == 0 && strings.HasPrefix(v, "arn:") {
resourceID, err := aws.FindShortIdentifierFromARN(v)
if err == nil {
tags = resourceTagMap[resourceID]
}
func insertTags(events map[string]mb.Event, identifier string, subIdentifier string, resourceTagMap map[string][]resourcegroupstaggingapitypes.Tag) {
tags := resourceTagMap[subIdentifier]
// some metric dimension values are arn format, eg: AWS/DDOS namespace metric
if len(tags) == 0 && strings.HasPrefix(subIdentifier, "arn:") {
resourceID, err := aws.FindShortIdentifierFromARN(subIdentifier)
if err == nil {
tags = resourceTagMap[resourceID]
}
if len(tags) != 0 {
// By default, replace dot "." using underscore "_" for tag keys.
// Note: tag values are not dedotted.
for _, tag := range tags {
_, _ = events[identifier].RootFields.Put("aws.tags."+common.DeDot(*tag.Key), *tag.Value)
}
continue
}
if len(tags) != 0 {
// By default, replace dot "." using underscore "_" for tag keys.
// Note: tag values are not dedotted.
for _, tag := range tags {
_, _ = events[identifier].RootFields.Put("aws.tags."+common.DeDot(*tag.Key), *tag.Value)
}
}
}
6 changes: 5 additions & 1 deletion x-pack/metricbeat/module/aws/cloudwatch/cloudwatch_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ package cloudwatch
import (
"context"
"errors"
"strings"
"testing"
"time"

Expand Down Expand Up @@ -1560,7 +1561,10 @@ func TestInsertTags(t *testing.T) {

for _, c := range cases {
t.Run(c.title, func(t *testing.T) {
insertTags(events, c.identifier, resourceTagMap)
subIdentifiers := strings.Split(c.identifier, dimensionSeparator)
for _, subIdentifier := range subIdentifiers {
insertTags(events, c.identifier, subIdentifier, resourceTagMap)
}
value, err := events[c.identifier].RootFields.GetValue(c.expectedTagKey)
assert.NoError(t, err)
assert.Equal(t, c.expectedTagValue, value)
Expand Down

0 comments on commit 0693623

Please sign in to comment.