CloudWatch Agentでメトリクスの集約を行う

CloudWatch Agentではaggregation_dimensionsを指定してメトリクスを任意のディメンジョンで集約することができます。AutoScalingGroupのインスタンスなど、複数のインスタンスの情報を集約してメトリクス化、監視することができます。
2020.01.21

はじめに

CloudWatch Agentを使うとインスタンスの各種メトリクス(CPU、メモリ、ディスク)をCloudWatch に送信することができます

新しいCloudWatch Agentでメトリクスとログの収集が行なえます

AutoScaling Groupごとにメトリクスを見たい

ウィザードによって生成される設定ではメトリクスにはディメンジョンとしてインスタンスIDが含まれます。そのためメトリクスを確認する単位はインスタンス単位となります。しかしWebサーバなどAutoScaling Groupで管理されるインスタンスではAutoScaling Groupごとに監視をしたい場合があるかと思います。

そんな時にはaggregation_dimensionsを指定することで任意のディメンジョンでメトリクスを集約することできます。

設定ファイル例

下記の例では "aggregation_dimensions": [["AutoScalingGroupName"]] という指定によってAutoScalingGroup名によって集約を行なっています。

    {
        "metrics": {
            "append_dimensions": {
                "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                "ImageId": "${aws:ImageId}",
                "InstanceId": "${aws:InstanceId}",
                "InstanceType": "${aws:InstanceType}"
            },
            "aggregation_dimensions": [["AutoScalingGroupName"]],
            "metrics_collected": {
                "cpu": {
                    "measurement": [
                        "cpu_usage_user",
                    ],
                    "metrics_collection_interval": 60,
                    "resources": [
                        "*"
                    ],
                    "totalcpu": false
                }
            }
        }
    }

この場合下記のように集約前、集約後のメトリクスが両方保存されます(一部抜粋)

    > aws cloudwatch list-metrics --namespace CWAgent --metric-name cpu_usage_user
    {
      "Metrics": [
        {
          "Namespace": "CWAgent",
          "Dimensions": [
            {
              "Name": "InstanceId",
              "Value": "i-XXXXXX"
            },
            {
              "Name": "AutoScalingGroupName",
              "Value": "web-asg"
            },
            {
              "Name": "ImageId",
              "Value": "ami-XXXXXX"
            },
            {
              "Name": "cpu",
              "Value": "cpu1"
            },
            {
              "Name": "InstanceType",
              "Value": "c4.large"
            }
          ],
          "MetricName": "cpu_usage_user"
        },
        {
          "Namespace": "CWAgent",
          "Dimensions": [
            {
              "Name": "InstanceId",
              "Value": "i-YYYYYYY"
            },
            {
              "Name": "AutoScalingGroupName",
              "Value": "web-asg"
            },
            {
              "Name": "ImageId",
              "Value": "ami-XXXXXX"
            },
            {
              "Name": "cpu",
              "Value": "cpu1"
            },
            {
              "Name": "InstanceType",
              "Value": "c4.large"
            }
          ],
          "MetricName": "cpu_usage_user"
        },
        {
          "Namespace": "CWAgent",
          "Dimensions": [
            {
              "Name": "AutoScalingGroupName",
              "Value": "web-asg"
            }
          ],
          "MetricName": "cpu_usage_user"
        }
      ]
    }

マネジメントコンソールでも以下のように集約前、集約後のメトリクスが確認できます。

集約前のメトリクス

集約後のメトリクス

留意点

環境によっては1インスタンスから同時に複数個のメトリクスが送出されることもあります。例えばCPU使用率ならコアごと、ディスク使用率ならマウントポイントごとの値が生成されます。 それらをAutoScalingGroupNameでそのまま集約してしまうと、監視対象から除外したいマウントポイントの値が集約結果に影響してしまうため、監視の要件に応じてディメンジョンを追加し、フィルタリングを行う必要があります。 例えばディスク使用率なら、集約するディメンジョンは["AutoScalingGroupName", "path"] と指定してマウントポイントごとのメトリクスを生成するようにした上で、ディメンジョンにpath=/を指定することでデバイスやtmpfsを除外することができます。

まとめ

aggregation_dimensions でメトリクスを任意のディメンジョンで集約することができます。AutoScalingGroupのインスタンスなど、複数のインスタンスの情報を集約してメトリクス化、監視することができます。