func sendMetric()

in scripts/go/analyzeCUR/analyzeCUR.go [286:358]


func sendMetric(svc *cloudwatch.CloudWatch, data AthenaResponse, cwNameSpace string, cwName string, cwType string, cwDimensionName string, interval string) error {

	input := cloudwatch.PutMetricDataInput{}
	input.Namespace = aws.String(cwNameSpace)
	i := 0
	for row := range data.Rows {
		// skip metric if dimension or value is empty
		if len(data.Rows[row]["dimension"]) < 1 || len(data.Rows[row]["value"]) < 1 {
			continue
		}

		// send Metric Data as we have reached 20 records, and clear MetricData Array
		if i >= 20 {
			_, err := svc.PutMetricData(&input)
			if err != nil {
				return errors.New("Could sending CW Metric: " + err.Error())
			}
			input.MetricData = nil
			i = 0
		}
		var t time.Time
		if interval == "hourly" {
			t, _ = time.Parse("2006-01-02T15", data.Rows[row]["date"])
		} else {
			t, _ = time.Parse("2006-01-02", data.Rows[row]["date"])
		}

		v, _ := strconv.ParseFloat(data.Rows[row]["value"], 64)
		metric := cloudwatch.MetricDatum{
			MetricName: aws.String(cwName),
			Timestamp:  aws.Time(t),
			Unit:       aws.String(cwType),
			Value:      aws.Float64(v),
		}

		// Dimension can be a single or comma seperated list of values, or key/values
		// presence of "=" sign in value designates key=value. Otherwise input cwDimensionName is used as key
		d := strings.Split(data.Rows[row]["dimension"], ",")
		for i := range d {
			var dname, dvalue string
			if strings.Contains(d[i], "=") {
				dTuple := strings.Split(d[i], "=")
				dname = dTuple[0]
				dvalue = dTuple[1]
			} else {
				dname = cwDimensionName
				dvalue = d[i]
			}
			cwD := cloudwatch.Dimension{
				Name:  aws.String(dname),
				Value: aws.String(dvalue),
			}
			metric.Dimensions = append(metric.Dimensions, &cwD)
		}

		// add interval metric
		metric.Dimensions = append(metric.Dimensions, &cloudwatch.Dimension{Name: aws.String("interval"), Value: aws.String(interval)})

		// append to overall Metric Data
		input.MetricData = append(input.MetricData, &metric)
		i++
	}

	// if we still have data to send - send it
	if len(input.MetricData) > 0 {
		_, err := svc.PutMetricData(&input)
		if err != nil {
			return errors.New("Could sending CW Metric: " + err.Error())
		}
	}

	return nil
}