これで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は指定しておくと、重複なくアクセスログを回収できると思います。