はじめに
前回、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関数の設定は、下記の手順で行えます。
- 「アラームの作成」→「メトリクスの選択」の「参照」タブから、元になるメトリクスをチェックする
- 「グラフ化したメトリクス」タブから、右上の「数式を追加」をクリックする
- 「数式を追加」から、「空の式で始める」をクリックする
- 「数式の編集」ダイアログが出てくるので、
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」で登壇することになりました。
登壇内容としては、Remote SSH(=VS Code拡張機能)について、以前書いた【VS Code】Remote SSHでSSH接続するの内容をベースに、もう少し深く説明したり、時間があればデモもやろうかなと考えています。
また何かあれば、公式サイトなどでも発表があると思いますので、よろしくお願いします。
では、今回はこの辺で&よいお年を!