Project

General

Profile

Cloudwatchメトリクスの取得

準備

例としてRDSのメトリクスを取得する。

  • ネームスペース
    AWS/RDS
  • メトリクス名
    CPUUtilization
  • DBインスタンス識別子
    mysql
  • jsonの解釈を行う場合、jqコマンドをインストールしておく
    yum install jq
    

メトリクスの取得方法

ネームスペースの検索

  • 情報を取得したいサービスのネームスペースを探す
    aws cloudwatch list-metrics |grep Namespace
    
  • RDSは次のネームスペースとなっていることがわかる
    "Namespace": "AWS/RDS" 
    

ネームスペースの持つメトリクスの検索

  • ネームスペースのもつメトリクスから必要な情報を探す
    aws cloudwatch list-metrics --namespace "AWS/RDS" |grep MetricName
    
  • メトリクスは次の名前となっていることがわかる
    "MetricName": "CPUUtilization" 
    

メトリクスの詳細を表示

  • 得られたメトリクス名から値を表示する
    aws cloudwatch list-metrics --namespace "AWS/RDS" --metric-name "CPUUtilization" 
    
  • このうち、Dimentionsの情報から特定のデータベースの「mysql」のデータは次のデータであるとわかる
            {
                "Namespace": "AWS/RDS",
                "Dimensions": [
                    {
                        "Name": "DBInstanceIdentifier",
                        "Value": "mysql" 
                    }
                ],
                "MetricName": "CPUUtilization" 
            },
    

メトリクスの特定

  • 得られたDimentionsをもとに、メトリクスを絞り込む
    aws cloudwatch list-metrics --namespace "AWS/RDS" --dimensions Name="DBInstanceIdentifier",Value="mysql" --metric-name "CPUUtilization" 
    
  • 次のように1つの結果に絞り込まれる
    {
        "Metrics": [
            {
                "Namespace": "AWS/RDS",
                "Dimensions": [
                    {
                        "Name": "DBInstanceIdentifier",
                        "Value": "mysql" 
                    }
                ],
                "MetricName": "CPUUtilization" 
            }
        ]
    }
    

メトリクスの値の表示

AWS画面上でと同様に特定の期間を指定して、その時間の値を取得する

  • 上記を取得してメトリクスの値を取得する
特定のポイントの値が複数戻り、スクリプトで不都合が出る場合、
period の値を増やして1つだけ戻るようにするか、後述のjqコマンド
での成型時に一つ目の値だけ処理するように調整する。
aws cloudwatch get-metric-statistics \
--namespace "AWS/RDS" \
--dimensions Name=DBInstanceIdentifier,Value=sympa \
--metric-name "CPUUtilization" \
--statistics Average \
--start-time `date -u -d '5 minutes ago' +%Y-%m-%dT%TZ` \
--end-time `date -u +%Y-%m-%dT%TZ` \
--period 300
  • 次のように結果が戻る
    {
        "Datapoints": [
            {
                "Timestamp": "2019-06-13T06:02:00Z",
                "Average": 2.375227686703097,
                "Unit": "Percent" 
            }
        ],
        "Label": "CPUUtilization" 
    }
    

jsonを解釈して値を取り出す

  • 上記の出力から次のjqコマンドをパイプさせてjsonを解釈してデータポイントの値(Average)を得る
    [0]は複数のデータポイントにマッチしても1つ目の結果のみを示す。
    []とすることで複数を複数のまま処理する。
    「-r」オプションは出力結果を""で囲わないようにする。
    jq -r ".Datapoints[0].Average" 
    
  • 実際にはメトリクスの取得も含めて次の1つのコマンドとなる
    aws cloudwatch get-metric-statistics \
    --namespace "AWS/RDS" \
    --dimensions Name=DBInstanceIdentifier,Value=sympa \
    --metric-name "CPUUtilization" \
    --statistics Average \
    --start-time `date -u -d '5 minutes ago' +%Y-%m-%dT%TZ` \
    --end-time `date -u +%Y-%m-%dT%TZ` \
    --period 300 | jq -r ".Datapoints[0].Average" 
    
  • 次のように結果が得られる
    2.375227686703097