概要
下記のような構成のAWSシステムに対して、NewRelicを使用した監視を構築しました。
※今回の構築では、NewRelicのAPIポーリングを利用してAWSからメトリクスを取得しています。
NewRelicで監視構築後にテストを実施していると、Lambdaをタイムアウトさせた際に発生するLambdaエラーがNewRelicへ連携されず、アラートが発砲しない事象に遭遇しました。
タイムアウト発生後、AWSのメトリクスを確認すると<AWS Lambdaエラーのメトリクス>のように想定通りエラーがカウントされていましたが、NewRelic側のメトリクスではエラーがカウントされず常に0が表示されています。
苦戦しましたが一応解決扱いで決着できたので、原因と解決策を記載しておきます。
<システム構成>

<AWS Lambdaエラーのメトリクス>

↓NewRelicで監視

原因
APIポーリングの場合、NewRelicは5分間隔でLambdaのメトリクスをAWSのメトリクスから取得します。

<APIポーリングのリファレンス>
https://docs.newrelic.com/jp/docs/infrastructure/amazon-integrations/connect/polling-intervals-aws-integrations/
一方でAWSは、Lambdaのタイムアウト時にタイムアウト発生時点の日時ではなく、
Lambdaが開始された日時にエラーをカウントします。
随時5分間隔でポーリングしているAPIポーリングでは、最新5分間のAWSメトリクスを取得してアラート発砲の判定に使用する事が可能ですが、過去のメトリクスを遡って取得する事は出来ないため、今回のようにNewRelicへエラーのメトリクスが連携されずアラートが発砲しない現象が発生しています。(過去は振り返らないタイプ。)
今回監視対象のLambdaはタイムアウトを15分に設定していたため、下記<Lambdaタイムアウト処理時のエビデンス>のようにLambdaエラーがタイムアウト発生の15分前(処理開始時)にカウントされていました。(ーー;)
<Lambdaタイムアウト処理時のエビデンス>

↓

解決策
今回は、Lambdaのタイムアウトやその他エラーが発生した際に出力される特定のメッセージを対象としたログ監視を追加して対応しました。
※元々のLambdaエラーの監視は、権限エラーの検知などで使える可能性があるため残しています。
<タイムアウト時のメッセージ>
- “Task timed out after ”
<その他エラー時のメッセージ>
- “Runtime exited with error”
<ログ監視のためのサブスクリプションフィルター設定>

その他の解決策としては以下が挙げられます。
- APIポーリングではなく、Metric Streams統合を使用する
- AWSのCloudWatchAlarmでLambdaエラーを監視し、NewRelicや通知先に連携する
Metric Streams統合を使用する場合はAWS Config、Kinesis Data Firehose、S3などをAWSアカウント内へ構築する必要があります。
今回は上記のような構築を追加で実施する事がプロジェクトの都合上困難であったため、ログ監視を追加して監視要件を満たす構成とする事で解決としました。
<Metric Streams統合のリファレンス>
https://docs.newrelic.com/jp/docs/infrastructure/amazon-integrations/connect/aws-metric-stream/
あとがき
当現象が発生した直後は、NewRelicとAWSとのインテグレーション不備やLambdaのランタイムにJava8を利用している事で何か特殊な状況が発生しているのか、はたまたNewRelicのバグなのかと原因の切り分けに苦心しましたが、最終的には監視の要件を満たす構成を実現出来たので良かったです。ε-(´∀`*)ホッ
※納期間近でした。ギリギリセーフ!(>_<。)💦
コメント