1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

aws cliからCloudWatchのメトリクスの情報を取得するメモ

Last updated at Posted at 2022-03-17

概要

メトリクスの情報をcliから取得したい。
知識0の状態のため、調べながら取得を試した手順をメモとして残す。
ここではLambdaのDurationを一括取得する例とする。

ソースコード

知っておく必要のある概念

用語の解説と一緒に記載されている図を参照。(*公式:ClouodWatchの概念)

  • 集約
    • 大きいデータセットの場合、統計セットという事前集約されたデータセットを利用できる
      • 利用できる集計はrawポイントと異なるものもある(パーセンタイルなど)

cliの基本記法

getmetricdata

GetMetricData または GetMetricStatistics のどちらを CloudWatch メトリクスに使用すればよいですか? より、基本的にGetMetricData( *cli )を利用すればよい模様。

aws cloudwatch get-metric-data
--metric-data-queries <value>
--start-time <value>
--end-time <value>
[--scan-by <value>]
[--label-options <value>]
[--cli-input-json <value>]
[--starting-token <value>]
[--page-size <value>]
[--max-items <value>]
[--generate-cli-skeleton <value>]

次に、各パラメータを設定するために、何処を見ればいいか考える。

namespaceの確認方法

アラートを作成画面から確認可能。*

image.png

image.png

もしくは

image.png

Dimensionの確認

CloudWatch コンソールでのメトリクスの表示より、LambdaのDimensionは以下から選択する。(組合せ可能)

  • FunctionName
  • Resource
  • ExecuteVersion
  • なし

コンソールのメトリクスだと以下の部分がディメンション。
image.png

統計の選択

CloudWatch 統計定義

実行

平均

aws cloudwatch get-metric-data \
--metric-data-queries $(cat query.json | jq -c) \
--start-time 2022-03-12T04:00:00Z \
--end-time 2022-03-12T10:00:00Z 
query.json
{
  "Id": "q1",
  "MetricStat": {
    "Metric": {
      "Namespace": "AWS/Lambda",
      "MetricName": "Duration",
      "Dimensions": [
        {
          "Name": "FunctionName",
          "Value": "aws-calta"
        }
      ]
    },
    "Period": 3600,
    "Stat": "Average"
  }
}
result
{
  "MetricDataResults": [
    {
      "Id": "q1",
      "Label": "Duration",
      "Timestamps": ["2022-03-12T06:00:00+00:00"],
      "Values": [ 183479.85 ],
      "StatusCode": "Complete"
    }
  ],
  "Messages": []
}

複数確認

queryは複数配列でしても可能。

query.json
[
  {
    "Id": "q1",
    "MetricStat": {
      "Metric": {
        "Namespace": "AWS/Lambda",
        "MetricName": "Duration",
        "Dimensions": [
          {
            "Name": "FunctionName",
            "Value": "f1"
          }
        ]
      },
      "Period": 60,
      "Stat": "p90"
    }
  },
  {
    "Id": "q2",
    "MetricStat": {
      "Metric": {
        "Namespace": "AWS/Lambda",
        "MetricName": "Duration",
        "Dimensions": [
          {
            "Name": "FunctionName",
            "Value": "f2"
          }
        ]
      },
      "Period": 60,
      "Stat": "p90"
    }
  }
]
result
{
 "MetricDataResults": [
 {
 "Id": "q1",
 "Label": "f1",
 "Timestamps": ["2022-03-12T06:49:00+00:00"],
 "Values": [ 183479.85],
 "StatusCode": "Complete"
 },
 {
 "Id": "q2",
 "Label": "f2",
 "Timestamps": ["2022-03-12T06:45:00+00:00"],
 "Values": [ 22207.87],
 "StatusCode": "Complete"
 }
 ],
 "Messages": []
 }

結果の成型

TimestampとValuesが別の配列に入っていると確認しづらいので、jqを使って正規化。
MetricDataResultsが複数だと複雑になるので、Id:q1のみが返るクエリを使ったものとする。

cat ./result/result.log | jq '.MetricDataResults[0] | {"id": .Id, "times": .Timestamps, "values": .Values } as $tmp | range(0;($tmp.times|length))|{"id":$tmp.id,"time":$tmp.times[.], "value": $tmp.values[.]} | [.id, .time,.value] | @csv' -r
.MetricDataResults[0] | # 配列は一つだけとする
{"id": .Id, "times": .Timestamps, "values": .Values } as $tmp | #変数に格納
range(0;($tmp.times|length))| # ループの準備。Timestampの数だけループする
{"id":$tmp.id,"time":$tmp.times[.], "value": $tmp.values[.]} | # .にはrangeで作成した数字が入っている
[.id, .time,.value] | # csvにできるように結果を配列にする
@csv' | #csv形式で結果を表示
-r # 文字列を囲むダブルクォーテーションがエスケープされないようにする
"q1","2022-03-12T07:43:00+00:00",194197.06
"q1","2022-03-12T07:28:00+00:00",41223.9

lambdaすべてのメトリクスを取得

lambdaのlist-functionsfilterを使ってFunctionNameを取得し、ディメンションへの入力として、メトリクスを吐き出すことを考える。

get-metrics.sh
#!/bin/bash

# このシェルスクリプトのディレクトリの絶対パスを取得。
bin_dir=$(cd $(dirname $0) && pwd)

# 変数
start_time=2022-03-12T04:00:00Z
end_time=2022-03-12T10:00:00Z 

# 空の結果ファイル作成
file_name=$(echo $(date -u +"%Y%m%d_%H%M%S"))
file_path=$bin_dir/result/$file_name.csv
mkdir -p $bin_dir/result
touch $file_path

# lambda関数一覧の取得
tmp_functions=$(aws lambda list-functions --query 'Functions[*].FunctionName' --no-paginate | jq -r '.[]')

jq_query='.MetricDataResults[0] | {"id": .Id, "times": .Timestamps, "values": .Values } as $tmp | range(0;($tmp.times|length))|{"id":$tmp.id,"time":$tmp.times[.], "value": $tmp.values[.]} | [.id, .time,.value] | @csv'

# lambdaごとにメトリクスを取得
for v in ${tmp_functions}
do 
  # 改行文字・空白の削除
  trimed_v=$(echo $v)
  # -はidに使用できないので変換
  tmp_id=$(echo $trimed_v | sed 's/-/_/g')
  echo "get metrics $trimed_v"
  query=$(cat $bin_dir/query.json | jq -c | sed "s/{{FunctionName}}/$trimed_v/" | sed "s/{{FunctionId}}/$tmp_id/")
  # メトリクスの取得
  tmp_result=`aws cloudwatch get-metric-data \
  --metric-data-queries $query \
  --start-time $start_time \
  --end-time $end_time 
  `
  # 結果の書込み
  echo $tmp_result | jq  -r "$jq_query"  >> $file_path
done
query.json
{
  "Id": "q_{{FunctionId}}",
  "MetricStat": {
    "Metric": {
      "Namespace": "AWS/Lambda",
      "MetricName": "Duration",
      "Dimensions": [
        {
          "Name": "FunctionName",
          "Value": "{{FunctionName}}"
        }
      ]
    },
    "Period": 3600,
    "Stat": "p90"
  }
}

気になること

参考にした記事内で書かれていて気になったこと。
公式ドキュメントに根拠が書かれているか調べてみた。

  • cloudwatchでは2週間前までのデータしから取得できない ← ホント? ← データポイントの期間による
  • cloudwatchのログは3か月で消える ← ホント? デフォルト値とか? ← データポイントの期間による

メトリクスより。

メトリクスは作成されたリージョンにのみ存在します。
メトリクスは削除できませんが、それらに対して新しいデータが発行されない場合、15 か月後に自動的に有効期限切れになります。
15 か月以上経過したデータポイントは、ローリング方式で期限切れになります。
つまり、新しいデータポイントが入ってくるたびに、古い 15 か月以上経過したものが削除されます。

また、ログは以下の制限がある。
メトリクスの保持

CloudWatch では、次のようにメトリクスデータを保持します。

データポイントの期間 保持期間
60 秒未満 3 時間
60 秒 (1 分) 15 日間
300 秒 (5 分) 63 日間
3600 秒 (1 時間) 455 日 (15 か月)

参考

CloudWatchメトリクス AWS CLI サンプル集
公式 aws cli cloudwatch
CloudWatchメトリクスを定期的に取得するログ監視システムの構築
AWS CLIでWAFのCloudWatchメトリクスを取得するときにはまったはなし
loudwatchのチュートリアルを読み解く
CloudWatchメトリクスのデータポイントをAWS CLIで取得する
sed


metric-math

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?