func()

in plugins/outputs/cloudwatch/cloudwatch.go [421:489]


func (c *CloudWatch) BuildMetricDatum(metric *aggregationDatum) (cloudwatch.Entity, []*cloudwatch.MetricDatum) {
	var datums []*cloudwatch.MetricDatum
	var distList []distribution.Distribution

	if metric.distribution != nil {
		if metric.distribution.Size() == 0 {
			log.Printf("E! metric has a distribution with no entries, %s", *metric.MetricName)
			return metric.entity, datums
		}
		if metric.distribution.Unit() != "" {
			metric.SetUnit(metric.distribution.Unit())
		}
		distList = resize(metric.distribution, c.config.MaxValuesPerDatum)
	}

	dimensionsList := c.ProcessRollup(metric.Dimensions)
	for index, dimensions := range dimensionsList {
		//index == 0 means it's the original metrics, and if the metric name and dimension matches, skip creating
		//metric datum
		if index == 0 && c.IsDropping(*metric.MetricDatum.MetricName) {
			continue
		}
		if len(distList) == 0 {
			if metric.Value == nil {
				log.Printf("D! metric (%s) has nil value, dropping it", *metric.MetricName)
				continue
			}

			if !distribution.IsSupportedValue(*metric.Value, distribution.MinValue, distribution.MaxValue) {
				log.Printf("E! metric (%s) has an unsupported value: %v, dropping it", *metric.MetricName, *metric.Value)
				continue
			}
			// Not a distribution.
			datum := &cloudwatch.MetricDatum{
				MetricName:        metric.MetricName,
				Dimensions:        dimensions,
				Timestamp:         metric.Timestamp,
				Unit:              metric.Unit,
				StorageResolution: metric.StorageResolution,
				Value:             metric.Value,
			}
			datums = append(datums, datum)
		} else {
			for _, dist := range distList {
				values, counts := dist.ValuesAndCounts()
				s := cloudwatch.StatisticSet{}
				s.SetMaximum(dist.Maximum())
				s.SetMinimum(dist.Minimum())
				s.SetSampleCount(dist.SampleCount())
				s.SetSum(dist.Sum())
				// Beware there may be many datums sharing pointers to the same
				// strings for metric names, dimensions, etc.
				// It is fine since at this point the values will not change.
				datum := &cloudwatch.MetricDatum{
					MetricName:        metric.MetricName,
					Dimensions:        dimensions,
					Timestamp:         metric.Timestamp,
					Unit:              metric.Unit,
					StorageResolution: metric.StorageResolution,
					Values:            aws.Float64Slice(values),
					Counts:            aws.Float64Slice(counts),
					StatisticValues:   &s,
				}
				datums = append(datums, datum)
			}
		}
	}
	return metric.entity, datums
}