Skip to content

Commit 43d475d

Browse files
authored
Retrieve instance tags at the same time to reduce number of entities in Explore related experience (#1474)
1 parent 3f78406 commit 43d475d

8 files changed

Lines changed: 171 additions & 207 deletions

File tree

‎extension/entitystore/ec2Info.go‎

Lines changed: 4 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,12 @@ package entitystore
66
import (
77
"context"
88
"errors"
9-
"strings"
109
"sync"
1110
"time"
1211

1312
"go.uber.org/zap"
1413

1514
"github.com/aws/amazon-cloudwatch-agent/internal/ec2metadataprovider"
16-
"github.com/aws/amazon-cloudwatch-agent/plugins/processors/ec2tagger"
17-
"github.com/aws/amazon-cloudwatch-agent/translator/config"
1815
)
1916

2017
const (
@@ -28,13 +25,11 @@ const (
2825
)
2926

3027
type EC2Info struct {
31-
InstanceID string
32-
AccountID string
33-
AutoScalingGroup string
28+
InstanceID string
29+
AccountID string
3430

3531
// region is used while making call to describeTags Ec2 API for AutoScalingGroup
36-
Region string
37-
kubernetesMode string
32+
Region string
3833

3934
metadataProvider ec2metadataprovider.MetadataProvider
4035
logger *zap.Logger
@@ -50,12 +45,6 @@ func (ei *EC2Info) initEc2Info() {
5045
if err := ei.setInstanceIDAccountID(); err != nil {
5146
return
5247
}
53-
// Instance metadata tags is not usable for EKS nodes
54-
// https://github.com/kubernetes/cloud-provider-aws/issues/762
55-
if ei.kubernetesMode != config.ModeEKS {
56-
limitedRetryer := NewRetryer(true, true, defaultJitterMin, defaultJitterMax, ec2tagger.BackoffSleepArray, maxRetry, ei.done, ei.logger)
57-
limitedRetryer.refreshLoop(ei.retrieveAsgName)
58-
}
5948
ei.logger.Debug("Finished initializing EC2Info")
6049
}
6150

@@ -71,12 +60,6 @@ func (ei *EC2Info) GetAccountID() string {
7160
return ei.AccountID
7261
}
7362

74-
func (ei *EC2Info) GetAutoScalingGroup() string {
75-
ei.mutex.RLock()
76-
defer ei.mutex.RUnlock()
77-
return ei.AutoScalingGroup
78-
}
79-
8063
func (ei *EC2Info) setInstanceIDAccountID() error {
8164
for {
8265
metadataDoc, err := ei.metadataProvider.Get(context.Background())
@@ -104,34 +87,9 @@ func (ei *EC2Info) setInstanceIDAccountID() error {
10487
}
10588
}
10689

107-
func (ei *EC2Info) retrieveAsgName() error {
108-
tags, err := ei.metadataProvider.InstanceTags(context.Background())
109-
if err != nil {
110-
ei.logger.Debug("Failed to get AutoScalingGroup from instance tags. This is likely because instance tag is not enabled for IMDS but will not affect agent functionality.")
111-
return err
112-
} else if strings.Contains(tags, ec2tagger.Ec2InstanceTagKeyASG) {
113-
asg, err := ei.metadataProvider.InstanceTagValue(context.Background(), ec2tagger.Ec2InstanceTagKeyASG)
114-
if err != nil {
115-
ei.logger.Error("Failed to get AutoScalingGroup through metadata provider", zap.Error(err))
116-
return err
117-
} else {
118-
ei.logger.Debug("AutoScalingGroup retrieved through IMDS")
119-
ei.mutex.Lock()
120-
ei.AutoScalingGroup = asg
121-
if asgLength := len(ei.AutoScalingGroup); asgLength > autoScalingGroupSizeMax {
122-
ei.logger.Warn("AutoScalingGroup length exceeds characters limit and will be ignored", zap.Int("length", asgLength), zap.Int("character limit", autoScalingGroupSizeMax))
123-
ei.AutoScalingGroup = ""
124-
}
125-
ei.mutex.Unlock()
126-
}
127-
}
128-
return nil
129-
}
130-
131-
func newEC2Info(metadataProvider ec2metadataprovider.MetadataProvider, kubernetesMode string, done chan struct{}, region string, logger *zap.Logger) *EC2Info {
90+
func newEC2Info(metadataProvider ec2metadataprovider.MetadataProvider, done chan struct{}, region string, logger *zap.Logger) *EC2Info {
13291
return &EC2Info{
13392
metadataProvider: metadataProvider,
134-
kubernetesMode: kubernetesMode,
13593
done: done,
13694
Region: region,
13795
logger: logger,

‎extension/entitystore/ec2Info_test.go‎

Lines changed: 0 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ package entitystore
66
import (
77
"bytes"
88
"log"
9-
"strings"
109
"testing"
1110
"time"
1211

@@ -15,7 +14,6 @@ import (
1514
"go.uber.org/zap"
1615

1716
"github.com/aws/amazon-cloudwatch-agent/internal/ec2metadataprovider"
18-
"github.com/aws/amazon-cloudwatch-agent/translator/config"
1917
)
2018

2119
var mockedInstanceIdentityDoc = &ec2metadata.EC2InstanceIdentityDocument{
@@ -87,83 +85,6 @@ func TestSetInstanceIDAccountID(t *testing.T) {
8785
}
8886
}
8987

90-
func TestRetrieveASGName(t *testing.T) {
91-
type args struct {
92-
metadataProvider ec2metadataprovider.MetadataProvider
93-
}
94-
tests := []struct {
95-
name string
96-
args args
97-
wantErr bool
98-
want EC2Info
99-
}{
100-
{
101-
name: "happy path",
102-
args: args{
103-
metadataProvider: &mockMetadataProvider{InstanceIdentityDocument: mockedInstanceIdentityDoc, Tags: map[string]string{"aws:autoscaling:groupName": tagVal3}},
104-
},
105-
wantErr: false,
106-
want: EC2Info{
107-
AutoScalingGroup: tagVal3,
108-
},
109-
},
110-
{
111-
name: "happy path with multiple tags",
112-
args: args{
113-
metadataProvider: &mockMetadataProvider{
114-
InstanceIdentityDocument: mockedInstanceIdentityDoc,
115-
Tags: map[string]string{
116-
"aws:autoscaling:groupName": tagVal3,
117-
"env": "test-env",
118-
"name": "test-name",
119-
}},
120-
},
121-
122-
wantErr: false,
123-
want: EC2Info{
124-
AutoScalingGroup: tagVal3,
125-
},
126-
},
127-
{
128-
name: "AutoScalingGroup too large",
129-
args: args{
130-
metadataProvider: &mockMetadataProvider{
131-
InstanceIdentityDocument: mockedInstanceIdentityDoc,
132-
Tags: map[string]string{
133-
"aws:autoscaling:groupName": strings.Repeat("a", 256),
134-
"env": "test-env",
135-
"name": "test-name",
136-
}},
137-
},
138-
139-
wantErr: false,
140-
want: EC2Info{
141-
AutoScalingGroup: "",
142-
},
143-
},
144-
{
145-
name: "Success IMDS tags call but no ASG",
146-
args: args{
147-
metadataProvider: &mockMetadataProvider{InstanceIdentityDocument: mockedInstanceIdentityDoc, Tags: map[string]string{"name": tagVal3}},
148-
},
149-
wantErr: false,
150-
want: EC2Info{
151-
AutoScalingGroup: "",
152-
},
153-
},
154-
}
155-
for _, tt := range tests {
156-
logger, _ := zap.NewDevelopment()
157-
t.Run(tt.name, func(t *testing.T) {
158-
ei := &EC2Info{metadataProvider: tt.args.metadataProvider, logger: logger}
159-
if err := ei.retrieveAsgName(); (err != nil) != tt.wantErr {
160-
t.Errorf("retrieveAsgName() error = %v, wantErr %v", err, tt.wantErr)
161-
}
162-
assert.Equal(t, tt.want.AutoScalingGroup, ei.GetAutoScalingGroup())
163-
})
164-
}
165-
}
166-
16788
func TestLogMessageDoesNotIncludeResourceInfo(t *testing.T) {
16889
type args struct {
16990
metadataProvider ec2metadataprovider.MetadataProvider
@@ -202,7 +123,6 @@ func TestLogMessageDoesNotIncludeResourceInfo(t *testing.T) {
202123
logOutput := buf.String()
203124
log.Println(logOutput)
204125
assert.NotContains(t, logOutput, ei.GetInstanceID())
205-
assert.NotContains(t, logOutput, ei.GetAutoScalingGroup())
206126
})
207127
}
208128
}
@@ -237,35 +157,3 @@ func TestNotInitIfMetadataProviderIsEmpty(t *testing.T) {
237157
})
238158
}
239159
}
240-
241-
func TestNoASGRetrievalInKubernetesMode(t *testing.T) {
242-
type args struct {
243-
metadataProvider ec2metadataprovider.MetadataProvider
244-
kubernetesMode string
245-
}
246-
tests := []struct {
247-
name string
248-
args args
249-
wantErr bool
250-
want string
251-
}{
252-
{
253-
name: "EKSNoASGFromEC2Info",
254-
args: args{
255-
metadataProvider: &mockMetadataProvider{InstanceIdentityDocument: mockedInstanceIdentityDoc, Tags: map[string]string{"aws:autoscaling:groupName": tagVal3}},
256-
kubernetesMode: config.ModeEKS,
257-
},
258-
wantErr: false,
259-
want: "",
260-
},
261-
}
262-
for _, tt := range tests {
263-
logger, _ := zap.NewDevelopment()
264-
t.Run(tt.name, func(t *testing.T) {
265-
ei := &EC2Info{metadataProvider: tt.args.metadataProvider, kubernetesMode: tt.args.kubernetesMode, logger: logger}
266-
go ei.initEc2Info()
267-
time.Sleep(3 * time.Second)
268-
assert.Equal(t, tt.want, ei.GetAutoScalingGroup())
269-
})
270-
}
271-
}

‎extension/entitystore/extension.go‎

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ type serviceProviderInterface interface {
4343
addEntryForLogGroup(LogGroupName, ServiceAttribute)
4444
logFileServiceAttribute(LogFileGlob, LogGroupName) ServiceAttribute
4545
getServiceNameAndSource() (string, string)
46+
getAutoScalingGroup() string
4647
}
4748

4849
type EntityStore struct {
@@ -94,7 +95,7 @@ func (e *EntityStore) Start(ctx context.Context, host component.Host) error {
9495
e.serviceprovider = newServiceProvider(e.mode, e.config.Region, &e.ec2Info, e.metadataprovider, getEC2Provider, ec2CredentialConfig, e.done, e.logger)
9596
switch e.mode {
9697
case config.ModeEC2:
97-
e.ec2Info = *newEC2Info(e.metadataprovider, e.kubernetesMode, e.done, e.config.Region, e.logger)
98+
e.ec2Info = *newEC2Info(e.metadataprovider, e.done, e.config.Region, e.logger)
9899
go e.ec2Info.initEc2Info()
99100
// Instance metadata tags is not usable for EKS nodes
100101
// https://github.com/kubernetes/cloud-provider-aws/issues/762
@@ -177,6 +178,13 @@ func (e *EntityStore) GetServiceMetricAttributesMap() map[string]*string {
177178
return e.createAttributeMap()
178179
}
179180

181+
func (e *EntityStore) GetAutoScalingGroup() string {
182+
if e.serviceprovider == nil {
183+
return ""
184+
}
185+
return e.serviceprovider.getAutoScalingGroup()
186+
}
187+
180188
// AddServiceAttrEntryForLogFile adds an entry to the entity store for the provided file glob -> (serviceName, environmentName) key-value pair
181189
func (e *EntityStore) AddServiceAttrEntryForLogFile(fileGlob LogFileGlob, serviceName string, environmentName string) {
182190
if e.serviceprovider != nil {
@@ -225,7 +233,7 @@ func (e *EntityStore) createAttributeMap() map[string]*string {
225233

226234
if e.mode == config.ModeEC2 {
227235
addNonEmptyToMap(attributeMap, InstanceIDKey, e.ec2Info.GetInstanceID())
228-
addNonEmptyToMap(attributeMap, ASGKey, e.ec2Info.GetAutoScalingGroup())
236+
addNonEmptyToMap(attributeMap, ASGKey, e.GetAutoScalingGroup())
229237
}
230238
switch e.mode {
231239
case config.ModeEC2:

0 commit comments

Comments
 (0)