Java Lambda関数を可視化することで、サーバーレスアプリケーションで何が起こっているかを把握できます。
スリムレイヤーJavaエージェントのバリエーションを使用すると、Java Lambda関数の可視性を高めることができます。
New Relic Javaエージェント
New Relic Javaエージェントは、専用のサーバーレス モードを通じてインストゥルメントされたAWS Lambda関数をサポートします。 Lambda関数内で実行される場合、エージェントは環境を自動的に検出し、Lambda呼び出しの短命でイベント駆動型の性質に最適化されたこのモードに切り替わります。
重要
Javaエージェントのサーバーレスモードには、Java 17以降が必要です。Java 11以前のランタイムは、初期起動時間が長くなるためサポートされていません。
使い方
サーバーレスモードでは、エージェントは標準の定期的なデータ収集とHTTPトランスポートを、呼び出しごとのモデルに置き換えます。
- Lambda関数が呼び出されると、エージェントはコードが実行される前にハンドラーをインターセプトします。
- 呼び出し時にはトランザクションが自動的に作成され、Lambda ARN、リクエストID、コールドスタートかどうかなどのコンテキストが記録されます。
- イベント ペイロードが認識されると (APIゲートウェイや SQS イベントなど)、エージェントはイベント ソースのメタデータを抽出し、その場を Web または非ウェブサイトとして分類し、関連するプロパティを追加します。
- 現場が終了すると、エージェントはバッファリングされたすべてのテレメトリーを収集し、それを圧縮された Base64 エンコードされたペイロードとして
/tmp/newrelic-telemetryに書き込み、プレーンな JSON として stdout に書き込みます。 - New Relic Lambda拡張機能(レイヤーにバンドルされています)は、テレメトリーファイルを読み込み、呼び出しごとにデータをNew Relicに転送します。
Lambda層
Javaエージェント向けに、2種類のLambdaレイヤーバリアントが公開されています。
- フルエージェント層: すべての計装モジュールが有効になります。 すぐに使える最大限の可視性を提供しますが、自動インストゥルメンテーションのフルセットにより、コールド スタートのオーバーヘッドが高くなります。
- Slimレイヤー (推奨) :
aws-lambda-java-coreモジュールを除くすべての自動インストゥルメンテーションを無効にします。 つまり、RequestHandlerまたはRequestStreamHandler実装するJava Lambdaハンドラーは自動的にインストゥルメントされ、すぐにテレメトリーの出力を開始しますが、他の計装 (AWS SDK 呼び出し、HTTP クライアントなど) は、明示的にオプトインしない限り無効になります。 これはほとんどのお客様にとって推奨される出発点です。
レイヤーARN
以下のARNはus-east-1領域用です。us-east-1 AWSリージョンに置き換えてください。レイヤーバージョンは1から始まり、新しいリリースごとに増加します。最新バージョンについては、 New Relicのレイヤーリストを参照してください。
レイヤーバリアント | アーキテクチャー | ARN |
|---|---|---|
Slim (推奨) | x86_64 |
|
Slim (推奨) | ARM64 |
|
満杯 | x86_64 |
|
満杯 | ARM64 |
|
インストレーションの手順については、 「Layered 計装」を参照してください。
どちらのレイヤーを使用する場合でも、エージェントが呼び出しをインターセプトできるように、Lambda関数のハンドラーを以下のラッパー値のいずれかに設定してください。
RequestHandler実装:com.newrelic.java.HandlerWrapper::handleRequestRequestStreamHandler実装:com.newrelic.java.HandlerWrapper::handleStreamsRequest
自動検出
環境変数AWS_LAMBDA_FUNCTION_NAMEが存在する場合、エージェントは自動的にサーバーレスモードを有効にします。Lambdaレイヤーを使用する場合、明示的な設定は必要ありません。Serverlessモードは常に有効になっており、上書きすることはできません。
構成
Lambdaレイヤーには、以下の環境変数が事前に設定されています。
環境変数 | レイヤーデフォルト | 説明 |
|---|---|---|
|
| サーバーレスモードを有効にします。レイヤーがまだ定義していない場合は、
に設定します。 |
|
| デフォルトでは、Javaエージェントのログファイルパスは次のように設定されます。
|
|
| エージェントが使用するデフォルトのアプリケーション名。レイヤーによって設定されない場合は、レイヤーによって設定されます。この値は、Lambda関数のNew Relic UIでは使用されません。 |
|
| エージェント内ログ転送を無効にします。レイヤーによって設定されない場合は、レイヤーによって設定されます。ログはCloudWatchまたはLambda拡張機能を介して取得されます。 |
|
| レイヤーによって常に
に設定されます。エージェントがトランザクションデータに基づいてアプリケーション名を上書きすることを防止します。 |
以下の環境変数は必須であり、ユーザー自身が設定する必要があります。
環境変数 | 必要値 | 説明 |
|---|---|---|
|
| AWS Lambda New Relic Javaエージェントラッパーを指すようにします。 Javaエージェントレイヤーを使用する場合は、これを常に
に設定する必要があります。 |
| あなたのNew Relicライセンスキー | New Relicは、 New Relicに送信されたテレメトリーを認証するために使用されるライセンスキーを取り込みます。 |
| NewRelicアカウントID | ディストリビューティッド(分散)トレーシングのNew Relic Lambda拡張機能で必要です。 ここにNew Relicの親アカウントID、または親アカウントがない場合はアカウントIDを設定してください。 |
重要
デフォルトでは、Lambda拡張機能またはCloudWatchがログをキャプチャします。エージェントはログを直接転送しません。
Cold starts
エージェントは、最初の呼び出し時に設定される静的フラグを使用してcold startsを追跡します。cold start呼び出し時に、 aws.lambda.coldStart=true属性がトランザクションに追加されます。この属性は、ウォーム呼び出しでは省略されます。falseに設定されていません。
重要
Cold start時間: Javaエージェントを追加すると、エージェントを使用しない関数と比較して、 cold start時間が約 4,000 ~ 6,200 ミリ秒増加します。 これは最初の呼び出しにのみ影響します。ウォームインボイスは影響を受けません。スリムレイヤーは、起動時に読み込む監視モジュールの数を減らすことで、この問題を軽減します。
cold startパフォーマンスを向上させるには、タイムアウト値とメモリ割り当てを増やし、プロビジョニングされた同時実行性を使用します。
テレメトリーを収集しました
サーバーレス モードでは、 Javaエージェントは呼び出し中に次のテレメトリー タイプを収集してバッファリングします。
- トランザクショントレース
- エラーイベントとトレースされたエラー(スタックトレース付き)
- スパンイベント(ディストリビューティッド(分散)トレーディング用)
- トランザクション(分析)イベント
- カスタムイベント
- ログイベント (デフォルトでは CloudWatch 経由)
- パフォーマンスメトリクス
収集されたすべてのデータは単一のNR_LAMBDA_MONITORINGペイロードとして書き込まれ、呼び出し完了後にNew Relicに転送されます。
制限
- Java 17以降のみ対応。Java 11以前のバージョンはサポートされていません。
- サーバーレスモードでは、スレッドプロファイリングは利用できません。
- サーバーレスモードでは、JFR(Java Flight Recorder)による監視は無効になっています。
- JAR コレクター (モジュール スキャン) はサーバーレス モードでは無効になります。