Firehose概要こんにちは。スタメンで開発者をしている津田です。Athenaを利用しアプリケーションのリクエスト処理時間をセグメント別に計測することで、パフォーマンスの低下を検知しやすくしたことについて紹介します。動機Webアプリケーションのパフォーマンスについて、以前は主に、ロードバランサーの平均処理時間を参照していました。平均処理時間はサーバー全体の負荷状況の手がかりにはなるものの、それ以上の詳細については読み取れません。ポーリングや、その他、応答に要する時間の短いリクエストが多数送られてくる状況だと、平均の処理時間としては下がることになり、アプリケーションパフォーマンス改善の目安としても利用しにくいです。Relic等のAPMを使用して対象のリクエストを調査、というようなこともしていました。これは、極端に遅いリクエストが発生するケースを発見、改善するのに有用でしたが、閾値を下げすぎると調査しきれないほどの量が通知されてしまうため、あまり閾値を下げることができません。「リクエストの種類」で分類した平均応答時間を算出し、継続的にチェックできるようにしました。流れ全体の流れは以下のようになります。Railsで作成しています。リクエスト毎に集計のもととなるログを出力する必要があるため、controllerのbefore_actionで処理開始時の時間を記録、after_actionで所要処理時間、ユーザーの分類に必要な情報、controller、actionに関わる情報をjson形式でログ出力しています。この時点で、分析や調査に必要と無いと思われるリクエストではskipして、対象から外しておきます。S3のバケットに集約します。destinationのPrefixにaccess/YEAR=!{timestamp:yyyy}/MONTH=!{timestamp:MM}/DAY=!{timestamp:dd}/と設定し、パスに年月日を入れておきます。Athenaで分析する際に、パーティションとして利用するためです。S3におけるディレクトリ)を分割しておくほうがコストを抑えられます。データのパーティション分割を参照してください。Glueのクローラの定義を行い、S3をクロールしてデータソースとして登録します。クローラはjsonの中身を読み取ってテーブルの定義を作成してくれます。クロールは基本一度行えば良いのですが、パーティションが増えたことを検知するために日次で動かしています。PARTITIONの方が良いのかも知れません。ちなみに、上記の設定だとGMT零時でディレクトリが切り替わるため、日本時間では朝九時過ぎにクローラーを動かすと良いようです。Athenaでは読み込んだファイルの総容量によって課金されます。試行錯誤したり、いろいろな種類のクエリを実行するのであれば、あらかじめセグメント別に集計したテーブルを作っておいたほうが、時間の節約にもなります。tableテーブルを作成するため、以下のような感じのSQLを一度実行しました。TABLEを書いてもいいと思いますが、集計したいSQLで直接テーブルを作れるため、こちらのほうが楽でした。項目としてはセグメント別に平均値や総所要時間等を算出しています。集計のもととなっているaccessテーブルは上記のjsonファイルからなるテーブルなので、各カラムはjsonファイルに含まれるオブジェクトのキーにあたります。descinsert日次では、以下のようなSQLで集計を追加します。INSERT文を実行すると、対象のS3ディレクトリにファイルが生成されます。現状自動化できておらず、間違えて二度実行すると同じデータが2回作られてしまいますが、そうなったらS3から該当のファイルを消せば大丈夫です。DAYselect気になる情報をselectします。aggregated_accessはファイルサイズとして非常に小さくなっているはずなので、PARTITIONもあまり気にせずクエリできます。上記のSQLでも使用していますが、関数などはPrestoのドキュメントを参照できます。まとめ完全な自動化はできていないのですが、日々、各アクションのセグメント別パフォーマンスチェックを行うことができるようになり、いくつか問題点も事前に発見できました。集計したテーブルは、元のデータに比べて圧倒的にサイズが小さくなっています。元のログは、サイズが大きいため、パーティションを横断するようなSELECT(日付をまたぐような検索)は若干躊躇するようなところがあったのですが、集計後のテーブルであれば全期間検索しても大した読み取りサイズにはなりません。特定のアクションを改善した際など、経時で処理時間を抽出し、改善の成果を確認することができるため、改善のモチベーションも発生しやすくなったのが良かったと思います。Bitイメージで複数種類のログを扱うこんにちは、スタメンの松谷です。株式会社スタメンでは、エンジニア採用を強化しています。ご興味のある方はぜひエンジニア採用情報をご覧ください。引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。