in internal/metrics/cloudwatch.go [47:83]
func (r *cloudwatchRegistry) Emit() error {
r.lock.Lock()
defer r.lock.Unlock()
for namespace, data := range r.dataByNamespace {
for i := 0; i < len(data); {
var metricData []types.MetricDatum
// we can emit up to 1000 values per PutMetricData
for j := 0; j < len(data) && j < 1000; j++ {
datum := data[i]
var dimensions []types.Dimension
for key, val := range datum.dimensions {
dimensions = append(dimensions, types.Dimension{
Name: aws.String(key),
Value: aws.String(val),
})
}
metricData = append(metricData, types.MetricDatum{
MetricName: aws.String(datum.spec.Metric),
Value: aws.Float64(datum.value),
Dimensions: dimensions,
Timestamp: &datum.timestamp,
})
i++
}
_, err := r.cw.PutMetricData(context.TODO(), &cloudwatch.PutMetricDataInput{
Namespace: aws.String(namespace),
MetricData: metricData,
})
if err != nil {
return err
}
}
klog.Infof("emitted %d metrics to namespace: %s", len(data), namespace)
}
r.dataByNamespace = make(map[string][]*cloudwatchMetricDatum)
return nil
}