This example creates a new Amazon CloudWatch metric in a namespace.


  • NAMESPACE is the namespace for the metric.
  • METRIC-NAME is the name of the metric.
  • SECONDS is the number of seconds for the metric.
  • DIMENSION-NAME is the name of the dimension.
  • DIMENSION-VALUE is the value of the dimension.

The unit test accepts similar values in config.json.

Source code

// Copyright, Inc. or its affiliates. All Rights Reserved.
// SPDX - License - Identifier: Apache - 2.0
package main

import (


// CWPutMetricDataAPI defines the interface for the PutMetricData function.
// We use this interface to test the function using a mocked service.
type CWPutMetricDataAPI interface {
	PutMetricData(ctx context.Context,
		params *cloudwatch.PutMetricDataInput,
		optFns ...func(*cloudwatch.Options)) (*cloudwatch.PutMetricDataOutput, error)

// CreateCustomMetric creates a new Amazon CloudWatch metric in a namespace
// Inputs:
//     c is the context of the method call, which includes the Region
//     api is the interface that defines the method call
//     input defines the input arguments to the service call.
// Output:
//     If success, a PutMetricDataOutput object containing the result of the service call and nil
//     Otherwise, nil and an error from the call to PutMetricData
func CreateCustomMetric(c context.Context, api CWPutMetricDataAPI, input *cloudwatch.PutMetricDataInput) (*cloudwatch.PutMetricDataOutput, error) {
	return api.PutMetricData(c, input)

func main() {
	namespace := flag.String("n", "", "The namespace for the metric")
	metricName := flag.String("m", "", "The name of the metric")
	value := flag.Float64("s", 0.0, "The number of seconds for the units")
	dimensionName := flag.String("dn", "", "The name of the dimension")
	dimensionValue := flag.String("dv", "", "The value of the dimension")

	if *namespace == "" || *metricName == "" || *dimensionName == "" || *dimensionValue == "" {
		fmt.Println("You must supply a namespace, metric name, dimension name, and dimension value")

	cfg, err := config.LoadDefaultConfig(context.TODO())
	if err != nil {
		panic("configuration error, " + err.Error())

	client := cloudwatch.NewFromConfig(cfg)

	input := &cloudwatch.PutMetricDataInput{
		Namespace: namespace,
		MetricData: []types.MetricDatum{
				MetricName: metricName,
				Unit:       types.StandardUnitSeconds,
				Value:      value,
				Dimensions: []types.Dimension{
						Name:  dimensionName,
						Value: dimensionValue,

	_, err = CreateCustomMetric(context.TODO(), client, input)
	if err != nil {

	fmt.Println("Created a custom metric")

See the complete example in GitHub.