2014/06/12

Google AppEngineのアクセスログをBigQueryに流し込む

前回のエントリでBigQueryのStream APIを使ってAppEngineからデータを流し込む事ができたので、AppEngineのリクエストログをBigQueryに流し込んでみます。
これでAppEngineのアクセスをBigQuery基盤でビッグデータ解析してます!と言えますw

STEP0: 事前準備
前回のエントリでBigQueryとAppEngineが連携できている事を前提とします。

STEP1: AppEngineのログを取得する
AppEngine(Python)のLogServiceを使ってリクエストログを抜き取り、BigQuery Stream APIで直接BigQueryにデータを流し込みます。
import time
from google.appengine.api import memcache
from google.appengine.api.logservice import logservice
import httplib2
from apiclient import discovery
from oauth2client import appengine

PROJECT_ID = 'my-project'
SCOPE = 'https://www.googleapis.com/auth/bigquery'
LAST_TIME = 'last_time'

start_time = memcache.get(LAST_TIME)
end_time = time.time()
body = []
for log in logservice.fetch(start_time=start_time,
                                        end_time=end_time,
                                        offset=None,
                                        minimum_log_level=logservice.LOG_LEVEL_INFO,
                                        include_incomplete=True,
                                        include_app_logs=True):
    acc = {}
    acc['ip'] = log.ip
    acc['method'] = log.method
    acc['user_agent'] = log.user_agent
    # add info you need
    body.append( {'json':acc} )

credentials = appengine.AppAssertionCredentials(scope=SCOPE)
http = credentials.authorize(httplib2.Http(memcache))
bigquery = discovery.build('bigquery', 'v2', http=http)
response = bigquery.tabledata().insertAll(projectId=PROJECT_ID,
                                                  datasetId='AppEngine',
                                                  tableId='MyTable',
                                                  body=body).execute()

memcache.set(LAST_TIME, end_time, time=3600)

これで完了。logserviceに関してReferenceを参照するとどういう情報が取得できるのかが分かりますので、必要なデータをBigQueryに流し込むと良いと思います。
start_timeとend_timeは指定しておくと、重複なくアクセスログを回収できると思います。