いつの間にか増えていた CloudWatch Metric Math の 14 個の関数を確認してみた

みんな大好き Metric Math の関数です

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンバンハ、千葉(幸)です。

少し前のアップデートですが、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 ファイルシステムを作成されたことがある方は、詳細画面からスループット利用率が確認できることはご存知かと思います。

EFS_MetricMath

このスループット利用率は対応する単一のメトリクスが用意されているわけではありません。複数のメトリクスに対して Metric Math による計算を行った結果、新たなメトリクスとして表示されている状態です。

CloudWatch メトリクスの画面から確認してみましょう。

EFS_MetricMath-5487644

複数の計算結果から、最終的に id e4のスループット利用率が導き出されています。

EFS_MetricMath-5488023

ちょっとごちゃっとしますが、計算の流れは以下です。

EFS_MetricMath2

まず、本来のメトリクスとして用意されているのは以下です。

  • 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 関数の引数やその戻り値の型は以下の表から確認できます。

MetricsMath

ここではデータタイプが以下の略語で表現されています。

  • S:スカラー数
  • TS:時系列(時間の経過に伴う単一の CloudWatch メトリクスの一連の値)
  • TS[]:時系列の配列(複数のメトリクスの時系列など)

関数によって対応している引数に違いがあり、渡した引数によって戻り値のタイプも変わるということが分かります。

ここで、FILL関数の引数として上記のデータタイプ以外にREPEATLINEARが含まれるようになりました。

MericsMath_FILL

これらは関数という扱いなのか不明ですが、この2つも含めて「14 種類の関数」が追加された、と表現されています。

# 関数 概要
13 REPEAT 最新の値を使用して欠損を埋める(FILL関数で使用)
14 LINEAR 欠損部の最初と最後の値の間に線形補完を行う(FILL関数で使用)

今回のアップデートにより追加されたものを含めて全部で 30 種類以上の関数がサポートされています。せっかくなら活用していきたいですね。

やってみた

アップデートにより追加された関数を使用し、グラフの描画がどう変わるかを確認します。(代表して2つだけ)

今回はベースとして以下のメトリクスを使用します。 EC2 の CPU 使用率を一週間分グラフで表示しています。

MetricthMath1

「数式」を押下し、使用したい関数を選択します。今回は DAY 関数を選択しました。

MetricsMath_math

関数を選択すると、関数の詳細にサンプルが自動的に記載されます。また、元のメトリクスと数式による計算後のメトリクスに id が自動的に採番されます。

MetricsMath_DAY

元々のメトリクスの時系列を非表示にすると、DAY(m1) < 6 の条件に従い月〜金曜日の値のみが表示されていることが分かります。(グラフは JST で関数は UTC 基準のためズレがありますが……)

MetricsMath3

関数を修正して時間でのフィルタリングを追加すると(IF((DAY(m1) < 6) AND (HOUR(m1) < 12) , m1))、さらに特定の期間のみ表示できます。

MetricsMath4

この数式を利用した CloudWatch アラームの作成も可能です。今回の例そのものは実用性が無さそうですが、Metric Math を使用したアラームが作成できる、というのは覚えておくと役に立つかもしれません。

CloudWatch_MetricsMath

終わりに

新しく追加された CloudWatch Metric Math の関数を確認しました。

Metric Math は正直あまりメジャーな機能ではないと思いますが、改めて確認するとなかなか面白いものが多いと感じました。特に今回試してみた DAY や HOUR は、 IF 関数と組み合わせることで特定の期間の監視を抑止する、という使い方ができそうです。

CloudWatch は自分のユースケースに完全にはマッチしていないな……と思うことがある場合には、 Metric Math と組み合わせることで解消できるかもしれません。思い出してみてください。

以上、 チバユキ (@batchicchi) がお送りしました。