こんにちは。ウエディングパーク新卒3年目エンジニアのさー(@__south__373)です。
先日所属チームが変わり、Ringraphという結婚指輪・婚約指輪の口コミサイトを担当することになりました。
ディレクターから「とにかく速度改善をしたいんだ」という話を聞き、まずはサイト理解がてら全体の速度を把握できる仕組みをつくることにしたのでその内容を紹介したいと思います。
目次
作成イメージ
可視化したいポイントは3つありました。
- どのページが遅いのかを把握できる
- どのフェーズに改善余地があるのかを把握できる
- 今後施策をリリースをした際、そのリリースによって速度が落ちていないかを確認できる
Ringraphではサイトパフォーマンス監視にNew Relicが導入されているので、この3つを満たすダッシュボードをそれぞれ作成することにしました。
どのページが遅いのかを把握できるダッシュボード
どのページがそもそも遅いのか全体感を把握したいと思い、Apdexで数値化することにしました。
Apdexとは
Apdexは、ウェブアプリケーションやサービスのレスポンスタイムについて、ユーザー満足度を計測するための業界標準です。(New Relicより引用)
Apdexは自分で閾値を設定でき、設定した閾値と応答時間から計算がされるもので、0~1の値で示されます。1に近いほど満足度が高く、0に近いほど満足度が低いです。
例えば閾値を1秒に設定すると、1秒以下で応答が返ってくれば満足、1秒〜4秒以下(閾値の4倍以下)は許容範囲、4秒〜は不満と判断され、Apdexが算出されます。
実行クエリ
サーバーサイドのレスポンスとしては0.3秒以下を目指せると素敵なので、閾値を0.3に設定してそれぞれのページがどれほど解離があるかを数値化します。
-- 実際は改行なく実行する必要があります SELECT apdex(duration, t:0.3) FROM Transaction WHERE appName = `対象アプリ` AND name = `ウォッチしたいディレクトリ` SINCE 1 week ago
作成したダッシュボード
ランキング検索TOPとクチコミ検索はまさかの0…
これは改善のしがいがありますね!
どのフェーズに改善余地があるのかを把握できるダッシュボード
1つ目のダッシュボードでどのページが遅いかを把握することができました。
次に、速度が遅い場合サーバー側を改善すれば良いのか、JSやCSSを改善すれば良いのか、描画を改善すれば良いのかをわかるようにするために各指標を表示することにしました。各指標の数値と今後速度改善を行った際に視覚的にも変化がわかりやすいようにグラフも表示させてみます。
実行クエリ
各指標についてはドキュメントに記載の通りですが、下記のようなクエリで抽出できます。
-- 実際は改行なく実行する必要があります SELECT average(webAppDuration) as 'serverside', -- サーバーサイドレスポンスタイム average(domProcessingDuration) as 'DCL', -- HTMLパース時間 average(pageRenderingDuration) as 'Load' -- 全ての画像・CSS・Javascriptのダウンロードと実行時間 FROM PageView WHERE appName = `対象アプリ` AND name = `ウォッチしたいディレクトリ` SINCE 1 week ago
数値表示
Chart typeをBillboardにすると数値として表示できます。
グラフ表示
表示したい期間の前に`TIMESERIES`をいれると、Chart typeでAreaを選択できるようになります。
作成したダッシュボード
検索系を比較した時、クチコミ検索が一番遅くサーバー側が改善できそうなこと、ランキング検索詳細やこだわり検索詳細では描画側に改善ポイントがありそうなことがわかりました。
リリースによって速度が落ちていないかを確認できるダッシュボード
1つ目のダッシュボードで使用したApdexをここでも使います。今回は変化をウォッチしたいので、現在の速度が理想の数値であると仮定してそれぞれのページごと閾値を設定し、数値が下がったページがあればすぐに気付けるようにします。
閾値の算出方法
それぞれのページでApdexが0.95となるように閾値を設定します。Apdexが0.95となる閾値はリクエストの90パーセンタイルのレスポンスタイムでわかるので、下記のクエリで算出できます。
-- 実際は改行なく実行する必要があります SELECT percentile(duration, 90) FROM Transaction WHERE appName = `対象アプリ` AND name = `ウォッチしたいディレクトリ` SINCE 1 week ago
実行クエリ
ウォッチしたい各ページにおいて、Transaction(サーバーサイド)とPageView(ページ読み込み全体)のduration(レスポンスタイム)に対してApdexを設定しました。
-- 実際は改行なく実行する必要があります SELECT apdex(duration, t:1.1) FROM Transaction WHERE appName = `対象アプリ` AND name = `ウォッチしたいディレクトリ` SINCE 1 week ago
作成したダッシュボード
案件がリリースされるタイミングでウォッチしていき、例えば上の画像だと商品クチコミ一覧のスコアが下がっているので、何かのリリースでこのページの速度が下がっていることがわかります。
最後に
可視化することで全体感を把握でき、改善ポイントがわかりやすくなりました。今は毎週ダッシュボードを開いて数値を確認していますが、Apdexの値が下がったらslackに通知するようにすると手間が減って良いなと思うので、ウォッチする指標と合わせて改善していきます。
今後はこのダッシュボードをもとに速度改善の施策を行ったり、リリースによる速度低下をウォッチして対応していきたいと思います!