いつの間にか増えていた CloudWatch Metric Math の 14 個の関数を確認してみた
コンバンハ、千葉(幸)です。
少し前のアップデートですが、Amazon CloudWatch Metric Math が新たに 14個の関数をサポートしました。
Metric Math って何?と思ったあなたも、ぜひこれを機に覚えてください。
CloudWatch Metric Math とは
CloudWatch Metric Math は、CloudWatch メトリクスに対して使用できる数式です。単一のメトリクスに対して計算ができるのはもちろん、複数のメトリクスを掛け合わせて新たな時系列のメトリクスを生成することもできます。
これにより、計算後の新たなメトリクスを使用しての視覚化(グラフ描画)、アラームの設定が可能となります。
計算では単純な四則演算の他にも、 SUM や AVG、IF といった表計算ソフトでおなじみの関数を使用できます。今回のアップデートは、この Metric Math 関数に新たな種類が追加された、というものです。
Metric Math の具体例
文字の説明だけだと分かりづらいので、 Metric Math の具体例を見てみましょう。(あくまで Metric Math の具体例であり、今回のアップデートで追加された関数とは関係ありません。)
EFS ファイルシステムを作成されたことがある方は、詳細画面からスループット利用率が確認できることはご存知かと思います。
このスループット利用率は対応する単一のメトリクスが用意されているわけではありません。複数のメトリクスに対して Metric Math による計算を行った結果、新たなメトリクスとして表示されている状態です。
CloudWatch メトリクスの画面から確認してみましょう。
複数の計算結果から、最終的に id e4
のスループット利用率が導き出されています。
ちょっとごちゃっとしますが、計算の流れは以下です。
まず、本来のメトリクスとして用意されているのは以下です。
MeteredIOBytes
- 発生したスループット量(単位:バイト)
PermittedThroughput
- 許可されたスループット量(単位:バイト/秒)
(Amazon EFS の Amazon CloudWatch メトリクス - Amazon Elastic File System)
Metric Math を利用すると、メトリクスやその計算結果に自動的に id が採番されます。その id を指定し、計算を実施できます。
図の①では、二つの処理が行われています。
- バイト→ MiB の変換(1 MiB = 1048576 バイト)
- PERIOD 関数による 1秒あたりの MiB の算出
m1/PERIOD(m1)
の構文で、秒単位での値が返却されます。
②では単純にバイト→ MiB の変換が行われます。
①発生したスループット(MiB/s)を ②許可されたスループット(MiB/s)で割り、100をかけることでスループット利用率が導き出されているというわけです。
Metric Math の具体例のイメージがついたでしょうか。ここでは PERIOD 関数が使用されていましたが、こういった計算で使用できる新たな関数が増えた、というのが今回のアップデートです。
何の Metric Math 関数が追加されたのか
関数の一覧は以下から確認できます。
従来からの差分を確認すると、以下の関数が追加されたことがわかります。
# | 関数 | 概要 |
---|---|---|
1 | DATAPOINT_COUNT | 値を報告したデータポイントの数を返す |
2 | DIFF | 時系列の各値と先行する値との差を返す |
3 | DIFF_TIME | 時系列の各値のタイムスタンプと、先行する値のタイムスタンプの間の差を秒単位で返す |
4 | LOG | 時系列の各値の自然対数の値を返す |
5 | LOG10 | 時系列の各値の10進対数の値を返す |
6 | MINUTE | 元の時系列の各タイムスタンプの分(UTC)を表す0から59までの整数を返す |
7 | HOUR | 元の時系列の各タイムスタンプの時間(UTC)を表す0から23までの整数を返す |
8 | DAY | 元の時系列の各タイムスタンプの曜日(UTC)を表す1から7までの整数のを返す。1は月曜日、7は日曜日を表す |
9 | DATE | 元の時系列の各タイムスタンプの日(UTC)を表す1から31までの整数を返す |
10 | MONTH | 元の時系列の各タイムスタンプの月(UTC)を表す1から12までの整数を返す |
11 | RUNNING_SUM | 元の時系列の値の連続した総和を持つ時系列を返す |
12 | TIME_SERIES | すべての値がスカラー引数に設定されている時系列を返す |
あれ?12個しかない……、となりますが、残りの二つは他の関数の引数として使用できるものです。
Metric Math 関数の引数
Metric Math 関数の引数やその戻り値の型は以下の表から確認できます。
ここではデータタイプが以下の略語で表現されています。
S
:スカラー数TS
:時系列(時間の経過に伴う単一の CloudWatch メトリクスの一連の値)TS[]
:時系列の配列(複数のメトリクスの時系列など)
関数によって対応している引数に違いがあり、渡した引数によって戻り値のタイプも変わるということが分かります。
ここで、FILL
関数の引数として上記のデータタイプ以外にREPEAT
やLINEAR
が含まれるようになりました。
これらは関数という扱いなのか不明ですが、この2つも含めて「14 種類の関数」が追加された、と表現されています。
# | 関数 | 概要 |
---|---|---|
13 | REPEAT | 最新の値を使用して欠損を埋める(FILL関数で使用) |
14 | LINEAR | 欠損部の最初と最後の値の間に線形補完を行う(FILL関数で使用) |
今回のアップデートにより追加されたものを含めて全部で 30 種類以上の関数がサポートされています。せっかくなら活用していきたいですね。
やってみた
アップデートにより追加された関数を使用し、グラフの描画がどう変わるかを確認します。(代表して2つだけ)
今回はベースとして以下のメトリクスを使用します。 EC2 の CPU 使用率を一週間分グラフで表示しています。
「数式」を押下し、使用したい関数を選択します。今回は DAY 関数を選択しました。
関数を選択すると、関数の詳細にサンプルが自動的に記載されます。また、元のメトリクスと数式による計算後のメトリクスに id が自動的に採番されます。
元々のメトリクスの時系列を非表示にすると、DAY(m1) < 6
の条件に従い月〜金曜日の値のみが表示されていることが分かります。(グラフは JST で関数は UTC 基準のためズレがありますが……)
関数を修正して時間でのフィルタリングを追加すると(IF((DAY(m1) < 6) AND (HOUR(m1) < 12) , m1)
)、さらに特定の期間のみ表示できます。
この数式を利用した CloudWatch アラームの作成も可能です。今回の例そのものは実用性が無さそうですが、Metric Math を使用したアラームが作成できる、というのは覚えておくと役に立つかもしれません。
終わりに
新しく追加された CloudWatch Metric Math の関数を確認しました。
Metric Math は正直あまりメジャーな機能ではないと思いますが、改めて確認するとなかなか面白いものが多いと感じました。特に今回試してみた DAY や HOUR は、 IF 関数と組み合わせることで特定の期間の監視を抑止する、という使い方ができそうです。
CloudWatch は自分のユースケースに完全にはマッチしていないな……と思うことがある場合には、 Metric Math と組み合わせることで解消できるかもしれません。思い出してみてください。
以上、 チバユキ (@batchicchi) がお送りしました。