Amazon RDSの拡張モニタリングのメトリクスをAWS CLIから取得してみた

Amazon RDS ProxyはAmazon RDS向けの完全マネージド型で可用性の高いデータベースプロキシです。 コネクションプーリングや自動フェイルオーバーなどを完全マネージドで利用できます。
2020.03.16

Amazon RDSの拡張モニタリングを有効にすると、DB インスタンスが実行されているオペレーティングシステム (OS) のCPU、メモリ、ディスクI/O等に関するリアルタイムのメトリクスを取得できるようになります。

メトリクスはRDSコンソールで視覚化されていますが、今回は AWS CLI を使ってコマンドラインからメトリクスを取得する方法を紹介します。

やり方

拡張モニタリングを有効にすると、CloudWatch Logsのロググループ「RDSOSMetrics」以下にリソースIDごとにログストリームが作成され、メトリクスはJSON形式でこのストリームにログ出力されます。

したがって、AWS CLIから CloudWatch Logs に対して

  • ロググループ(RDSOSMetrics固定)
  • ログストリーム(DBインスタンスのリソースID(DbiResourceId))
  • 時刻

を指定すると、拡張モニタリングのメトリクスを取得できます。

CloudWatch Logsのログを確認

CloudWatch Logsに出力された拡張メトリクスのログを確認します。

$ aws logs get-log-events \
  --log-group-name RDSOSMetrics \
  --log-stream-name db-XXX \
  --limit 1
{
    "events": [
        {
            "timestamp": 1584301622000,
            "message": "{\"engine\":\"Aurora\",\"instanceID\":\"AAA\",\"instanceResourceID\":\"db-XXX\",... ,\"vmlimit\":0}]}",
            "ingestionTime": 1584301622342
        },
        ...
    ],
    "nextForwardToken": "f/111",
    "nextBackwardToken": "b/222"
}

message が求める拡張メトリクスデータです。JSONオブジェクトが文字列に変換されています。

レコード件数は --limitで指定します。

メトリクス全体を確認

jq でゴニョゴニョして文字列の message を JSON に変換して表示させます。

$ aws logs get-log-events \
  --log-group-name RDSOSMetrics \
  --log-stream-name db-XXX \
  --limit 1 | 
  jq -r '.events[].message | fromjson'
{
  "engine": "Aurora",
  "instanceID": "AAA",
  "instanceResourceID": "db-XXX",
  ...
  "cpuUtilization": {
    "guest": 0,
    "irq": 0,
    ...

時刻を指定

時刻を指定してメトリクスを取得したい場合、時刻をミリ秒のUNIX TIMEで指定します。

--end-time 方式

$ aws logs get-log-events \
  --log-group-name RDSOSMetrics \
  --log-stream-name db-XXX \
  --end-time UNIX-TIME-IN-MS \
  --limit 3

--end-time で時刻を指定すると、--end-time 以前の最新レコードを取得します。

--start-time 方式

$ aws logs get-log-events \
  --log-group-name RDSOSMetrics \
  --log-stream-name db-XXX \
  --start-time UNIX-TIME-IN-MS --start-from-head \
  --limit 3

--start-time で時刻を指定すると、--start-time 以降のレコードを取得します。

--start-from-head オプションを指定することで、--start-time 時刻に近い古いレコードから順に取得します。

--start-time で指定するときは --start-from-head オプションも一緒に指定して下さい。

ミリ秒の UNIX TIME の計算方法

前提として、Mac 標準の BSD 系 date コマンドでミリ秒の UNIX TIME を計算します。

クロスプラットフォームに計算したい場合は、プログラム言語を利用すると良いでしょう。

現在時刻

$ unix_time=$(($(date +'%s * 1000 + %-N / 1000000')))

相対時刻

date コマンドに現在時刻とのデルタ(-v)を渡します。

1時間前なら -v1H となります。

$ unix_time=$(($(date -v-1H +'%s * 1000 + %-N / 1000000')))

同様に、10分前なら -v10m、1日前なら -v1dとなります。

特定の時刻

$ target_time="2020-03-10T10:00:00+0900"
$ unix_time=$(expr `date -j -f %FT%T%z ${target_time} +%s` \* 1000)

最終コマンド

過去のある時点(2020/03/10 10:00:00 JST)のロードアベレージを3件取得する場合、次のコマンドになります。

$ target_time="2020-03-10T10:00:00+0900"
$ unix_time=$(expr `date -j -f %FT%T%z ${target_time} +%s` \* 1000)
$ aws logs get-log-events \
  --log-group-name RDSOSMetrics \
  --log-stream-name db-XXX \
  --end-time $unix_time
  --limit 3 | jq -r '.events[].message | fromjson.loadAverageMinute'
{
  "one": 0.37,
  "five": 1.11,
  "fifteen": 1.19
}
{
  "one": 0.13,
  "five": 0.91,
  "fifteen": 1.11
}
{
  "one": 0.05,
  "five": 0.74,
  "fifteen": 1.04
}

補足

拡張モニタリングが取得しているメトリクスはDBエンジンごとに異なります。

一覧は次のページからご確認ください。

拡張モニタリング - Amazon Relational Database Service