agent/stats/engine.go
func (engine *DockerStatsEngine) GetInstanceMetrics() (*ecstcs.MetricsMetadata, []*ecstcs.TaskMetric, error) {
	var taskMetrics []*ecstcs.TaskMetric
	idle := engine.isIdle()
	metricsMetadata := &ecstcs.MetricsMetadata{
		Cluster:           aws.String(engine.cluster),
		ContainerInstance: aws.String(engine.containerInstanceArn),
		Idle:              aws.Bool(idle),
		MessageId:         aws.String(uuid.NewRandom().String()),
	}

	if idle {
		seelog.Debug("Instance is idle. No task metrics to report")
		fin := true
		metricsMetadata.Fin = &fin
		return metricsMetadata, taskMetrics, nil
	}

	engine.lock.Lock()
	defer engine.lock.Unlock()

	for taskArn := range engine.tasksToContainers {
		containerMetrics, err := engine.taskContainerMetricsUnsafe(taskArn)
		if err != nil {
			seelog.Debugf("Error getting container metrics for task: %s, err: %v", taskArn, err)
			continue
		}

		if len(containerMetrics) == 0 {
			seelog.Debugf("Empty containerMetrics for task, ignoring, task: %s", taskArn)
			continue
		}

		taskDef, exists := engine.tasksToDefinitions[taskArn]
		if !exists {
			seelog.Debugf("Could not map task to definition, task: %s", taskArn)
			continue
		}

		metricTaskArn := taskArn
		taskMetric := &ecstcs.TaskMetric{
			TaskArn:               &metricTaskArn,
			TaskDefinitionFamily:  &taskDef.family,
			TaskDefinitionVersion: &taskDef.version,
			ContainerMetrics:      containerMetrics,
		}
		taskMetrics = append(taskMetrics, taskMetric)
	}

	if len(taskMetrics) == 0 {
		// Not idle. Expect taskMetrics to be there.
		return nil, nil, EmptyMetricsError
	}

	// Reset current stats. Retaining older stats results in incorrect utilization stats
	// until they are removed from the queue.
	engine.resetStatsUnsafe()
	return metricsMetadata, taskMetrics, nil
}
func (engine *DockerStatsEngine) GetInstanceMetrics() (*ecstcs.MetricsMetadata, []*ecstcs.TaskMetric, error) {
	var taskMetrics []*ecstcs.TaskMetric
	idle := engine.isIdle()
	metricsMetadata := &ecstcs.MetricsMetadata{
		Cluster:           aws.String(engine.cluster),
		ContainerInstance: aws.String(engine.containerInstanceArn),
		Idle:              aws.Bool(idle),
		MessageId:         aws.String(uuid.NewRandom().String()),
	}

	if idle {
		seelog.Debug("Instance is idle. No task metrics to report")
		fin := true
		metricsMetadata.Fin = &fin
		return metricsMetadata, taskMetrics, nil
	}

	engine.lock.Lock()
	defer engine.lock.Unlock()

	for taskArn := range engine.tasksToContainers {
		containerMetrics, err := engine.taskContainerMetricsUnsafe(taskArn)
		if err != nil {
			seelog.Debugf("Error getting container metrics for task: %s, err: %v", taskArn, err)
			continue
		}

		if len(containerMetrics) == 0 {
			seelog.Debugf("Empty containerMetrics for task, ignoring, task: %s", taskArn)
			continue
		}

		taskDef, exists := engine.tasksToDefinitions[taskArn]
		if !exists {
			seelog.Debugf("Could not map task to definition, task: %s", taskArn)
			continue
		}

		metricTaskArn := taskArn
		taskMetric := &ecstcs.TaskMetric{
			TaskArn:               &metricTaskArn,
			TaskDefinitionFamily:  &taskDef.family,
			TaskDefinitionVersion: &taskDef.version,
			ContainerMetrics:      containerMetrics,
		}
		taskMetrics = append(taskMetrics, taskMetric)
	}

	if len(taskMetrics) == 0 {
		// Not idle. Expect taskMetrics to be there.
		return nil, nil, EmptyMetricsError
	}

	// Reset current stats. Retaining older stats results in incorrect utilization stats
	// until they are removed from the queue.
	engine.resetStatsUnsafe()
	return metricsMetadata, taskMetrics, nil
}
func ( engine * DockerStatsEngine ) GetInstanceMetrics ( ) ( * ecstcs . MetricsMetadata , [ ] * ecstcs . TaskMetric , error ) { var taskMetrics [ ] * ecstcs . TaskMetric idle := engine . isIdle ( ) metricsMetadata := & ecstcs . MetricsMetadata { Cluster : aws . String ( engine . cluster ) , ContainerInstance : aws . String ( engine . containerInstanceArn ) , Idle : aws . Bool ( idle ) , MessageId : aws . String ( uuid . NewRandom ( ) . String ( ) ) , } if idle { seelog . Debug ( " " ) fin := true metricsMetadata . Fin = & fin return metricsMetadata , taskMetrics , nil } engine . lock . Lock ( ) defer engine . lock . Unlock ( ) for taskArn := range engine . tasksToContainers { containerMetrics , err := engine . taskContainerMetricsUnsafe ( taskArn ) if err != nil { seelog . Debugf ( " " , taskArn , err ) continue } if len ( containerMetrics ) == 0 { seelog . Debugf ( " " , taskArn ) continue } taskDef , exists := engine . tasksToDefinitions [ taskArn ] if ! exists { seelog . Debugf ( " " , taskArn ) continue } metricTaskArn := taskArn taskMetric := & ecstcs . TaskMetric { TaskArn : & metricTaskArn , TaskDefinitionFamily : & taskDef . family , TaskDefinitionVersion : & taskDef . version , ContainerMetrics : containerMetrics , } taskMetrics = append ( taskMetrics , taskMetric ) } if len ( taskMetrics ) == 0 { // Not idle. Expect taskMetrics to be there. return nil , nil , EmptyMetricsError } // Reset current stats. Retaining older stats results in incorrect utilization stats // until they are removed from the queue. engine . resetStatsUnsafe ( ) return metricsMetadata , taskMetrics , nil }
// GetInstanceMetrics gets all task metrics and instance metadata from stats engine.
GetInstanceMetrics gets all task metrics and instance metadata from stats engine .