PREVIEW
OpenTelemetryforJavaを搭載したAWSLambdaはまだ開発中です。
.NETについても同様のドキュメントがありますが、OpenTelemetry で AWS Lambda に Python、Go、JavaScript、Ruby、または PHP を使用している場合は、Java または .NET ドキュメントをセットアップの一般的なガイドとして使用できます。詳細については、 OpenTelemetry の AWS ディストリビューション を参照してください。
このガイドでは、 OpenTelemetry Lambda を使って、AWSのマネージド OpenTelemetry Lambda Layers を使って、Java Lambda関数をトレースする方法を説明します。OpenTelemetryは、多くの一般的なライブラリの自動インスツルメンテーションを含む、関数のインスツルメンテーションを簡単に行うことができます。
前提条件
このガイドでは、以下のものを想定しています。
- New Relic のアカウントです。まだお持ちでない方は、 無料で作成できます。.
- AWSのアカウントです。お持ちでない方は、 無料で作成できます。.
java8.al2
またはjava11
ランタイムで実行されるJavaLambda関数。まだ持っていない場合は、今すぐ作成してください。
ステップ1:X-Rayを有効にする
今回の設定ではAWS X-Rayを使用していませんが、AWS OpenDistroに組み込まれたトレース機能を有効にするために、Lambda関数でX-Rayを有効にする必要があります。
X-Rayを有効にするには。
- 作成した関数を Lambda Console で開きます。
- Configuration選択し、次にMonitoring Tools選択します。
- Editを選択します。
- X-Rayの下で、 Active tracingを有効にします。
または、 SAM(サーバーレスアプリケーションモデル)またはCloudFormationテンプレートを使用している場合は、Lambda関数のプロパティに以下を追加することでX線を有効にできます。
yourFunctionHere: Type: AWS::Serverless::Function Properties: # ... Policies: - AWSLambdaBasicExecutionRole # ... - AWSXrayWriteOnlyAccess Tracing: Active
重要
このオプションでは、関数にAWSLambdaBasicExecutionRole
または同等のポリシーがアタッチされている必要があります。
ステップ2:レイヤーの取り付け
AWS 、 OpenTelemetry Lambda コレクター、OpenTelemetry Java SDK 、 ADOT 自動インストゥルメンテーションエージェントを含むマネージド レイヤーを公開しています。
インストールするには
作成した関数を Lambda Console で開きます。
DesignerセクションのLayersの下で、 Add a layerを選択します。
Specify an ARNの下に、以下のリストから関数のアーキテクチャのレイヤー ARN の 1 つを貼り付けます。
{region}
を AWS リージョン (例:us-east-1
) に置き換えます。Addを選択します。
- AMD64 / X86_64:
arn:aws:lambda:{region}:901920570463:layer:aws-otel-java-agent-amd64-ver-1-11-1:1
- ARM64:
arn:aws:lambda:{region}:901920570463:layer:aws-otel-java-agent-arm64-ver-1-11-1:1
- AMD64 / X86_64:
SAMやCloudFormationのテンプレートの場合は、これを関数のプロパティに追加します。
yourFunctionHere: Type: AWS::Serverless::Function Properties: # ... Layers: # Use this if using x86_64 architecture - !Sub arn:${AWS::Partition}:lambda:${AWS::Region}:901920570463:layer:aws-otel-java-agent-amd64-ver-1-11-1:1 # Use this if using arm64 architecture - !Sub arn:${AWS::Partition}:lambda:${AWS::Region}:901920570463:layer:aws-otel-java-agent-arm64-ver-1-11-1:1
重要
AWSが公開している最新のARNを参照して、上記のレイヤーARNが最新であることを確認してください。
ステップ3:レイヤーを設定する
レイヤーを設定するには、 exec wrapper を設定する必要があります。exec wrapper は、関数の初期化時に実行されるスクリプトです。この例では、OpenTelemetry を設定するスクリプトです。
作成した関数を Lambda Console で開きます。
Configuration選択し、次にEnvironment variables選択します。
Environment variablesの下で、 Editを選択します。
Add environment variableを選択します。
Keyの場合は、それを
AWS_LAMBDA_EXEC_WRAPPER
に設定し、 Valueを次のオプションのいずれかに設定します (ハンドラーのタイプに応じて異なります)。 次に、 Save選択します。/opt/otel-handler
:通常のハンドラーをラップするため(RequestHandler
を実装)/opt/otel-proxy-handler
:API Gatewayを介してプロキシされた通常のハンドラー(RequestHandler
の実装)をラップし、HTTPコンテキストの伝播を有効にするため/opt/otel-stream-handler
:ストリーミングハンドラーをラップするため(RequestStreamHandler
を実装)、HTTPリクエストのHTTPコンテキスト伝播を有効にする
SAMやCloudFormationのテンプレートの場合は、これを関数のプロパティに追加します。
yourFunctionHere: Type: AWS::Serverless::Function Properties: # ... Environment: Variables: AWS_LAMBDA_EXEC_WRAPPER: /opt/otel-handler
重要
関数ハンドラーが他のハンドラータイプの1つを実装している場合は、 /opt/otel-handler
を置き換えます。
ステップ4:New Relicの環境変数を追加する
このレイヤーが収集した OpenTelemetry データを New Relic に送信するためには、レイヤーに同梱されている OpenTelemetry Lambda Collector を設定して、受信したテレメトリを New Relic OpenTelemetry Endpoint にエクスポートする必要があります。その前に、まずこのコレクターが依存するいくつかの環境変数を設定する必要があります。
New Relic アカウントから New Relic を生成してコピーします。
Lambda Console で作成した関数を開きます。
Configuration選択し、次にEnvironment variables選択します。
Environment variablesの下で、 Editを選択します。
Add environment variableを選択します。
Keyを
NEW_RELIC_LICENSE_KEY
に設定し、 Valueを手順 1 で生成したライセンスキーの値に設定します。 次に、 Save選択します。もう一度Add environment variable選択します。
Keyの場合は
NEW_RELIC_OPENTELEMETRY_ENDPOINT
に設定し、 Valueを以下のオプションのいずれかに設定します (New Relic リージョンによって異なります)。 次に、 Save選択します。otlp.nr-data.net:4317
:NewRelicアカウントが米国地域にある場合otlp.eu01.nr-data.net:4317
:NewRelicアカウントがEU地域にある場合
SAM および CloudFormation テンプレートの場合は、関数のプロパティに以下を追加します。 your-license-key-here
実際のに置き換え、 otlp.nr-data.net:4317
をリージョンの New Relic OpenTelemetry エンドポイントに置き換えてください。
yourFunctionHere: Type: AWS::Serverless::Function Properties: # ... Environment: Variables: # ... NEW_RELIC_LICENSE_KEY: your-license-key-here NEW_RELIC_OPENTELEMETRY_ENDPOINT: otlp.nr-data.net:4317
重要
your-license-key-here
を New Relic に置き換え、 otlp.nr-data.net:4317
New Relic リージョンに適したエンドポイントに置き換えます。 上記のリストを参照してください。
ステップ5: コレクターを構成する
次に、 OpenTelemetry Lambda コレクターのデフォルトの設定を、テレメトリーをNew Relic OpenTelemetryエンドポイントにエクスポートする設定でオーバーライドします。 これを行うには、関数にcollector.yaml
構成ファイルを含める必要があります。
関数のルートディレクトリに、次の内容のcollector.yaml
ファイルを作成します。
receivers: otlp: protocols: grpc: http:
exporters: otlp: endpoint: ${NEW_RELIC_OPENTELEMETRY_ENDPOINT} headers: api-key: ${NEW_RELIC_LICENSE_KEY}
service: pipelines: traces: receivers: [otlp] exporters: [otlp] metrics: receivers: [otlp] exporters: [otlp] logs: receivers: [otlp] exporters: [otlp]
このcollector.yaml
ファイルを関数のzipパッケージのルートディレクトリにバンドルして、再デプロイします。
- 作成した関数を Lambda Console で開きます。
- Configuration選択し、次にEnvironment variables選択します。
- Environment variablesの下で、 Editを選択します。
- Add environment variableを選択します。
- Keyには
OPENTELEMETRY_COLLECTOR_CONFIG_FILE
を設定し、 Valueには/var/task/collector.yaml
を設定します。 - 次に、 Save選択します。
SAMやCloudFormationのテンプレートの場合は、関数のプロパティにこれを追加します。
yourFunctionHere: Type: AWS::Serverless::Function Properties: # ... Environment: Variables: # ... OPENTELEMETRY_COLLECTOR_CONFIG_FILE: /var/task/collector.yaml
重要
これは、関数のルートディレクトリにcollector.yaml
をバンドルしていることを前提としています。別の場所にバンドルした場合は、 /var/task/collector.yaml
をcollector.yaml
へのパスに置き換えてください。
ステップ 6: New Relic UI でデータを表示する [view-data]。
まず、 Lambda 関数 を何度か起動して、テレメトリの生成を開始します。そこからNew Relicにアクセスして、 トレース 、 メトリクス 、 ログ を見つけてください。
Telemetry は New Relic Serverless の下には表示されません。代わりに、New Relic OpenTelemetry Nerdlets の下にテレメトリーデータが表示されます。
自動計測のオーバーヘッド
ADOT Lambda Layer for Java auto-instrumentation エージェントは、AWS Lambda の起動時間に大きな影響を与えます。通常、これをプロビジョニングされた同時実行性と共に使用して、初期化中に最初のリクエストでタイムアウトを発生させずに本番リクエストを処理する必要があります。ユースケースに適した設定を決定するために、最初に非本番環境でこの構成をテストすることをお勧めします。
あるいは、次のような手動によるインスツルメンテーションの方法があります。デフォルトでは、手動によるインスツルメンテーションは、関数の初期化時に必要なリソースが少なくて済みます。ただし、この方法ではほとんどの場合、コードの変更が必要です。
手動計測器
手動インスツルメンテーションの方法は、このドキュメントの自動インスツルメンテーションの手順と同様です。唯一の違いは、 ステップ1 で指定するラムダレイヤーのARNです。
手動インストルメンテーションの場合、ステップ2でレイヤーARNを使用する代わりに、関数のアーキテクチャーに以下のリストのレイヤーARNの1つを使用します。
- AMD64 / X86_64:
arn:aws:lambda:{region}:901920570463:layer:aws-otel-java-wrapper-amd64-ver-1-11-1:1
- ARM64:
arn:aws:lambda:{region}:901920570463:layer:aws-otel-java-wrapper-arm64-ver-1-11-1:1
{region}
をus-east-1
などのAWSリージョンに置き換えます。
その他の手順はすべて同じです。
この代替Lambda Layerは、自動メソッドのようにLambda関数をラップします。また、 AWS SDK を自動的にインストルメントします。しかし、使用する他のすべてのライブラリは、 OpenTelemetry instrumentation repository からそのライブラリのOpenTelemetry instrumentation libraryを関数の依存関係に含め、それを初期化するようにコードを修正する必要があります。
OKHttpを使った例をGitHub で見ることができます。
重要
AWSが公開している最新のARNを参照して、上記のレイヤーARNが最新であることを確認してください。
分散型トレーシング
場合によっては、この構成でNewRelic内に断片化された分散トレースが表示されることがあります。これは、トレースが開始されるか、ADOTコンテキスト外のサービス(マネージドAWSサービスなど)が関与する場合に発生します。そのサービスのスパンはOpenTelemetryではなくX線によって作成され、ADOTはそれらをNewRelicに転送しません。トレースは断片化されているように見えますが、Lambda関数内のパフォーマンスや、スパンがNewRelicに転送された他のサービスに関する完全な洞察を提供します。
詳細情報
詳細については、 New Relic OpenTelemetry クイックスタート をご覧ください。