Skip to content

Commit 088385e

Browse files
committed
handle empty tags, add tests and close underlying body
Signed-off-by: Kavindu Dodanduwa <[email protected]>
1 parent 1a51202 commit 088385e

File tree

2 files changed

+59
-16
lines changed

2 files changed

+59
-16
lines changed

libbeat/processors/add_cloud_metadata/provider_aws_ec2.go

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ func getTags(ctx context.Context, imdsClient IMDSClient, ec2Client EC2Client, in
153153
logger.Info("Tag extraction from IMDS failed, fallback to DescribeTags API to obtain EKS cluster name.")
154154
clusterName, err := clusterNameFromDescribeTag(ctx, ec2Client, instanceId)
155155
if err != nil {
156-
logger.Warnf("error obtaining cluster name: %s.", err)
156+
logger.Warnf("error obtaining cluster name: %v.", err)
157157
return tags
158158
}
159159

@@ -169,38 +169,54 @@ func getTags(ctx context.Context, imdsClient IMDSClient, ec2Client EC2Client, in
169169
func getTagsFromIMDS(ctx context.Context, client IMDSClient, logger *logp.Logger) (tags map[string]string, ok bool) {
170170
tags = make(map[string]string)
171171

172-
metadata, err := client.GetMetadata(ctx, &imds.GetMetadataInput{Path: tagsCategory})
172+
b, err := getMetadataHelper(ctx, client, tagsCategory, logger)
173173
if err != nil {
174-
logger.Warnf("error from IMDS tags category request: %s", err)
175-
return tags, false
176-
}
177-
178-
b, err := io.ReadAll(metadata.Content)
179-
if err != nil {
180-
logger.Warnf("error extracting tags category payload: %s", err)
174+
logger.Warnf("error obtaining tags category: %v", err)
181175
return tags, false
182176
}
183177

184178
for _, tag := range strings.Split(string(b), "\n") {
185179
tagPath := fmt.Sprintf("%s/%s", tagsCategory, tag)
186-
metadata, err := client.GetMetadata(ctx, &imds.GetMetadataInput{Path: tagPath})
180+
b, err := getMetadataHelper(ctx, client, tagPath, logger)
187181
if err != nil {
188-
logger.Warnf("error from IMDS tag request: %s", err)
182+
logger.Warnf("error extracting tag value of %s: %v", tag, err)
189183
return tags, false
190184
}
191185

192-
b, err := io.ReadAll(metadata.Content)
193-
if err != nil {
194-
logger.Warnf("error extracting tag value payload: %s", err)
195-
return tags, false
186+
tagValue := string(b)
187+
if tagValue == "" {
188+
logger.Infof("Ignoring tag key %s as value is empty", tag)
189+
continue
196190
}
197191

198-
tags[tag] = string(b)
192+
tags[tag] = tagValue
199193
}
200194

201195
return tags, true
202196
}
203197

198+
// getMetadataHelper performs the IMDS call for the given path and returns the response content after closing the underlying content reader.
199+
func getMetadataHelper(ctx context.Context, client IMDSClient, path string, logger *logp.Logger) (content []byte, err error) {
200+
metadata, err := client.GetMetadata(ctx, &imds.GetMetadataInput{Path: path})
201+
if err != nil {
202+
return nil, fmt.Errorf("error from IMDS metadata request: %w", err)
203+
}
204+
205+
defer func(Content io.ReadCloser) {
206+
err := Content.Close()
207+
if err != nil {
208+
logger.Warnf("error closing IMDS metadata response body: %v", err)
209+
}
210+
}(metadata.Content)
211+
212+
content, err = io.ReadAll(metadata.Content)
213+
if err != nil {
214+
return nil, fmt.Errorf("error extracting metadata from the IMDS response: %w", err)
215+
}
216+
217+
return content, nil
218+
}
219+
204220
// clusterNameFromDescribeTag is a helper to extract EKS cluster name using DescribeTag.
205221
func clusterNameFromDescribeTag(ctx context.Context, ec2Client EC2Client, instanceID string) (string, error) {
206222
input := &ec2.DescribeTagsInput{

libbeat/processors/add_cloud_metadata/provider_aws_ec2_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,33 @@ func Test_getTags(t *testing.T) {
482482
}},
483483
want: map[string]string{},
484484
},
485+
{
486+
name: "Empty tags values are ignored",
487+
imdsClient: &MockIMDSClient{
488+
GetMetadataFunc: func(ctx context.Context, input *imds.GetMetadataInput, f ...func(*imds.Options)) (*imds.GetMetadataOutput, error) {
489+
if input.Path == tagsCategory {
490+
// tag category request
491+
return &imds.GetMetadataOutput{
492+
Content: io.NopCloser(strings.NewReader(customTagKey)),
493+
}, nil
494+
}
495+
496+
// tag request
497+
if strings.HasSuffix(input.Path, customTagKey) {
498+
return &imds.GetMetadataOutput{
499+
Content: io.NopCloser(strings.NewReader("")),
500+
}, nil
501+
}
502+
503+
return nil, errors.New("invalid request")
504+
},
505+
},
506+
ec2Client: &MockEC2Client{
507+
DescribeTagsFunc: func(ctx context.Context, params *ec2.DescribeTagsInput, optFns ...func(*ec2.Options)) (*ec2.DescribeTagsOutput, error) {
508+
return nil, errors.New("some error from DescribeTag")
509+
}},
510+
want: map[string]string{},
511+
},
485512
}
486513
for _, tt := range tests {
487514
t.Run(tt.name, func(t *testing.T) {

0 commit comments

Comments
 (0)