ブラウザの
Google Analytics でも
Paint Timing API の
実施した
[TOC]
参考
gtag.js を
使用して カスタム速度を トラッキングする | ウェブ向け アナリティクス(gtag.js) | Google Developers Web クライアントサイドの
パフォーマンスメトリクス — Speed Index、 Paint Timing、 TTI etc… ::ハブろぐ Paint Timing APIを
使用して クライアントサイドの パフォーマンスを 計測してみた - イノベーション エンジニアブログ
前提
実装に
GTM 上で、
customTask を 設定する
GTM で、customTask を 使い、 timingTask を 拡張します。
ドキュメントには以下のような 記載が あり、 siteSpeedSampleRate
の設定に 従って、 カスタム速度も 計測したいため、 timingTask に 対して 設定しています。
実際に動かしてみて 気づいたのですが、 Google Analytics の JavaScript は siteSpeedSampleRate
の値を 元に、 timingTask
で実行してくれるわけではなく、 timingTask
内でsiteSpeedSampleRate
を判断して、 計測を 行う 必要が あります。 トラッカーの
siteSpeedSampleRate の 設定に 基づいて、 サイトの 速度 timing ヒットを 自動的に 生成します。 計測の
対象
Paint Timing で測れる FP、 FCP を 計測対象に します。
TTI (Time to Interactive)、CFP (Component First Paint) も 計測でき、 計測結果を、 Google Analyticsに 送付してくれる Perfume.js と いう ライブラリも 存在する ことが わかったのですが、 GTM から 上手く 動かなそうだったので 使用していません。
実装
GA PageView タグの 設定
GTM のsiteSpeedSampleRate
の
これは、siteSpeedSampleRate
を
変数 customTask
には、
GA CustomTask 変数
customTask
の
設定内容を
function() { function str2Num(str) { var b = 1; var charCode = 0; var i; if (str) { for (b = 0, i = str.length - 1; 0 <= i; i--) { charCode = str.charCodeAt(i); // 16位 // 268435455 === 1111111111111111111111111111 (28位) b = (b << 6 & 268435455) + charCode + (charCode << 14); // 266338304 === 1111111000000000000000000000 (21位 + 7位) var c = b & 266338304; b = 0 != c ? b ^ c >> 21 : b; } } return b }; return function(model) { // Custom Dimensionの設定 クライアントID model.set('dimension8', model.get('clientId')); // 元のタスクの退避 var originalTimingTask = model.get('timingTask'); model.set('timingTask', function(timingTaskModel) { // 元のタスクの実行 originalTimingTask(timingTaskModel); if ('pageview' != timingTaskModel.get("hitType")) { return; } var siteSpeedSampleRate = model.get('siteSpeedSampleRate'); if (str2Num(model.get("clientId")) % 100 >= siteSpeedSampleRate) { return; } // 計測対象の場合は、load イベントで、GTM にカスタムイベントを送付する window.addEventListener("load", function(event) { if (window.performance) { window.dataLayer = window.dataLayer || []; var performance = window.performance; var performanceEntries = performance.getEntriesByType('paint'); performanceEntries.forEach(function(performanceEntry, i, entries) { window.dataLayer.push({ event: "sendTiming", timingCategory: "Paint Timing", timingVar: performanceEntry.name, timingValue: performanceEntry.startTime, timingLabel: }); }); } }); }); }; }
var siteSpeedSampleRate = model.get('siteSpeedSampleRate');
について
siteSpeedSampleRate
を取得します。 デフォルトでは、 1
ですが、タグで 変数を 設定しないと、 undefined
になります。
Google Analytics のデフォルトタスクでは デフォルト値を 適用してくれますが、 1
GTM タグ上はこれを 自前実装しないと いけないため、 デフォルト値の 設定を 行うようにしました。 str2Num 関数に
ついて
GA的源码 analytics.js を参考に Google Analytics.js 内で 実装されている 関数を 定義しています。 if (str2Num(model.get("clientId")) % 100 >= siteSpeedSampleRate)
について
GA的源码 analytics.js に記載されている、 siteSpeedSampleRate
を適用するか 否かを 判断する、 関数です。 アクセスの 度に ランダムで 選択するのではなく、 ユーザーの Cookie 値での 判断に なります。
速度送付の対象、 非対称が Cookie の 値で 判断される ことになります。 動作確認時に、 この 動作で 少し ハマりました。
理想としては、 毎回ランダムで 対象を 選択しても いいのかと 思います。 カスタム速度の
送付に ついて
Google Analytics のイベントではなく、 GTM の カスタムイベントを 発行して、 カスタム速度を 計測します。 model.set('dimension8', model.get('clientId'));
について
今回やりたいことは、 カスタム速度送付ですが、 元々の customTask
の仕事と して、 clientId の 設定を 行っています。 window.addEventListener("load", function(event)
による イベントリスナーの 設定
GA的源码 analytics.js の実装を 参考に、 timingTask
の設定値と して 送付したい 内容を、 load イベントの タイミングで 送付するように しています。
カスタム速度送付タグの 設定
GTMカスタムイベント sendTiming
に
下記は、
まとめ
GTM から、
情報が
もう
以上です。
コメント