NewRelicにCloudFrontのログを取り込むと日時が取り込み処理日時になる問題に対処した
困りごと
NewRelicにCloudFrontのログを取り込むと、ログの日時が、取り込み処理を行った日時になる
いまさら、、、とは思うので、もっと素敵な解決策があれば教えてほしいです。
ぱっと調べた範囲では、この前提条件において、解決している例を見つけられませんでした。
- S3に保存されたCloudFrontのStandard logsを、New Relic公式手順に則ってLambdaで取り込む
 LOG_TYPEはcloudfront-web
解決して、、、いない様子:Hub Topic: Override New Relic timestamp on CloudFront logs coming in via S3 ingestion Lamb
対処方法(結論)
- 公式Lambdaを自分で改変
 - built-in parsing ruleを使わずparserを自分で定義(そして自作parserをlogtypeに指定)
 
詳しくはリポジトリのREADMEをご参照ください!
netmarkjp/aws_s3_log_ingestion_lambda: AWS Lambda that sends log data from S3 to New Relic Logging
段取り:
- このリポジトリをcloneする
 - serverless コマンドでデプロイする
 - NewRelic上でparsing ruleを作成する
 
これで解決です。
悪戦苦闘の経過
あれは?これは?の記録です。
いまだにそんなことがあるはずないのでは・・・と思い調べる
だけど公式の解決策は見つからず。観念して自作するまで少し時間を使ってしまいました。
parsing ruleだけで対処できないか検討
ログ行頭の YYYY-MM-DD\tHH:mm:ss が timestamp として解釈できればよいだけなので、まずはparsing ruleでなんとかできないか検討しました。
ドキュメントでは利用可能なのはGrokパターンとして以下が示されています。
java-grok/src/main/resources/patterns/patterns at master · thekrakken/java-grok
しかし %{DATE}\t%{TIME} を読み取るパターンは見つけられず断念しました。
既存parsing ruleを壊さず対処できないか検討
logtype = 'cloudfront-web' のBuilt-in log parsing ruleは以下の通りです。
日時のところは dateとtime としてparseされているので、これをそのまま活かせないか検討しました。
Built-in log parsing rules | New Relic Documentation
^%{NOTSPACE:date}%{SPACE}%{NOTSPACE:time}%{SPACE}%{NOTSPACE:x_edge_location}...
parsing ruleだけでは対応できないので以下の対応を検討しました。
- Lambdaからのログ送出時に、末尾にparse可能な形式の日時を追記
 - parsing ruleを自作し、もともとのparsing rule末尾に 
%{TIMESTAMP_ISO8601:timestamp}を追加 
結果は失敗で、理由はparsing ruleの文字数上限超過です。惜しい。
自作のLambdaがうまくデプロイできない
というわけでLambdaもparsing ruleも自作することを観念したわけですが、READMEの通りにLambdaがデプロイできませんでした。
serverless frameworkに触れるのがものすごく久しぶりで少し戸惑ったものの、serverless-better-credentialsを追加するなど対処してデプロイできるようになりました。
と、いうわけで、めでたしめでたし。


