echo("備忘録");

IT技術やプログラミング関連など、技術系の事を備忘録的にまとめています。

【AWS】CloudWatchアラームの「欠落データの処理」について理解する

はじめに

前回AWS Advent Calendar 2022の関連記事として、CloudWatchのメトリクスに関する記事を書きました。

今回はその続き?ということで、CloudWatchアラームにある「欠落データの処理」についてです。

ちなみに、「欠落データの処理」はCloudWatchアラームの「条件」内にあります。(デフォルトでは表示されていませんが「▼その他の設定」をクリックすると出てきます)

参考資料

前提:「アラームを実行するデータポイント」について

「欠落データの処理」の前提として「アラームを実行するデータポイント」を先に説明します。

「アラームを実行するデータポイント」は「M / N」の形式で設定しますが、これは

「直近N個のデータポイントのうち、M個(以上)で『条件』で指定した条件を満たしたら、アラーム発生させる」

というものです。(もちろん、データポイントは直近から過去のものを参照します)

例えば

  • 「アラームを実行するデータポイント」を「2 / 3」と設定
  • それ以外の設定は先程の画像の通り

で、実際のメトリクス値が下記の通りだったととすると、以下ように動作をします。(赤線しきい値(=1)、緑線が実際のメトリクスの値とします)

  • 9:00~9:15分の間までは、直近3個で「メトリクス値が1より大きいデータポイントが1個より多い(≒2個以上)」状態が存在しないので、アラームは発生しない
  • 9:20の計測では直近3個で上記状態が存在する(9:20と9:10)ので、アラームが発生する

どんな時に便利?

「監視してるメトリクスの『状態』を監視する(=何か異常などがずっと起こり続けている)」際に便利です。

例えば単発のデータポイント監視だと、例えばたまたま一回だけなんかあった際にも、アラート発生します。

ただ監視内容的に、こういう「一回だけ何かあった」状態は問題ないとし、「継続的に何か異常が起こり続けている」状態だけ監視したい、という場合に役立ちます。(不要な調査作業を無くす、工数の有効活用、等)

(逆にいうと、これを適用して何かアラートが発生している場合は、間違いなく対抗必須な異常が起こり続けていることですが...)

本題:「欠落データの処理」について

で、本題の「欠落データの処理」です。

もちろんこれ自体は、「条件」ダイアログに記載の通り「欠落データを処理する方法(=欠落データをどう扱うか)」なのですが、単純に「欠落データがあった場合に『欠落データの処理』の方法で埋め合わせる」わけではありません。

CloudWatchアラームの仕様

CloudWatchアラームの仕様として、下記の仕様があります。

  • 直近N個の計測結果で判定する場合でも、実際にはN個より多くのデータ(=過去データ)を収集する
  • 収集したデータの合計がN個以上の場合、収集した過去データのみで判定を行う
    • 欠落データの埋め合わせは行わない

具体的な例を挙げて説明します。(アラームの条件は「前提:『アラームを実行するデータポイント』について」と同じとし、緑の●がない部分は欠落データとします)

過去データを含め、下記データを収集したとします。

上記のグラフで、直近3回のうち9:15と9:20はデータ欠落が発生しています。
しかし、収集した全データのうち、9:00と9:10、そして9:25のデータで「計測データ3個」の条件は満たせます。

この場合、欠落データの埋め合わせは行われず、9:00, 9:10, 9:25の3つでアラーム判定が行われます。(=「OK」と判定される)

では、いつ欠落データの埋め合わせが行われるのかというと、「収集した過去データを含めても、データがN個未満だった時」です。

欠落データの処理方法

実際の欠落データの処理には、下表の4つがあります。 仮に計測結果が下図グラフだった場合の結果も載せておきます。
※これもアラームの条件は「前提:『アラームを実行するデータポイント』について」と同じとします

項目 説明 備考 下図グラフでの結果
適正データとして処理 欠落した部分を「条件を満たさない」値として扱う OK
不正データとして処理 欠落した部分を「条件を満たす」値として扱う アラーム発生
見つからないのもとして処理 全データ欠落していた場合のみ「INSUFFICIENT_DATA」(=データ不足)状態にする(※1) 一部データのみ欠落の場合、存在する一部データのみで判定する(=条件を満たさないはずなので、OKになる?) OK
欠落データを無視 欠落データを無視し、存在するデータのみで判定する(=これも条件を満たさないはずなので、OKになる?) 全データ欠落時は、その時点の状態を維持する OK

※1:CloudWatchアラームの「通知」ダイアログにもある「データ不足」の状態です。

なお上記以外にも「早期アラーム状態」という、アラーム評価の特別なケースがありますが、これは説明が難しいので、アラーム評価の詳細説明と合わせて、下記AWS公式ドキュメントを参照してください。

参考:CloudWatch アラームの欠落データの処理の設定

常に直近N個の値で監視する方法(メトリクスMath&関数)

「欠落データの処理」に関しては以上ですが、先程CloudWatchアラームの仕様について

収集したデータの合計がN個以上の場合、収集した過去データのみで判定を行う(欠落データの収集は行われない)

と書きました。

これはこれで便利ですが、一方で「(データ欠落時に)直近N個の値でアラーム判定しない」ということでもあり、それはそれで問題になるケースもあります。(先程の例でも、「25分も前の状態で判定されても...」と思うかもしれませんし...)

そういう時に、必ず直近N個の値で判定する方法として用いられるのが、「メトリクスMath」のFILL関数です。

  • メトリクスMathは、一言で言えば「メトリクス値の計算に数式や(Excelワークシート関数のような)関数を使える」機能のことです。
  • ここでは詳細な説明は省略します。詳しくは下記AWS公式ドキュメントを参照

FILL関数の設定は、下記の手順で行えます。

  1. 「アラームの作成」→「メトリクスの選択」の「参照」タブから、元になるメトリクスをチェックする
  2. 「グラフ化したメトリクス」タブから、右上の「数式を追加」をクリックする
  3. 「数式を追加」から、「空の式で始める」をクリックする
  4. 「数式の編集」ダイアログが出てくるので、FILL(m1, 0)と入力して「適用」をクリックする。(「FILL」は大文字じゃないとダメ)

なおFILL関数は「あるメトリクスのデータが欠落した場合に、代わりの値を設定する」関数で、引数は以下の通りです。

引数 説明 備考
第1引数(=m1) 元になるメトリクスのID 今回はメトリクス「CallCount」のID「m1」を指定
第2引数(=0) 第1引数のメトリクスの値が欠落した場合に設定する値 実際はアラーム設定のより適宜値を変える

こうすれば、データ欠落は発生した箇所には値「0」が設定されるので、必ず直近N個の値でアラーム判定が行われます。

あと「ID」や「ラベル」はの値は変更可能なので、分かりやすい値に変更するとよいです。(名前右のアイコンをクリックする)

まとめ

以上、CloudWatchアラームの「欠落データの処理」についてでした。

私自身が「欠落データの処理」の仕様(というか、CloudWatchアラームの判定処理の仕様)について勘違いしていたので、今回改めてそれらについて知ることができてよかったです。

また、メトリクスMathや関数について、使いこなせば非常に便利そうだなあと強く感じました。

告知

まだ少し先ですが、来年2023年1月21日(土)に行われる「VS Code Conference Japan 2022 - 2023」で登壇することになりました。

vscode.connpass.com

登壇内容としては、Remote SSH(=VS Code拡張機能)について、以前書いた【VS Code】Remote SSHでSSH接続するの内容をベースに、もう少し深く説明したり、時間があればデモもやろうかなと考えています。

また何かあれば、公式サイトなどでも発表があると思いますので、よろしくお願いします。

では、今回はこの辺で&よいお年を!