Skip to content

Commit 3ba3c24

Browse files
committed
Task state change logging refactor
1 parent 04e734a commit 3ba3c24

File tree

4 files changed

+64
-36
lines changed

4 files changed

+64
-36
lines changed

agent/api/statechange.go

+44-7
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
apieni "github.com/aws/amazon-ecs-agent/agent/api/eni"
2424
apitask "github.com/aws/amazon-ecs-agent/agent/api/task"
2525
apitaskstatus "github.com/aws/amazon-ecs-agent/agent/api/task/status"
26+
"github.com/aws/amazon-ecs-agent/agent/logger"
2627
"github.com/aws/amazon-ecs-agent/agent/statechange"
2728
"github.com/pkg/errors"
2829

@@ -223,29 +224,42 @@ func NewAttachmentStateChangeEvent(eniAttachment *apieni.ENIAttachment) Attachme
223224
}
224225
}
225226

227+
func (c *ContainerStateChange) ToFields() logger.Fields {
228+
return logger.Fields{
229+
"eventType": "ContainerStateChange",
230+
"taskArn": c.TaskArn,
231+
"containerName": c.ContainerName,
232+
"containerStatus": c.Status.String(),
233+
"exitCode": strconv.Itoa(*c.ExitCode),
234+
"reason": c.Reason,
235+
"portBindings": c.PortBindings,
236+
}
237+
}
238+
226239
// String returns a human readable string representation of this object
227240
func (c *ContainerStateChange) String() string {
228-
res := fmt.Sprintf("%s %s -> %s", c.TaskArn, c.ContainerName, c.Status.String())
241+
res := fmt.Sprintf("containerName=%s containerStatus=%s", c.ContainerName, c.Status.String())
229242
if c.ExitCode != nil {
230-
res += ", Exit " + strconv.Itoa(*c.ExitCode) + ", "
243+
res += " containerExitCode=" + strconv.Itoa(*c.ExitCode)
231244
}
232245
if c.Reason != "" {
233-
res += ", Reason " + c.Reason
246+
res += " containerReason=" + c.Reason
234247
}
235248
if len(c.PortBindings) != 0 {
236-
res += fmt.Sprintf(", Ports %v", c.PortBindings)
249+
res += fmt.Sprintf(" containerPortBindings=%v", c.PortBindings)
237250
}
238251
if c.Container != nil {
239-
res += ", Known Sent: " + c.Container.GetSentStatus().String()
252+
res += fmt.Sprintf(" containerKnownSentStatus=%s containerRuntimeID=%s",
253+
c.Container.GetSentStatus().String(), c.Container.GetRuntimeID())
240254
}
241255
return res
242256
}
243257

244258
// String returns a human readable string representation of ManagedAgentStateChange
245259
func (m *ManagedAgentStateChange) String() string {
246-
res := fmt.Sprintf("%s %s %s -> %s", m.TaskArn, m.Container.Name, m.Name, m.Status.String())
260+
res := fmt.Sprintf("containerName=%s managedAgentName=%s managedAgentStatus=%s", m.Container.Name, m.Name, m.Status.String())
247261
if m.Reason != "" {
248-
res += ", Reason " + m.Reason
262+
res += " managedAgentReason=" + m.Reason
249263
}
250264
return res
251265
}
@@ -287,6 +301,29 @@ func (change *TaskStateChange) ShouldBeReported() bool {
287301
return false
288302
}
289303

304+
func (change *TaskStateChange) ToFields() logger.Fields {
305+
fields := logger.Fields{
306+
"eventType": "TaskStateChange",
307+
"taskArn": change.TaskARN,
308+
"taskStatus": change.Status.String(),
309+
"taskReason": change.Reason,
310+
"taskKnownSentStatus": change.Task.GetSentStatus().String(),
311+
"taskPullStartedAt": change.Task.GetPullStartedAt().UTC().Format(time.RFC3339),
312+
"taskPullStoppedAt": change.Task.GetPullStoppedAt().UTC().Format(time.RFC3339),
313+
"taskExecutionStoppedAt": change.Task.GetExecutionStoppedAt().UTC().Format(time.RFC3339),
314+
}
315+
if change.Attachment != nil {
316+
fields["eniAttachment"] = change.Attachment.String()
317+
}
318+
for i, containerChange := range change.Containers {
319+
fields["containerChange-"+strconv.Itoa(i)] = containerChange.String()
320+
}
321+
for i, managedAgentChange := range change.ManagedAgents {
322+
fields["managedAgentChange-"+strconv.Itoa(i)] = managedAgentChange.String()
323+
}
324+
return fields
325+
}
326+
290327
// String returns a human readable string representation of this object
291328
func (change *TaskStateChange) String() string {
292329
res := fmt.Sprintf("%s -> %s", change.TaskARN, change.Status.String())

agent/eventhandler/task_handler.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"github.com/aws/amazon-ecs-agent/agent/data"
2727
"github.com/aws/amazon-ecs-agent/agent/ecs_client/model/ecs"
2828
"github.com/aws/amazon-ecs-agent/agent/engine/dockerstate"
29+
"github.com/aws/amazon-ecs-agent/agent/logger"
2930
"github.com/aws/amazon-ecs-agent/agent/metrics"
3031
"github.com/aws/amazon-ecs-agent/agent/statechange"
3132
"github.com/aws/amazon-ecs-agent/agent/utils"
@@ -310,8 +311,7 @@ func (handler *TaskHandler) getTaskEventsUnsafe(event *sendableEvent) *taskSenda
310311
taskARN: taskARN,
311312
}
312313
handler.tasksToEvents[taskARN] = taskEvents
313-
seelog.Debugf("TaskHandler: collecting events for new task; event: %s; events: %s ",
314-
event.toString(), taskEvents.toStringUnsafe())
314+
logger.Debug(fmt.Sprintf("TaskHandler: collecting events for new task; events: %s", taskEvents.toStringUnsafe()), event.toFields())
315315
}
316316

317317
return taskEvents
@@ -366,7 +366,7 @@ func (taskEvents *taskSendableEvents) sendChange(change *sendableEvent,
366366
defer taskEvents.lock.Unlock()
367367

368368
// Add event to the queue
369-
seelog.Debugf("TaskHandler: Adding event: %s", change.toString())
369+
logger.Debug("TaskHandler: Adding event", change.toFields())
370370
taskEvents.events.PushBack(change)
371371

372372
if !taskEvents.sending {
@@ -375,9 +375,9 @@ func (taskEvents *taskSendableEvents) sendChange(change *sendableEvent,
375375
taskEvents.sending = true
376376
go handler.submitTaskEvents(taskEvents, client, change.taskArn())
377377
} else {
378-
seelog.Debugf(
379-
"TaskHandler: Not submitting change as the task is already being sent: %s",
380-
change.toString())
378+
logger.Debug(
379+
"TaskHandler: Not submitting change as the task is already being sent",
380+
change.toFields())
381381
}
382382
}
383383

@@ -422,12 +422,12 @@ func (taskEvents *taskSendableEvents) submitFirstEvent(handler *TaskHandler, bac
422422
}
423423
} else {
424424
// Shouldn't be sent as either a task or container change event; must have been already sent
425-
seelog.Infof("TaskHandler: Not submitting redundant event; just removing: %s", event.toString())
425+
logger.Info("TaskHandler: Not submitting redundant event; just removing", event.toFields())
426426
taskEvents.events.Remove(eventToSubmit)
427427
}
428428

429429
if taskEvents.events.Len() == 0 {
430-
seelog.Debug("TaskHandler: Removed the last element, no longer sending")
430+
logger.Debug("TaskHandler: Removed the last element, no longer sending")
431431
taskEvents.sending = false
432432
return true, nil
433433
}
@@ -445,7 +445,7 @@ func (taskEvents *taskSendableEvents) toStringUnsafe() string {
445445
func handleInvalidParamException(err error, events *list.List, eventToSubmit *list.Element) {
446446
if utils.IsAWSErrorCodeEqual(err, ecs.ErrCodeInvalidParameterException) {
447447
event := eventToSubmit.Value.(*sendableEvent)
448-
seelog.Warnf("TaskHandler: Event is sent with invalid parameters; just removing: %s", event.toString())
448+
logger.Warn("TaskHandler: Event is sent with invalid parameters; just removing", event.toFields())
449449
events.Remove(eventToSubmit)
450450
}
451451
}

agent/eventhandler/task_handler_types.go

+8-17
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ package eventhandler
1515

1616
import (
1717
"container/list"
18-
"fmt"
1918
"sync"
2019

2120
"github.com/aws/amazon-ecs-agent/agent/logger"
@@ -152,27 +151,19 @@ func (event *sendableEvent) send(
152151
backoff retry.Backoff,
153152
taskEvents *taskSendableEvents) error {
154153

155-
logger.Info("Sending state change to ECS", logger.Fields{
156-
"eventType": eventType,
157-
"eventData": event.toString(),
158-
})
154+
fields := event.toFields()
155+
logger.Info("Sending state change to ECS", fields)
159156
// Try submitting the change to ECS
160157
if err := sendStatusToECS(client, event); err != nil {
161-
logger.Error("Unretriable error sending state change to ECS", logger.Fields{
162-
"eventType": eventType,
163-
"eventData": event.toString(),
164-
field.Error: err,
165-
})
158+
fields[field.Error] = err
159+
logger.Error("Unretriable error sending state change to ECS", fields)
166160
return err
167161
}
168162
// submitted; ensure we don't retry it
169163
event.setSent()
170164
// Mark event as sent
171165
setChangeSent(event, dataClient)
172-
logger.Debug("Submitted state change to ECS", logger.Fields{
173-
"eventType": eventType,
174-
"eventData": event.toString(),
175-
})
166+
logger.Debug("Submitted state change to ECS", fields)
176167
taskEvents.events.Remove(eventToSubmit)
177168
backoff.Reset()
178169
return nil
@@ -234,14 +225,14 @@ func setTaskAttachmentSent(event *sendableEvent, dataClient data.Client) {
234225
}
235226
}
236227

237-
func (event *sendableEvent) toString() string {
228+
func (event *sendableEvent) toFields() logger.Fields {
238229
event.lock.RLock()
239230
defer event.lock.RUnlock()
240231

241232
if event.isContainerEvent {
242-
return "ContainerChange: [" + event.containerChange.String() + fmt.Sprintf("] sent: %t", event.containerSent)
233+
return event.containerChange.ToFields()
243234
} else {
244-
return "TaskChange: [" + event.taskChange.String() + fmt.Sprintf("] sent: %t", event.taskSent)
235+
return event.taskChange.ToFields()
245236
}
246237
}
247238

agent/eventhandler/task_handler_types_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ func TestShouldTaskEventBeSent(t *testing.T) {
257257
shouldBeSent: false,
258258
},
259259
} {
260-
t.Run(fmt.Sprintf("Event[%s] should be sent[%t]", tc.event.toString(), tc.shouldBeSent), func(t *testing.T) {
260+
t.Run(fmt.Sprintf("Event[%v] should be sent[%t]", tc.event.toFields(), tc.shouldBeSent), func(t *testing.T) {
261261
assert.Equal(t, tc.shouldBeSent, tc.event.taskShouldBeSent())
262262
assert.Equal(t, false, tc.event.containerShouldBeSent())
263263
assert.Equal(t, false, tc.event.taskAttachmentShouldBeSent())
@@ -331,8 +331,8 @@ func TestShouldTaskAttachmentEventBeSent(t *testing.T) {
331331
taskShouldBeSent: false,
332332
},
333333
} {
334-
t.Run(fmt.Sprintf("Event[%s] should be sent[attachment=%t;task=%t]",
335-
tc.event.toString(), tc.attachmentShouldBeSent, tc.taskShouldBeSent), func(t *testing.T) {
334+
t.Run(fmt.Sprintf("Event[%v] should be sent[attachment=%t;task=%t]",
335+
tc.event.toFields(), tc.attachmentShouldBeSent, tc.taskShouldBeSent), func(t *testing.T) {
336336
assert.Equal(t, tc.attachmentShouldBeSent, tc.event.taskAttachmentShouldBeSent())
337337
assert.Equal(t, tc.taskShouldBeSent, tc.event.taskShouldBeSent())
338338
assert.Equal(t, false, tc.event.containerShouldBeSent())

0 commit comments

Comments
 (0)