Skip to content

Commit 0baae07

Browse files
committed
stop collecting sc stats only if there are no containers running in a task
1 parent 64cf6de commit 0baae07

File tree

2 files changed

+42
-3
lines changed

2 files changed

+42
-3
lines changed

agent/stats/engine.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -957,11 +957,10 @@ func (engine *DockerStatsEngine) doRemoveContainerUnsafe(container *StatsContain
957957
// Delete will do nothing if the specified key doesn't exist.
958958
delete(engine.tasksToDefinitions, taskArn)
959959
seelog.Debugf("Deleted task from tasks, arn: %s", taskArn)
960-
}
961960

962-
if _, ok := engine.taskToServiceConnectStats[taskArn]; ok {
961+
// Stop collecting service connect stats for this task
963962
delete(engine.taskToServiceConnectStats, taskArn)
964-
seelog.Debugf("Deleted task from service connect stats watch list, arn: %s", taskArn)
963+
seelog.Debugf("Deleted task from the Service Connect stats watchlist, task ARN: %s", taskArn)
965964
}
966965

967966
// Remove the container from health container watch list

agent/stats/engine_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,46 @@ func TestStatsEngineAddRemoveContainers(t *testing.T) {
218218
validateIdleContainerMetrics(t, engine)
219219
}
220220

221+
func TestDoRemoveContainerUnsafeServiceConnectStats(t *testing.T) {
222+
engine := NewDockerStatsEngine(&cfg, nil, eventStream("TestDoRemoveContainerUnsafeServiceConnectStats"), nil, nil, nil)
223+
defer engine.removeAll()
224+
225+
taskArn := "arn:aws:ecs:us-west-2:123456789012:task/test-task"
226+
227+
// Setup task with service connect stats
228+
engine.taskToServiceConnectStats[taskArn] = &ServiceConnectStats{}
229+
engine.tasksToContainers[taskArn] = make(map[string]*StatsContainer)
230+
231+
// Add two containers to the task with proper initialization
232+
_, cancel1 := context.WithCancel(context.Background())
233+
container1 := &StatsContainer{
234+
containerMetadata: &ContainerMetadata{DockerID: "container1"},
235+
cancel: cancel1,
236+
}
237+
_, cancel2 := context.WithCancel(context.Background())
238+
container2 := &StatsContainer{
239+
containerMetadata: &ContainerMetadata{DockerID: "container2"},
240+
cancel: cancel2,
241+
}
242+
243+
engine.tasksToContainers[taskArn]["container1"] = container1
244+
engine.tasksToContainers[taskArn]["container2"] = container2
245+
246+
// Remove first container - service connect stats should remain
247+
engine.doRemoveContainerUnsafe(container1, taskArn)
248+
249+
// Verify service connect stats still exist (task has remaining containers)
250+
_, exists := engine.taskToServiceConnectStats[taskArn]
251+
assert.True(t, exists, "Service connect stats should remain when task has running containers")
252+
253+
// Remove second container - service connect stats should be cleaned up
254+
engine.doRemoveContainerUnsafe(container2, taskArn)
255+
256+
// Verify service connect stats are cleaned up (no containers left in task)
257+
_, exists = engine.taskToServiceConnectStats[taskArn]
258+
assert.False(t, exists, "Service connect stats should be cleaned up when no containers remain in task")
259+
}
260+
221261
func TestStatsEngineMetadataInStatsSets(t *testing.T) {
222262
mockCtrl := gomock.NewController(t)
223263
defer mockCtrl.Finish()

0 commit comments

Comments
 (0)