func()

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
}