IPv6アクセスをGoogle Analyticsで計測する

2012/6/8-1

World IPv6 Launchに参加したことだし、折角なのでIPv6でのアクセス解析でもしようかと思ってGoogle Analyticsで計測してみました。 特に複雑なことをしているわけではないのですが、TIPS的な感じで私が採用した手法を紹介します。

まず大前提として、Google AnalyticsそのものにIPv6とIPv4を分けて計測する専用機能は現時点ではありません。 「そんなの今までのJavaScriptでも計測できそうなものだけど。。。」とか「そのうち勝手にGoogleが実装するのでは?」と思うかも知れませんが、単純に従来通りのGoogle Analyticsコードでは、コンテンツがあるサイトでの通信とGoogleとの通信で利用されるIPバージョンが一致している保証はないので、そういう機能がつくにしても工夫が必要そうな気はしています。 コンテンツがあるサイトとGoogle AnalyticsのJavaScriptが置かれているサーバは全く別であり、それぞれ別のTCPセッションなので。

それはさておき、今回どうしたかというと、凄く単純で、PHPを使ってHTTPセッションがIPv4であるかIPv6であるかを判別し、それを元にGoogle Analyticsのカスタム変数を設定しました。

IPv4とIPv6の判別方法

まず最初にIPv4とIPv6の判別方法です。 HTTPセッションがIPv4であるか、IPv6であるかに関してはREMOTE_ADDRという環境変数を使っているので、PHPじゃなくても同様の手法は使えます。

PHPでは、以下のようなコードでIPv4かIPv6かを判別してます。 REMOTE_ADDRには、Webサーバに接続してきたクライアント(主にWebブラウザ)のIPアドレスが入っているのですが、IPv4の場合は「203.0.113.94」のような「.」区切りの文字列になりますが、IPv6の場合は「2001:db8:dead:beef:cafe:face::2」のような「:」区切りの文字列になります。 そのため、REMOTE_ADDR文字列に「:」が入っていればIPv6での接続であることがわかります。



if (substr_count(getenv('REMOTE_ADDR'), ':') > 0) {
  define('IS_IPV6', "");
}


IPv6での接続であると判別した後の処理は、色々な方法があると思いましたが、私はPHPのdefine関数を使ってIS_IPV6という定数を定義して、必要箇所で if(defined('IS_IPV6')) で判別するようにしました。

たとえば、左上のサイトロゴ部分は以下のようにしてあるので、IPv6で接続した場合には「IPv6版」と表示された画像がロゴ部分に表示されるようになっています。



<img src="/img/geek-title<?php if(defined('IS_IPV6')){echo "-ipv6"; } ?>.png" border="0" />



Google Analyticsでの計測

Google Analyticsでの計測方法ですが、カスタム変数のindex=1(スロット1番)として、IPversionという変数名で、IPv4の場合は「4」という値にして、IPv6の場合は「6」という値にしました。 最後の3は、スコープを「ページビューレベル」にしています。 私はスロット番号として1を使いましたが、1-5までが利用可能なので必要に応じて適切なスロット番号をご利用下さい。

Google Analyticsでカスタム変数を設定するには、_gaq.push に _setCustomVar を渡しますが、その部分を動的に生成しています。



<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-1274115-4'],
<?php
if (defined("IS_IPV6")) {
  echo "            ['_setCustomVar', 1, 'IPversion', '6', 3], ";
} else {
  echo "            ['_setCustomVar', 1, 'IPversion', '4', 3], ";
}
?>

            ['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') +
            '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>


本当は「4」と「6」の部分だけを動的に生成するように書いても良かったのですが、何かゴチャゴチャしてしまったので1行全部をechoするようにしました。

で、IPv4セッションの場合に出力されるJavaScriptコードは以下のようになります。



<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-1274115-4'],
            ['_setCustomVar', 1, 'IPversion', '4', 3],
            ['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') +
            '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>


一方、IPv6のときに出力されるJavaScriptコードは以下のようになります。



<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-1274115-4'],
            ['_setCustomVar', 1, 'IPversion', '6', 3],
            ['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') +
            '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>


このJavaScriptコードを埋め込んでおけば、Google AnalyticsでIPv4ユーザとIPv6ユーザの解析が可能になります。

単純に利用者数の比率を私のサイトで今日一日見てみましたが、IPv6ユーザが全体の約2%でした。 ただ、もしかしたら土日よりも平日の方がIPv6利用率は上昇するかも知れません。 通信事業者系の企業内ネットワークから私のブログを読まれている方々も多いためです。

Google Analyticsへの細工はしたので、このままちょっと様子を見てみようと思います。

最近のエントリ

過去記事

過去記事一覧

IPv6基礎検定

YouTubeチャンネルやってます!