挨拶
はじめまして、新卒3年目サービスインフラチームのムサシです。
ツールのアクセス成功率を可視化したいなあ
先日私のチームでは、とあるツールのアクセス成功率をCloudWatchのダッシュボードに可視化しました。やったことは以下になります。
② メトリクスを利用して、ログの発生回数から成功率のグラフを作成する
③ 一定の値を下回った場合にアラートを設定し、Slackに通知
④ ダッシュボードに成功率のグラフとアラートの状態を表示する
すべて説明すると長くなってしまうので、今回は①、②について手順、詰まったことなどを備忘録的に書いていこうと思います。これを書いているのは2024年1月末の情報なので画像・内容が古いこともありますがご了承ください。
①CloudWatchに流れているログを利用してメトリクスフィルターを作成する
フィルターパターンを作ろう
まずはログをカウントするためにメトリクスを作ります。CloudWatchからロググループを選択しメトリクスフィルター内の「メトリクスフィルターを作成」から作ることができます。
パターンを定義という画面が出てくるので、抽出したいログに含まれる文字列をフィルターパターンに設定します。フィルターパターンは若干癖があるのですが、一部の正規表現が使えるので複数のアラートをまとめて抽出したい場合に便利です。
ただし正規表現を利用したメトリクスは1つのロググループにつき5個までの制限があるので注意。
1 2 3 4 |
## こんなエラーが出てつまづいた メトリクスフィルター「ほげほげ」を作成できませんでした。 Resource limit exceeded. |
注記
クォータ
メトリックスフィルターまたはサブスクリプションフィルターを作成するとき、ロググループごとに regex を含むフィルターパターンが最大 5 つあります。
メトリックスフィルターとサブスクリプションフィルターの区切りまたは JSON フィルターパターンを作成するとき、またはログイベントまたはライブテールをフィルタリングするとき、フィルターパターンごとに 2 つの regex の制限があります。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html
もしログを新しく出す場合は以下の記事のように抽出しやすい形で出すと正規表現の枠を使い切らずに済みそうです。
パターンをテストでは、どのログが引っかかるかを確認することができます。直近のログがテストデータの候補として表示されますが、「カスタムログデータ」を選択することでテストデータを自由に変える事ができます。あまり発生しないログ(処理に失敗したときのログなど)の場合はこちらを利用してフィルターパターンが正しいか確認できて便利です。
良い感じのフィルターパターンができたら次へ
次はメトリクスの設定を行います。オプションと書かれているデフォルト値とUnit以外が必須項目となります。埋めていきましょう。
まずは名前を入力します。フィルター名は後から変えられないので気をつけましょう。いくつか作ることを見越して命名ルールを決めておいた方が良いです。(1敗)
メトリクス名前空間はフォルダみたいな感じでしょうか。既にメトリクス名前空間を作っている場合は、新規作成をオフにすると既存のメトリクス名前空間から選ぶ事ができます。今回はメトリクス名前空間を新規作成し、そこに作ったメトリクスを入れていきました。
メトリクスを参照するときには、このとき作ったカスタム名前空間の中に入ることになるので、その辺りも考えつつ名前を付けましょう。画像はメトリクス名前空間の意味がよくわからずに名付けしてしまった名前空間です。わかりやすい名前を付けましょう。
メトリクス名にもわかりやすい名前を付けてあげましょう。こちらはフィルター名と違い後から変更できそうでした。
メトリクス値には1を、デフォルト値には0を設定します。こうすることで、ログをカウントすることができます。
全て埋められたら次へ。確認画面に進むので、問題なければメトリクスフィルターを作成ボタンで作成完了です。
作成したフィルターはロググループの「メトリクスフィルター」で、ロググループごとに見る事ができます。後から編集したい場合もここからできます。
②メトリクスを利用して、ログの発生回数から成功率のグラフを作成する
成功率を計算するための準備
成功率を出したい時、 ((全体数-失敗数)/全体数)*100で計算できます。初めは成功パターンをカウントしようとしていたのですが、成功とするログのパターンが多かったため、数が少なく絞り込みやすい失敗パターンをカウントする方向で進めていくことにしました。全体数をカウントするメトリクスと失敗パターンをカウントするメトリクスの2つが必要なので、これらを①で説明した手順で作成していきます。
ステータスコードやURLをフィルターパターンとして設定し、「アクセス失敗ログをカウントするメトリクス(m2とする)」「ツールのアクセス全体のログをカウントするメトリクス(m1とする)」を作成しました。
グラフを作ろう
メトリクスができたら、グラフを作っていきましょう。CloudWatchのすべてのメトリクスを選択し、参照タブで先ほど作ったm2とm1を探してチェックを入れます。すると上にグラフとして表示させることができます。表示した各グラフはグラフ化したメトリクスタブで設定が変更でき、統計を「合計」にすることでログの発生回数をカウントすることができます。
全体数(m1)、失敗数(m2)が揃ったので、あとはこれを用いて計算したものをグラフとして出せばOKです。成功率を出すための式を作るため「数式を追加」ボタンを押します。関数などいろいろ選べますが、今回はシンプルな四則演算を設定したいため「空の式で始まる」を選択することにします。
グラフ化したメトリクスの欄に式e1が作成されました。
詳細の欄には数式が設定できます。この数式には既に参照したメトリクスを設定可能です。成功率の数式にメトリクスm2、m1を当てはめると、 ((全体数-失敗数)/全体数)*100=((m1-m2)/m1)*100となります。e1に ((m1-m2)/m1)*100を数式として設定しましょう。成功率がグラフとして表示されれば完成です。
もし全くアクセスがない場合は
全体数が0になることで上手く計算されず、グラフが表示されないかもしれません。そのときはIF式を使うことで計算エラーを回避できます。IF式は IF(n,n≠0のときの値, n=0のときの値)のように使えるみたいです。今回は、アクセスが無い場合は問題なしとして成功率100%になって欲しいので IF(m1, e1, 100)という式e2を新たに追加しました。e1のチェックを外して非表示にし、e2のみをグラフとして表示することで欲しいグラフを見ることができました。
終わりに
説明は割愛しましたが、この後アラート設定やダッシュボード作成をすることで、監視の手間や問題の把握までの時間を小さくする事ができます。アラートはSlackへ飛ばしているのですが、この後どうするかの相談や、なぜアラートが上がったのかというような情報共有もそのままSlack上で行えるため非常に便利です。
ぜひ試してみてください。
~special thanks~
手間取ってたらチームのタスクとしてやってくれたチームメンバーに感謝