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
}