xその他‎ > ‎

外部リンク計測時のレースコンディション問題

外部サイトへのクリックを計測する場合に、計測漏れと成りうる原因を取り除こうという話です。レースコンディションと呼ばれる実行順序が不定になってしまう場合の回避対策の話になります。

よくあるGoogle Analtyicsでの外部リンクの計測方法としては、onclickに

<a href=”hoge.com” onclick=”_gaq.push([‘_trackPageview’,this.href]);”> 外部サイトhoge</a>

(*trackEventのが普通かも)

という例があるのですが、実は、googleのヘルプには二通りに説明があります。

1. http://www.google.com/support/analytics/bin/answer.py?hl=jp&answer=72712(外部へのリンクのトラッキング)

2. http://www.google.com/support/googleanalytics/bin/answer.py?hlrm=ja&answer=55527(外部へのリンクのクリックをトラッキングする)

タイトルもほぼ同じです。英語版でも同様に二つあります。

上記二つの違いは、ページ遷移を、href属性で実行しているか、onclick内で、document.locationでページを移動させてるかの違いです。さらにdocument.locationで移動させる時には、実行を少し遅らせて、その間で計測のためのgifリクエストが実行される時間的余裕を与えてます。

この事を解説してる記事は英語ですが、下のリンクのものが良いです。

http://www.gwotricks.com/test/2009/07/tracking-outbound-links-right-way.html (*Google WebSite Optimizerでの話で、コンバージョンページをバーチャルなものでする場合に気をつけようという話だけど、analyticsでも全く同じケースとなる。)

では、実際に計測の漏れが起きているのかをみてみましょう。Fiddler2というソフトで、リクエストを調べてみます。(私の手元の環境の結果です。実際の計測結果では、多くの私自身が分からない変動要因が多数あると考えてください)

ここでは、

  1. 計測コードのみ
  2. setTimeoutで実行時間を(0.01~0.1)秒遅らせ、document.location

ちなみに、<a>リンクがクリックされた時のブラウザの動きは、(a). onclickでのコードを実行 → (b).eventListenerで与えた関数を実行 → (c)href属性の実行という順番です。今回は(b)を除きますが、(b)でも同じ考えでOKです。(a),(b)ともに、最後に return falseを返して、(c)のhref属性を実行させずに、document.locationでページ遷移をさせる形にします。

では、Fiddler2でリクエストを見てみます。

1計測コードのみ

 

クロム、IE8で10回づつ計測します。そして、実際に計測gifが発生したかを数えます。計測タグは、以下のようにtrackEvent, trackPageviewを飛ばすとします。

<a href=”http://xxxxxxx.com” onclick=”_ga_tracks();”>外部サイトへ</a>
<script type=”text/javascript”>
function _ga_tracks(){
_gaq.push(["_setCustomVar",1,"b","c",2]);
_gaq.push(["_trackEvent","a","b","c",1]);
_gaq.push(["_trackPageview","external/page.html"]);
}
</script>
今回は、最初にカスタム変数を設定して、トラックイベント、トラックページと続ける、負荷の高い?設定にした。

手元での結果:

  • IEは、10回とも、trackEvent,trackPageview両方OKだった。
  • Chromeは、10回とも、最初の行のtrackEventのみ、計測用gifが飛んだ。二つ目はだめだった。計測漏れの形。

2 setTimeoutで実行時間を0.01秒遅らせ、document.locationで遷移

次は、実行時間を送らせてみる。それにプラスして、0.01秒の余裕でどれくらい、どれくらいリクエストが飛ばせるかを見るために、forループを入れて、10回 x 2 の計測gifを発行しようと試みる。

 
<a href="http://xxxxxx.com/page.html" onclick="_ga_tracks(elm);">外部サイトへ</a>

<sceript type="text/javasript">
function() _ga_tracks(elm){

    for(var i=0;i<10;i++){
      _gaq.push(["_setCustomVar",1,"b","c",1]);
      _gaq.push(["_trackEvent","a","b","c",1]);
      _gaq.push(["_trackPageview","external/page.html"]);
    }
    setTimeout(function(){document.location=elm.href},10);
    return false;

}
</script>
結果:

IEだと、計測用gifが送信された数は、20,18,12,13,20,12,15,13,13,15

Chromeだと、2,2,1,2,7,2,5,2,6

なお、遷移先は、yahool.comやgoogle.comや、自分のサイトやら。リンク先による影響もあるかも。

IEだと、計測用gifの発行が早い?けど、依然、全部送れない事には変わりない。クロムでも、最低でも1つは送れてるけど、少なめ。





Comments