概要
メトリクスの情報を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の確認方法
アラートを作成画面から確認可能。*
もしくは
Dimensionの確認
CloudWatch コンソールでのメトリクスの表示より、LambdaのDimensionは以下から選択する。(組合せ可能)
- FunctionName
- Resource
- ExecuteVersion
- なし
統計の選択
実行
平均
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
{
"Id": "q1",
"MetricStat": {
"Metric": {
"Namespace": "AWS/Lambda",
"MetricName": "Duration",
"Dimensions": [
{
"Name": "FunctionName",
"Value": "aws-calta"
}
]
},
"Period": 3600,
"Stat": "Average"
}
}
{
"MetricDataResults": [
{
"Id": "q1",
"Label": "Duration",
"Timestamps": ["2022-03-12T06:00:00+00:00"],
"Values": [ 183479.85 ],
"StatusCode": "Complete"
}
],
"Messages": []
}
複数確認
queryは複数配列でしても可能。
[
{
"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"
}
}
]
{
"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-functionsでfilterを使ってFunctionNameを取得し、ディメンションへの入力として、メトリクスを吐き出すことを考える。
#!/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
{
"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