share facebook facebook2 twitter menu hatena pocket slack

2016.03.07 MON

Google Analyticsの値をCloudWatchに渡してDatadogで可視化する

WRITTEN BY齊藤 愼仁

gauu_aws_0011

シンジです。Webサーバーの負荷状況とアクセス状況が1つの画面で見られたら最高じゃねーかということで、Google Analyticsのリアルタイムアクセスの値をCloudWatchのカスタムメトリクスとして送信して、Datadogでダッシュボード化してみます。

簡単な流れ

  • 意外と大変な作業だという認識を持つ
  • Webサーバーは既にあって、Google Analyticsで解析中という前提で進める
  • Google APIでAnalyticsを有効にして、APIキーをゲットする
  • 有効にしたAPIユーザーで、AnalyticsにアクセスできるようにAnalyticsを設定する
  • 適当なサーバー作って、もしくは既存のサーバーで、Google APIなPHPクライアントをGitからコツのいる方法で持ってくる
  • とあるPHPにGoogle APIとAlanyticsの情報、上のファイルパスを書いてやる
  • とあるスクリプトを配置する
  • cronで1分間隔で設定する
  • 突如訪れる世界平和

Google APIからキーを取ってくる

https://console.developers.google.com/

ここにアクセスします。初めてアクセスする場合は、プロジェクトを作成する必要があるので、適当に作りましょう。次に、APIを有効化して、鍵をゲットします。

gauu_aws_0021

Analyticsで検索するか、Analytics APIをクリックしましょう。

gauu_aws_0031

んでもって有効にしてください。

認証情報から、「新しい認証情報」で、「サービスアカウントキー」をゲットします。

gauu_aws_0041

名前を入力して、キーのタイプで「P12」を選びます。で、作成。

gauu_aws_0051

ゲットしたキーファイルは後ほど使いますので大事に保管しておきましょう。
で、先程の画面に戻ったら、「サービスアカウントの管理」をクリックします。

gauu_aws_0061

でました、この長ったらしいメールアドレス、これ後で使いますのでメモっておきます

gauu_aws_0071

これでGoogle APIの準備はOKです。

Google AnalyticsにGoogle APIのユーザーを追加してやる

今度はGoogle Analyticsにログインして、アナリティクス設定の、一番右側のユーザー管理をクリックします。

gauu_aws_0081

で、権限を付与するユーザーに、さっきゲットした長ったらしいメールアドレスを入力してやります。与える権限はそのままでOKです。画面の通り。

gauu_aws_0091

今度はビューの設定に移って、ビューIDという数字をメモります。

gauu_aws_0101

Google AnalyticsはこれでOK。

PHPを動かす適当なサーバーを用意してください

今回はAmazon LinuxなすだちブログWebサーバーをそのまま使いました。新規で建ててもいいと思いますが、そこはお好みでどうぞ。AWS CLIとか使うので、Amazon Linuxだと捗ります。

まずはGoogleから一式頂戴して参ります。ディレクトリを適当に作って、Gitで引っ張ってきますが、以下の通りにやってください。

git clone -b v1-master https://github.com/google/google-api-php-client.git

この引数がシンジのハマりポイントでした。とりあえず上の通りにやればうまくいくので無心でコピペします。google-api-php-clientというディレクトリが出来たと思います。それはもうそのまま放っておけば使えるので触りません。

Google APIでゲットしたキーファイルP12をアップロードする

なんか適当にうまいことしてアップロードしてくださいw

PHPファイルを作る

元ネタはこちらから頂きました、ありがとうございます。
Google Analytics API(v3)を使ってPHPでリアルタイムユーザー数を取得する方法(実践編) | Lancork
http://www.lancork.net/2014/08/google-analytics-api-php-second/

このPHPをちょっぴり改変して使います。
編集するポイントは3箇所、

  • 長ったらしいメールアドレス入れる
  • P12キーファイルのパスを書く
  • Google AnalyticsのIDを入れる(ga:の後ろに入れる)

とりあえずファイルを作成します。

vim get_rtusers.php

中身はこんな感じで。

<?php

/**
 * Google Analyticsのリアルタイムユーザ数を取得しJSONで返却
 */

ini_set( "session.save_path", "./" );

set_include_path("./google-api-php-client/src/Google/" . PATH_SEPARATOR . get_include_path());

require_once 'autoload.php';

// サービスアカウント名(メールアドレス)
$service_account_name = 'xxxxxxxxxxxxx@xxxxxxxxxxxxxxxxxx.gserviceaccount.com';
// P12キーファイルのパス
$key_file_location = './xxxxxxxxxxxxxx-xxxxxxxxxxxxxxxx.p12';
// アナリティクスのビューID 例)'ga:1234567'
$analytics_view_id = 'ga:xxxxxxxxxx';

session_start();

if ( !strlen($service_account_name)
    || !strlen($key_file_location)) {
  echo missingServiceAccountDetailsWarning();
}

$client = new Google_Client();

if (isset($_SESSION['service_token'])) {
  $client->setAccessToken($_SESSION['service_token']);
}

$key = file_get_contents($key_file_location);
$cred = new Google_Auth_AssertionCredentials(
    $service_account_name,
    array('https://www.googleapis.com/auth/analytics'),
    $key
);
$client->setAssertionCredentials($cred);

if($client->getAuth()->isAccessTokenExpired()) {
  $client->getAuth()->refreshTokenWithAssertion($cred);
}

$_SESSION['service_token'] = $client->getAccessToken();

// アナリティクスクライアントを生成
$analytics = new Google_Service_Analytics($client);

try {
    // リアルタイムデータを取得する
    $results = $analytics->data_realtime->get(
            $analytics_view_id, // アナリティクスのビューID(アナリティクス設定 -> ビュー -> ビュー設定から確認)
            'rt:activeUsers'  // リアルタイムアクティブユーザー数を取得
    );

    // 取得結果からリアルタイムアクティブユーザ数を取り出す
    $totals = $results->getTotalsForAllResults();
    // activeUsers:ユーザ数 の配列に加工
    $array = array("activeUsers" => $totals["rt:activeUsers"]);
    $rtusers= $totals["rt:activeUsers"];
    echo  "GAUU: $rtusersn";

    session_unset();
    session_destroy();

} catch (apiServiceException $e) {
    echo $e->getMessage();
}

これでコマンドラインからPHPを動かして、値が取れればひとまず成功です。

php get_rtusers.php
GAUU: 20

AWS CLIの設定をしてあげましょう

環境によってインストール方法が違うので割愛しますが、少なくとも

aws configure

だけは必須です。これは終わらせておきましょう。

Google Analyticsの値をAWS CloudWatchに送る

スクリプト、2つ用意しました。1つずつ作りましょう。

vim gauu.sh

中身は以下の通り。

#!/bin/sh

GAUU=$(php get_rtusers.php)
echo $GAUU  | sed -e 's/GAUU: //'

もいっこ作ります。

vim gauu_to_cw.sh
#!/bin/sh

REGION=ap-northeast-1
NAMESPACE="GoogleAnalytics"
UNIT="Count"

export AWS_DEFAULT_REGION=${REGION}

#GAのリアルタイムユーザー数
DIMENSIONS=""
METRIC_NAME="Users"
VALUE=`./gauu.sh`

aws cloudwatch put-metric-data 
        --namespace ${NAMESPACE} 
        --metric-name ${METRIC_NAME} 
        --value ${VALUE} 
        --unit ${UNIT}

1分間に1回、AWS CloudWatchに送信する

cronを使います。

crontab -e

中身はこんな感じ

# Google Analytics
*/1 * * * *  /home/GA_to_AWSCW/gauu_to_cw.sh > /dev/null 2>&1

パスは適宜変更してください。

AWSマネジメントコンソールで確認してみよー

きちんとスクリプトが動いていれば、勝手に「カスタムメトリクス」として登録されます。
こんなかんじ。

gauu_aws_0111

ということは、Datadogにも入っているということ

特に設定は不要です。勝手に入ります(既にAWS CloudWatchの値をDatadogが取っていれば)

gauu_aws_0121

後はダッシュボードを作り込めば、一番上の画像のような比較グラフが作れるということでした〜

ということで協力してくれたみなさんありがとうございました

Lancorkさん、cloudpack武川さん、cloudpack駒澤さん、ありがとうございました〜

元記事はこちら

Google Analyticsの値をAWS CloudWatchに渡してDatadogで可視化する

齊藤 愼仁

cloudpack 社内インフラ担当、情報セキュリティ責任者。HPCを経て現職に至る。無類の猫好きで、すだち君という名の猫を飼っている。