シンジです。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を有効化して、鍵をゲットします。
Analyticsで検索するか、Analytics APIをクリックしましょう。
んでもって有効にしてください。
認証情報から、「新しい認証情報」で、「サービスアカウントキー」をゲットします。
名前を入力して、キーのタイプで「P12」を選びます。で、作成。
ゲットしたキーファイルは後ほど使いますので大事に保管しておきましょう。
で、先程の画面に戻ったら、「サービスアカウントの管理」をクリックします。
でました、この長ったらしいメールアドレス、これ後で使いますのでメモっておきます
これでGoogle APIの準備はOKです。
Google AnalyticsにGoogle APIのユーザーを追加してやる
今度はGoogle Analyticsにログインして、アナリティクス設定の、一番右側のユーザー管理をクリックします。
で、権限を付与するユーザーに、さっきゲットした長ったらしいメールアドレスを入力してやります。与える権限はそのままでOKです。画面の通り。
今度はビューの設定に移って、ビューIDという数字をメモります。
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
中身はこんな感じで。
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マネジメントコンソールで確認してみよー
きちんとスクリプトが動いていれば、勝手に「カスタムメトリクス」として登録されます。
こんなかんじ。
ということは、Datadogにも入っているということ
特に設定は不要です。勝手に入ります(既にAWS CloudWatchの値をDatadogが取っていれば)
後はダッシュボードを作り込めば、一番上の画像のような比較グラフが作れるということでした〜
ということで協力してくれたみなさんありがとうございました
Lancorkさん、cloudpack武川さん、cloudpack駒澤さん、ありがとうございました〜