背景
AppEngineはStackDriver Loggingにログが蓄積されますが、それをBigQueryにストリーミングさせることができます。
私も普段この設定を入れて過去のログ保管や検索を行なっているのですが、エラーメッセージはArrayになっており単純に WHERE
しただけではエラーになるため備忘としてここに記します。
クエリー内容
UNSET()でArray部分を展開し別名(この例では l
(アルファベットの小文字エル)を付ける。
その l
に対してWHEREをかける。
下記の例では2017年11月中に発生したOOMのログ、且つURLが /example
で始まるものを日付順で抽出する。
SELECT
timestamp,
l.logMessage,
protoPayload.resource
FROM
`appengine_request.appengine_googleapis_com_request_log_201711*`,
UNNEST(protoPayload.line) as l
WHERE
l.logMessage LIKE 'Exceeded soft private memory limit%'
AND
protoPayload.resource LIKE '/example%'
ORDER BY
timestamp ASC
出力イメージ
timestamp | logMessages | resource |
---|---|---|
2017-11-11 00:12:02 UTC | Exceeded soft private memory limit of 128 MB with 152 MB after servicing 56 requests total | /example?url=xxxxx |
2017-11-30 00:13:03 UTC | Exceeded soft private memory limit of 128 MB with 132 MB after servicing 11 requests total | /example?url=yyyyy |
注意点
例によって時刻はUTCが基準なので、キッチリ抜き出したい場合は 期間指定クエリー の要領でJSTベースにすると楽。