「Elixir Report」をWebアプリケーション向けのクエリ/レポートツールとして活用する 2ページ
Elixir Reportをバックエンドに使ったPythonアプリケーションを作る
さて、今回作成するサンプルアプリケーションは、Googleの提供するアクセス解析ツール「Googleアナリティクス」で収集されたデータを取得し、指定した月の月間ページビュー(PV)やユニークユーザー、セッション数などのトラフィック情報をグラフとして表示するWebアプリケーションだ。トラフィック情報を表示したい年と月を指定して「Show」ボタンをクリックすると、それらがグラフで表示される(図3)。
また、「PDF」ボタンをクリックすると、グラフがPDF形式で出力される(図4)。
アプリケーションの構成としては、次の図5のようになる。
今回、サーバー側はPythonで実装した。サーバーはクライアントからのリクエストを受けてElixir Reportのレポートサーバーにアクセスし、PVなどのデータやレポートをXML形式で取得し、それをそのままクライアントに出力する処理を行う。クライアントはXMLデータを取得すると、それを元にグラフを描画するという処理を実行する。グラフの描画にはデータ処理ライブラリであるD3.jsを使用した。
また、レポートサーバーではアプリケーションからのリクエストを受けてGoogle Analyticsからのデータ取得を行い、それをアプリケーションが使いやすい形に加工したり、キャッシュする処理を行っている。
JDBCドライバ「Google Analytics JDBC Driver」を使ってGoogleアナリティクスのデータにアクセスする
Elixir Reportでは、JavaのデータベースアクセスAPI規格である「JDBC」を利用することで、さまざまなデータにアクセスが可能だ。今回は、RSSBusが提供するデータアクセスライブラリ「Google Analytics JDBC Driver」を使用してGoogleアナリティクスにアクセスすることとした。
Google Analytics JDBC Driverは、GoogleアナリティクスのデータにアクセスするためのJDBCドライバだ。Googleアナリティクスではデータを取得するための専用APIが用意されており、専用のライブラリ、もしくはHTTPでのアクセスでデータを取得できるようになっているが、Google Analytics JDBC Driverではこれらをラップした、SQLでデータを取得するためのインターフェイスを提供する。これを利用することで、GoogleアナリティクスAPIに関する知識がなくとも、SQLの知識さえあれば簡単にGoogleアナリティクス上のデータを取得できる。
なお、Google Analytics JDBC Driverは無料試用版がRSSbusのWebサイトで公開されている。興味のある方はこちらを試してみると良いだろう。
Google Analytics JDBC DriverをElixir Reportから利用する
Google Analytics JDBC DriverをElixir Reportから利用するには、Google Analytics JDBC Driverをインストールした後、ドライバjarファイルなどをElixir Reportのインストールディレクトリ以下の「ext」ディレクトリ(デフォルトでは「C:\Program Files\ElixirReport8.4JT\ext」ディレクトリ)にコピーしておく必要がある。Google Analytics JDBC Driverはデフォルトでは「C:\Program Files\RSSBus\RSSBus JDBC Driver for Google Analytics\lib」ディレクトリにインストールされるので、ここに含まれるすべてのファイルをextディレクトリにコピーしておこう(図6)。
なお、今回はGoogleアナリティクスAPIの認証にユーザー名およびパスワードを使用している。OAuthを使った認証も可能だが、今回は利用しない。OAuthを使った認証を使いたい場合は、別途ドキュメントなどを参照してほしい。
データソースの作成とGoogleアナリティクス内のデータのクエリ
今回はデータソースとして、次の4つのデータソースを用意する。
- Googleアナリティクス内に格納されているトラフィック情報を取得する「ga_traffic_monthly」データソース
- Googleアナリティクス内に格納されているページビュー情報を取得する「ga_pageview_monthly」データソース
- 「ga_traffic_monthly」データソースと「ga_pageview_monthly.ds」データソースを結合し、トラフィック情報とページビュー情報をまとめて出力する「traffic_and_pageview_monthly」データソース
- 「traffic_and_pageview_monthly.ds」データソースで取得したデータをキャッシュする「traffic_and_pageview_monthly_cached」データソース
まず、ga_traffic_monthlyデータソースは指定した月のセッション数、ユーザー数、新規ユーザー数をGoogleアナリティクスから取得するためのデータソースだ。また、ga_pageview_monthlyは指定した月のサイト全体のページビューを取得するためのデータソースとなる。Google Analytics JDBC Driverでは、これらのテーブルに加え後述する「ビュー(VIEW)」を対象にクエリを行えるようになっているが、セッション数やユーザー数、新規ユーザー数は「Traffic」ビューに、ページビューは「SiteContent」ビューに含まれており、これらを同時にクエリすることはできないため、このように2つのデータソースを作成している。
traffic_and_pageview_monthlyデータソースは、コンポジットデータソース機能を使用してga_traffic_monthlyおよびga_pageview_monthlyデータソースを結合し、その結果を出力するものだ。
また、traffic_and_pageview_monthly_cachedデータソースはtraffic_and_pageview_monthlyデータソースから取得したデータをキャッシュするデータソースだ。Googleアナリティクスからのデータ取得は、一般的なデータベースからのデータ取得と比較すると遅い傾向がある。また、一定期間内に実行できるクエリ数に上限が設定されているため、無駄なクエリ発行は避けるのが好ましい。そこで、今回はキャッシュを利用してレスポンスの改善およびクエリ数の削減を図ることにしている。Elixir Reportではキャッシュ機能を持つデータソースを作成する機能があり、これを利用することで、別途キャッシュサーバーなどを用意することなしに簡単にキャッシュを実現できる。
Googleアナリティクスにアクセスするデータソースを作る
それでは、実際にデータソースを作成する流れを見ていこう。
Elixir Reportを使ってGoogleアナリティクス内のデータをクエリするには、まずデータソースを新規に作成し、データソースタイプとしてJDBCを指定する(図7)。
次に、「JDBCデータソースの定義」画面で「ドライバ」に「rssbus.jdbc.googleanalytics.GoogleAnalyticsDriver」を、URLに「jdbc:googleanalytics:Profile=<プロファイル名>」を指定する。また、「ユーザー」および「パスワード」にはそのプロファイルへのアクセスに使用するGoogleアカウントのユーザー名およびパスワードを入力する(図8)。
続いてSQLを入力する画面になるので、ここで「クエリビルダー」をクリックするとクエリビルダーが表示され、GUIで対象とするテーブルやカラムが指定できるようになる(図9、10)。
なお、Google Analytics JDBC Driverでは、今回試用するトラフィックやコンテンツへのアクセスデータは「ビュー(VIEW)」としてアクセスできるようになっている。ビューはテーブルと似たような概念で、テーブルに対するアクセスと同様にSELECT文を使ったクエリが可能だ。ただし、ビューは読み取りのみが可能で、INSERTやUPDATEといった処理は行えない点が異なる。ビューはクエリビルダーではデフォルトでは表示されていないが、画面左上の「ビューの表示」にチェックを入れることで表示されるようになる。
今回は、まず「Traffic」ビューから、日付が格納された「Date」と、セッション数が格納された「Sessions」、ユーザー数が格納された「Users」、新規ユーザー数が格納された「NewUsers」というカラムを取り出すことにする。クエリビルダーで「Traffic」ビューを選択し、右上ペインでこれらのカラムにチェックを入れて「OK」をクリックすると対応するSQL文が作成される(図11)。
続いて、このSQL文を修正し、出力する期間を指定する。これは、WHERE節を使ってTrafficビューの「StartDate」および「EndDate」カラムの値を指定することで行える。たとえば以下のように指定すれば、2014年10月1日から10月31日という範囲のデータを取得できる。
WHERE Traffic.StartDate = 2014-10-01 AND Traffic.EndDate = 2014-10-31
ただし、このように固定で値を指定してしまうと、その期間のデータしか取得できないデータソースとなってしまう。そこで、今回は次のようにそれぞれ「${start_date}」および「${end_date}」という変数を指定した。
WHERE Traffic.StartDate = "${start_date}" AND Traffic.EndDate = "${end_date}"
このように、英数字を「${」と「}」で囲った文字列は「パラメータ」(変数)して扱われ、レポートの出力時に指定した任意のパターンに置き換えられるようになる。これを反映させた、最終的なSQL文は次のようになる。
SELECT Traffic.Date, Traffic.Sessions, Traffic.Users, Traffic.NewUsers FROM GoogleAnalytics.Traffic WHERE Traffic.StartDate = "${start_date}" AND Traffic.EndDate = "${end_date}"
なお、SQL文内でパラメータを利用すると、クエリを行うたびにパラメータの入力が求められるようになる。たとえば次の「データソースの列を定義してください」画面で「更新」をクリックすると、パラメータを入力する画面が表示される(図12、13)。クエリを実行するには、「start_date」変数および「end_date」変数に割り当てる適当な値を入力して「完了」をクリックすれば良い。
データソースの作成が完了したら、レポートデザイナの「データ」タブで「プレビュー」ボタンをクリックし、データを正しく取得できるか確認しておく(図14)。このときもパラメータの入力画面が表示されるので、先ほどと同様に適当な値を指定しておこう。
続いて、ページビューを取得するga_pageview_monthlyデータソースを作成する。作業としてはga_traffic_monthlyデータソースの場合とほぼ同じで、SQL文は次のようになる(図15)。
また、こちらのデータソースのプレビュー結果は図16のようになる。