Skip to content

Commit 24cc036

Browse files
author
Heming Han
committed
Integrate with TCSHandler in /ecs-agent module
1 parent 894ce44 commit 24cc036

File tree

8 files changed

+158
-794
lines changed

8 files changed

+158
-794
lines changed

agent/app/agent.go

+13-16
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ import (
4747
"github.com/aws/amazon-ecs-agent/agent/sighandlers/exitcodes"
4848
"github.com/aws/amazon-ecs-agent/agent/statemanager"
4949
"github.com/aws/amazon-ecs-agent/agent/stats"
50+
"github.com/aws/amazon-ecs-agent/agent/stats/reporter"
5051
"github.com/aws/amazon-ecs-agent/agent/taskresource"
51-
tcshandler "github.com/aws/amazon-ecs-agent/agent/tcs/handler"
5252
"github.com/aws/amazon-ecs-agent/agent/utils"
5353
"github.com/aws/amazon-ecs-agent/agent/utils/loader"
5454
"github.com/aws/amazon-ecs-agent/agent/utils/mobypkgwrapper"
@@ -891,21 +891,18 @@ func (agent *ecsAgent) startAsyncRoutines(
891891
}
892892
go statsEngine.StartMetricsPublish()
893893

894-
telemetrySessionParams := tcshandler.TelemetrySessionParams{
895-
Ctx: agent.ctx,
896-
CredentialProvider: agent.credentialProvider,
897-
Cfg: agent.cfg,
898-
ContainerInstanceArn: agent.containerInstanceARN,
899-
DeregisterInstanceEventStream: deregisterInstanceEventStream,
900-
ECSClient: client,
901-
TaskEngine: taskEngine,
902-
StatsEngine: statsEngine,
903-
MetricsChannel: telemetryMessages,
904-
HealthChannel: healthMessages,
905-
Doctor: doctor,
906-
}
907-
// Start metrics session in a go routine
908-
go tcshandler.StartMetricsSession(&telemetrySessionParams)
894+
session, err := reporter.NewDockerTelemetrySession(agent.containerInstanceARN, agent.credentialProvider, agent.cfg, deregisterInstanceEventStream,
895+
client, taskEngine, telemetryMessages, healthMessages, doctor)
896+
if err != nil {
897+
seelog.Warnf("Error creating telemetry session: %v", err)
898+
return
899+
}
900+
if session == nil {
901+
seelog.Infof("Metrics disabled on the instance.")
902+
return
903+
}
904+
905+
go session.Start(agent.ctx)
909906
}
910907

911908
func (agent *ecsAgent) startSpotInstanceDrainingPoller(ctx context.Context, client api.ECSClient) {

agent/app/agent_unix_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@ func TestDoStartCgroupInitHappyPath(t *testing.T) {
485485
}).Return("poll-endpoint", nil),
486486
client.EXPECT().DiscoverPollEndpoint(gomock.Any()).Return("acs-endpoint", nil).AnyTimes(),
487487
client.EXPECT().DiscoverTelemetryEndpoint(gomock.Any()).Do(func(x interface{}) {
488-
// Ensures that the test waits until telemetry session has bee started
488+
// Ensures that the test waits until telemetry session has been started
489489
discoverEndpointsInvoked.Done()
490490
}).Return("telemetry-endpoint", nil),
491491
client.EXPECT().DiscoverTelemetryEndpoint(gomock.Any()).Return(

agent/stats/reporter/reporter.go

+19-17
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import (
1919
"github.com/aws/amazon-ecs-agent/ecs-agent/utils/retry"
2020
"github.com/aws/amazon-ecs-agent/ecs-agent/wsclient"
2121
"github.com/aws/aws-sdk-go/aws/credentials"
22-
"github.com/cihub/seelog"
2322
)
2423

2524
const (
@@ -48,22 +47,20 @@ func NewDockerTelemetrySession(
4847
taskEngine engine.TaskEngine,
4948
metricsChannel <-chan ecstcs.TelemetryMessage,
5049
healthChannel <-chan ecstcs.HealthMessage,
51-
doctor *doctor.Doctor) *DockerTelemetrySession {
50+
doctor *doctor.Doctor) (*DockerTelemetrySession, error) {
5251
ok, cfgParseErr := isContainerHealthMetricsDisabled(cfg)
5352
if cfgParseErr != nil {
54-
seelog.Warnf("Error starting metrics session: %v", cfgParseErr)
55-
return nil
53+
logger.Warn("Error starting metrics session", logger.Fields{
54+
field.Error: cfgParseErr,
55+
})
56+
return nil, cfgParseErr
5657
}
5758
if ok {
58-
seelog.Warnf("Metrics were disabled, not starting the telemetry session")
59-
return nil
59+
logger.Warn("Metrics were disabled, not starting the telemetry session")
60+
return nil, nil
6061
}
6162

6263
agentVersion, agentHash, containerRuntimeVersion := generateVersionInfo(taskEngine)
63-
if cfg == nil {
64-
logger.Error("Config is empty in the tcs session parameter")
65-
return nil
66-
}
6764

6865
session := tcshandler.NewTelemetrySession(
6966
containerInstanceArn,
@@ -90,7 +87,7 @@ func NewDockerTelemetrySession(
9087
healthChannel,
9188
doctor,
9289
)
93-
return &DockerTelemetrySession{session, ecsClient, containerInstanceArn}
90+
return &DockerTelemetrySession{session, ecsClient, containerInstanceArn}, nil
9491
}
9592

9693
// Start "overloads" tcshandler.TelemetrySession's Start with extra handling of discoverTelemetryEndpoint result.
@@ -99,18 +96,23 @@ func NewDockerTelemetrySession(
9996
func (session *DockerTelemetrySession) Start(ctx context.Context) error {
10097
backoff := retry.NewExponentialBackoff(time.Second, 1*time.Minute, 0.2, 2)
10198
for {
99+
select {
100+
case <-ctx.Done():
101+
logger.Info("TCS session exited cleanly.")
102+
return nil
103+
default:
104+
}
102105
endpoint, tcsError := discoverPollEndpoint(session.containerInstanceArn, session.ecsClient)
103106
if tcsError == nil {
104107
tcsError = session.s.StartTelemetrySession(ctx, endpoint)
105108
}
106-
switch tcsError {
107-
case context.Canceled, context.DeadlineExceeded:
108-
return tcsError
109-
case io.EOF, nil:
109+
if tcsError == nil || tcsError == io.EOF {
110110
logger.Info("TCS Websocket connection closed for a valid reason")
111111
backoff.Reset()
112-
default:
113-
seelog.Errorf("Error: lost websocket connection with ECS Telemetry service (TCS): %v", tcsError)
112+
} else {
113+
logger.Error("Error: lost websocket connection with ECS Telemetry service (TCS)", logger.Fields{
114+
field.Error: tcsError,
115+
})
114116
time.Sleep(backoff.Duration())
115117
}
116118
}

agent/stats/reporter/reporter_test.go

+125
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package reporter
2+
3+
import (
4+
"context"
5+
"errors"
6+
"testing"
7+
8+
"github.com/aws/amazon-ecs-agent/agent/config"
9+
mock_engine "github.com/aws/amazon-ecs-agent/agent/engine/mocks"
10+
"github.com/aws/amazon-ecs-agent/agent/version"
11+
"github.com/aws/amazon-ecs-agent/ecs-agent/doctor"
12+
"github.com/aws/amazon-ecs-agent/ecs-agent/eventstream"
13+
"github.com/aws/aws-sdk-go/aws/credentials"
14+
"github.com/golang/mock/gomock"
15+
"github.com/stretchr/testify/assert"
16+
)
17+
18+
const (
19+
testContainerInstanceArn = "testContainerInstanceArn"
20+
testCluster = "testCluster"
21+
testRegion = "us-west-2"
22+
testDockerEndpoint = "testDockerEndpoint"
23+
testDockerVersion = "testDockerVersion"
24+
)
25+
26+
func TestNewDockerTelemetrySession(t *testing.T) {
27+
emptyDoctor, _ := doctor.NewDoctor([]doctor.Healthcheck{}, testCluster, testContainerInstanceArn)
28+
testCredentials := credentials.NewStaticCredentials("test-id", "test-secret", "test-token")
29+
ctrl := gomock.NewController(t)
30+
defer ctrl.Finish()
31+
mockEngine := mock_engine.NewMockTaskEngine(ctrl)
32+
mockEngine.EXPECT().Version().Return(testDockerVersion, nil)
33+
testCases := []struct {
34+
name string
35+
cfg *config.Config
36+
expectedSession bool
37+
expectedError bool
38+
}{
39+
{
40+
name: "happy case",
41+
cfg: &config.Config{
42+
DisableMetrics: config.BooleanDefaultFalse{},
43+
DisableDockerHealthCheck: config.BooleanDefaultFalse{},
44+
Cluster: testCluster,
45+
AWSRegion: testRegion,
46+
AcceptInsecureCert: false,
47+
DockerEndpoint: testDockerEndpoint,
48+
},
49+
expectedSession: true,
50+
expectedError: false,
51+
},
52+
{
53+
name: "cfg parsing error",
54+
cfg: nil,
55+
expectedSession: false,
56+
expectedError: true,
57+
},
58+
{
59+
name: "metrics disabled",
60+
cfg: &config.Config{
61+
DisableMetrics: config.BooleanDefaultFalse{
62+
Value: config.ExplicitlyEnabled,
63+
},
64+
DisableDockerHealthCheck: config.BooleanDefaultFalse{
65+
Value: config.ExplicitlyEnabled,
66+
},
67+
Cluster: testCluster,
68+
AWSRegion: testRegion,
69+
AcceptInsecureCert: false,
70+
DockerEndpoint: testDockerEndpoint,
71+
},
72+
expectedSession: false,
73+
expectedError: false,
74+
},
75+
}
76+
77+
for _, tc := range testCases {
78+
t.Run(tc.name, func(t *testing.T) {
79+
dockerTelemetrySession, err := NewDockerTelemetrySession(
80+
testContainerInstanceArn,
81+
testCredentials,
82+
tc.cfg,
83+
eventstream.NewEventStream("Deregister_Instance", context.Background()),
84+
nil,
85+
mockEngine,
86+
nil,
87+
nil,
88+
emptyDoctor,
89+
)
90+
if tc.expectedSession {
91+
assert.NotNil(t, dockerTelemetrySession)
92+
} else {
93+
assert.Nil(t, dockerTelemetrySession)
94+
}
95+
96+
if tc.expectedError {
97+
assert.NotNil(t, err)
98+
} else {
99+
assert.NoError(t, err)
100+
}
101+
})
102+
}
103+
}
104+
105+
func TestGenerateVersionInfo_GetVersionError(t *testing.T) {
106+
ctrl := gomock.NewController(t)
107+
defer ctrl.Finish()
108+
mockEngine := mock_engine.NewMockTaskEngine(ctrl)
109+
mockEngine.EXPECT().Version().Times(1).Return("", errors.New("error"))
110+
agentVersion, agentHash, containerRuntimeVersion := generateVersionInfo(mockEngine)
111+
assert.Equal(t, version.Version, agentVersion)
112+
assert.Equal(t, version.GitShortHash, agentHash)
113+
assert.Equal(t, "", containerRuntimeVersion)
114+
}
115+
116+
func TestGenerateVersionInfo_NoError(t *testing.T) {
117+
ctrl := gomock.NewController(t)
118+
defer ctrl.Finish()
119+
mockEngine := mock_engine.NewMockTaskEngine(ctrl)
120+
mockEngine.EXPECT().Version().Times(1).Return(testDockerVersion, nil)
121+
agentVersion, agentHash, containerRuntimeVersion := generateVersionInfo(mockEngine)
122+
assert.Equal(t, version.Version, agentVersion)
123+
assert.Equal(t, version.GitShortHash, agentHash)
124+
assert.Equal(t, testDockerVersion, containerRuntimeVersion)
125+
}

0 commit comments

Comments
 (0)