keyboard_double_arrow_up

Blog X-Tech5エンジニアがお送りするテックブログ
SREやDevOpsをはじめ、インフラエンジニアリングの実践情報を届けします。

NewRelicにCloudFrontのログを取り込むと日時が取り込み処理日時になる問題に対処した

2023年8月24日 

困りごと

NewRelicにCloudFrontのログを取り込むと、ログの日時が、取り込み処理を行った日時になる

いまさら、、、とは思うので、もっと素敵な解決策があれば教えてほしいです。

ぱっと調べた範囲では、この前提条件において、解決している例を見つけられませんでした。

解決して、、、いない様子: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

段取り:

  1. このリポジトリをcloneする
  2. serverless コマンドでデプロイする
  3. NewRelic上でparsing ruleを作成する

これで解決です。


悪戦苦闘の経過

あれは?これは?の記録です。

いまだにそんなことがあるはずないのでは・・・と思い調べる

だけど公式の解決策は見つからず。観念して自作するまで少し時間を使ってしまいました。

parsing ruleだけで対処できないか検討

ログ行頭の YYYY-MM-DD\tHH:mm:sstimestamp として解釈できればよいだけなので、まずは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は以下の通りです。

日時のところは datetime として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を追加するなど対処してデプロイできるようになりました。


と、いうわけで、めでたしめでたし。