agent/api/statechange.go
func (change *TaskStateChange) String() string {
	res := fmt.Sprintf("%s -> %s", change.TaskARN, change.Status.String())
	if change.Task != nil {
		res += fmt.Sprintf(", Known Sent: %s, PullStartedAt: %s, PullStoppedAt: %s, ExecutionStoppedAt: %s",
			change.Task.GetSentStatus().String(),
			change.Task.GetPullStartedAt(),
			change.Task.GetPullStoppedAt(),
			change.Task.GetExecutionStoppedAt())
	}
	if change.Attachment != nil {
		res += ", " + change.Attachment.String()
	}
	for _, containerChange := range change.Containers {
		res += ", " + containerChange.String()
	}

	return res
}
func (change *TaskStateChange) String() string {
	res := fmt.Sprintf("%s -> %s", change.TaskARN, change.Status.String())
	if change.Task != nil {
		res += fmt.Sprintf(", Known Sent: %s, PullStartedAt: %s, PullStoppedAt: %s, ExecutionStoppedAt: %s",
			change.Task.GetSentStatus().String(),
			change.Task.GetPullStartedAt(),
			change.Task.GetPullStoppedAt(),
			change.Task.GetExecutionStoppedAt())
	}
	if change.Attachment != nil {
		res += ", " + change.Attachment.String()
	}
	for _, containerChange := range change.Containers {
		res += ", " + containerChange.String()
	}

	return res
}
// String returns a human readable string representation of this object