in plugins/outputs/cloudwatch/cloudwatch.go [412:530]
func (c *CloudWatch) BuildMetricDatum(point telegraf.Metric) []*cloudwatch.MetricDatum {
//high resolution logic
isHighResolution := false
highResolutionValue, ok := point.Tags()[highResolutionTagKey]
if ok && strings.EqualFold(highResolutionValue, "true") {
isHighResolution = true
point.RemoveTag(highResolutionTagKey)
}
rawDimensions := BuildDimensions(point.Tags())
dimensionsList := c.ProcessRollup(rawDimensions)
//https://pratheekadidela.in/2016/02/11/is-append-in-go-efficient/
//https://www.ardanlabs.com/blog/2013/08/understanding-slices-in-go-programming.html
var datums []*cloudwatch.MetricDatum
for k, v := range point.Fields() {
log.Printf("D! #Fields of the current point: k - %s v - %f", k, v)
var unit string
var value float64
var distList []distribution.Distribution
switch t := v.(type) {
case uint:
value = float64(t)
case uint8:
value = float64(t)
case uint16:
value = float64(t)
case uint32:
value = float64(t)
case uint64:
value = float64(t)
case int:
value = float64(t)
case int8:
value = float64(t)
case int16:
value = float64(t)
case int32:
value = float64(t)
case int64:
value = float64(t)
case float32:
value = float64(t)
case float64:
value = t
case bool:
if t {
value = 1
} else {
value = 0
}
case time.Time:
value = float64(t.Unix())
case distribution.Distribution:
if t.Size() == 0 {
// the distribution does not have a value
continue
}
distList = resize(t, c.MaxValuesPerDatum)
unit = t.Unit()
default:
// Skip unsupported type.
continue
}
metricName := aws.String(c.decorateMetricName(point.Name(), k))
if unit == "" {
unit = c.decorateMetricUnit(point.Name(), k)
}
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(point.Name(), k) {
continue
}
if len(distList) == 0 {
datum := &cloudwatch.MetricDatum{
MetricName: metricName,
Dimensions: dimensions,
Timestamp: aws.Time(point.Time()),
Value: aws.Float64(value),
}
if unit != "" {
datum.SetUnit(unit)
}
if isHighResolution {
datum.SetStorageResolution(1)
}
datums = append(datums, datum)
} else {
for _, dist := range distList {
datum := &cloudwatch.MetricDatum{
MetricName: metricName,
Dimensions: dimensions,
Timestamp: aws.Time(point.Time()),
}
values, counts := dist.ValuesAndCounts()
datum.SetValues(aws.Float64Slice(values))
datum.SetCounts(aws.Float64Slice(counts))
datum.SetStatisticValues(&cloudwatch.StatisticSet{
Maximum: aws.Float64(dist.Maximum()),
Minimum: aws.Float64(dist.Minimum()),
SampleCount: aws.Float64(dist.SampleCount()),
Sum: aws.Float64(dist.Sum()),
})
if unit != "" {
datum.SetUnit(unit)
}
if isHighResolution {
datum.SetStorageResolution(1)
}
datums = append(datums, datum)
}
}
}
}
return datums
}