PREVIEW
AWS LambdaとOpenTelemetry for Javaを併用するための機能はまだ開発中です。
このガイドでは、 OpenTelemetry Lambda を使って、AWSのマネージド OpenTelemetry Lambda Layers を使って、Java Lambda関数をトレースする方法を説明します。OpenTelemetryは、多くの一般的なライブラリの自動インスツルメンテーションを含む、関数のインスツルメンテーションを簡単に行うことができます。
前提条件
このガイドでは、以下のものを想定しています。
- New Relic のアカウントです。まだお持ちでない方は、 無料で作成できます。.
- AWSのアカウントです。お持ちでない方は、 無料で作成できます。.
java8.al2
またはjava11
のいずれかのランタイムで動作するJava Lambda Functionです。まだお持ちでない方は、 今すぐ作成してください。.
ステップ1:レイヤーのインストール
AWSは、 OpenTelemetry Lambda Collector 、 OpenTelemetry Java SDK 、 ADOT Auto Instrumentation Agent を含むマネージドレイヤーを公開しています。
インストールするには
作成した関数を Lambda Console で開きます。
**「レイヤー」 「デザイナー」 のセクションで、 「レイヤーの追加」 を選択します。**
Specify an ARN の下に、レイヤーのARNを貼り付けます。
arn:aws:lambda:{region}:901920570463:layer:aws-otel-java-agent-amd64-ver-1-10-1:1{region}を置き換えてください。
は、us-east-1
のように、あなたのAWSリージョンに置き換えてください。Choose Add.
また、 SAM(Serverless Application Model) または CloudFormation テンプレートを使用している場合は、Lambda関数のプロパティに以下を追加することで、このレイヤーを指定することができます。
yourFunctionHere: Type: AWS::Serverless::Function Properties: ... Layers: - !Sub arn:${AWS::Partition}:lambda:${AWS::Region}:901920570463:layer:aws-otel-java-agent-amd64-ver-1-10-1:1
ステップ2:レイヤーの設定
レイヤーを設定するには、 exec wrapper を設定する必要があります。exec wrapper は、関数の初期化時に実行されるスクリプトです。この例では、OpenTelemetry を設定するスクリプトです。
- 作成した関数を Lambda Console で開きます。
- Configuration を選択し、次に Environment variables を選択します。
- Environment variables の下で、 Edit を選択します。
- 環境変数の追加 を選択します。
- 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
重要
/opt/otel-handler
を、関数ハンドラが他のハンドラタイプのいずれかを実装している場合は置き換えてください。
ステップ3:New Relicの環境変数の追加
このレイヤーが収集した OpenTelemetry データを New Relic に送信するためには、レイヤーに同梱されている OpenTelemetry Lambda Collector を設定して、受信したテレメトリを New Relic OpenTelemetry Endpoint にエクスポートする必要があります。その前に、まずこのコレクターが依存するいくつかの環境変数を設定する必要があります。
- New Relic のライセンスキー を生成し、New Relic アカウントからコピーします。
- Lambda Console で作成した関数を開きます。
- Configuration を選択し、次に Environment variables を選択します。
- Environment variables の下で、 Edit を選択します。
- 環境変数の追加 を選択します。
- Key には、
NEW_RELIC_LICENSE_KEY
を設定し、 Value には、ステップ1で生成したライセンスキーの値を設定します。そして、 Save を選択します。 - 環境変数の追加 を再度選択します。
- Key には、
NEW_RELIC_OPENTELEMETRY_ENDPOINT
を設定し、 Value には、以下のいずれかのオプションを設定します(お使いの New Relic のリージョンによって異なります)。その後、 Save を選択します。
otlp.nr-data.net:4317
: お客様のNew Relicアカウントが米国地域にある場合otlp.eu01.nr-data.net:4317
: あなたのNew RelicアカウントがEU地域にある場合
SAM および CloudFormation テンプレートの場合は、関数のプロパティに以下を追加します。必ず your-license-key-here
を New Relic のライセンスキー と otlp.nr-data.net:4317
をお住まいの地域の New Relic OpenTelemetry Endpoint に置き換えてください。
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 リージョンに適したエンドポイントに置き換えてください(上記リストを参照)。
ステップ4:コレクターの設定
それでは、OpenTelemetry Lambda Collectorのデフォルト設定を上書きして、New Relic OpenTelemetry Endpointにテレメトリをエクスポートする設定にします。そのためには、 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 を選択します。
- 環境変数の追加 を選択します。
- 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
へのパスに置き換えてください。
ステップ5:New Relic UIでデータを見る
まず、 Lambda 関数 を何度か起動して、テレメトリの生成を開始します。そこからNew Relicにアクセスして、 トレース 、 メトリクス 、 ログ を見つけてください。
Telemetry は New Relic Serverless の下には表示されません。代わりに、New Relic OpenTelemetry Nerdlets の下にテレメトリーデータが表示されます。
自動計測のオーバーヘッド
ADOT Lambda Layer for Java Auto-instrumentation Agentは、AWS Lambdaの起動時間に顕著な影響を与えるため、初期化中に初期リクエストでタイムアウトを起こさずに本番リクエストに対応するには、一般的に プロビジョニングされたコンカレンシー と共に使用する必要があります。この構成をまず非本番環境でテストし、ユースケースに適した設定を決定することをお勧めします。
あるいは、次のような手動によるインスツルメンテーションの方法があります。デフォルトでは、手動によるインスツルメンテーションは、関数の初期化時に必要なリソースが少なくて済みます。ただし、この方法ではほとんどの場合、コードの変更が必要です。
手動計測器
手動インスツルメンテーションの方法は、このドキュメントの自動インスツルメンテーションの手順と同様です。唯一の違いは、 ステップ1 で指定するラムダレイヤーのARNです。
手動で計測する場合は、使用しないでください arn:aws:lambda:{region}:901920570463:layer:aws-otel-java-agent-amd64-ver-1-10-1:1
.
代わりにこれを使います。
arn:aws:lambda:{region}:901920570463:layer:aws-otel-java-wrapper-amd64-ver-1-10-1:1
{region} の部分を置き換えてください。
は、 us-east-1
のように、あなたのAWSリージョンに置き換えてください。
その他の手順はすべて同じです。
この代替Lambda Layerは、自動メソッドのようにLambda関数をラップします。また、 AWS SDK を自動的にインストルメントします。しかし、使用する他のすべてのライブラリは、 OpenTelemetry instrumentation repository からそのライブラリのOpenTelemetry instrumentation libraryを関数の依存関係に含め、それを初期化するようにコードを修正する必要があります。
OKHttpを使った例をGitHub で見ることができます。
詳細情報
詳細については、 New Relic OpenTelemetry クイックスタート をご覧ください。