• ログイン

本書は、お客様のご参考のために原文の英語版を機械翻訳したものです。

英語版と齟齬がある場合、英語版の定めが優先するものとします。より詳しい情報については、本リンクをご参照ください。

問題を作成する

New RelicとOpenTelemetryでJava Lambda関数を追跡する

PREVIEW

OpenTelemetryforJavaを搭載したAWSLambdaはまだ開発中です。

このガイドでは、 OpenTelemetry Lambda を使って、AWSのマネージド OpenTelemetry Lambda Layers を使って、Java Lambda関数をトレースする方法を説明します。OpenTelemetryは、多くの一般的なライブラリの自動インスツルメンテーションを含む、関数のインスツルメンテーションを簡単に行うことができます。

前提条件

このガイドでは、以下のものを想定しています。

ステップ1:X-Rayを有効にする

今回の設定ではAWS X-Rayを使用していませんが、AWS OpenDistroに組み込まれたトレース機能を有効にするために、Lambda関数でX-Rayを有効にする必要があります。

X-Rayを有効にするには。

  1. 作成した関数を Lambda Console で開きます。
  2. 設定 、次に モニタリングツール を選択します。
  3. Edit を選択します。
  4. X-Ray で、 Active tracing を有効にします。

または、 SAM(サーバーレスアプリケーションモデル)またはCloudFormationテンプレートを使用している場合は、Lambda関数のプロパティに以下を追加することでX線を有効にできます。

yourFunctionHere:
Type: AWS::Serverless::Function
Properties:
...
Policies:
- AWSLambdaBasicExecutionRole
...
- AWSXrayWriteOnlyAccess
Tracing: Active

重要

このオプションでは、関数にAWSLambdaBasicExecutionRoleまたは同等のポリシーがアタッチされている必要があります。

ステップ2:レイヤーの取り付け

AWSは、 OpenTelemetry Lambda CollectorOpenTelemetry Java SDKADOT Auto Instrumentation Agent を含むマネージドレイヤーを公開しています。

インストールするには

  1. 作成した関数を Lambda Console で開きます。
  2. [デザイナ]セクションの[レイヤー]で、[レイヤーの追加]を選択します。
  3. [ARNの指定]で、関数のアーキテクチャーのレイヤーARNの1つを以下のリストから貼り付けます。 {region}us-east-1などのAWSリージョンに置き換えます。
  4. Choose 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

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 を設定するスクリプトです。

  1. 作成した関数を Lambda Console で開きます。
  2. Configuration を選択し、次に Environment variables を選択します。
  3. Environment variables の下で、 Edit を選択します。
  4. 環境変数の追加 を選択します。
  5. キーの場合はAWS_LAMBDA_EXEC_WRAPPERに設定し、を次のオプションのいずれかに設定します(ハンドラーのタイプによって異なります)。次に、[保存]を選択します。
  • /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 にエクスポートする必要があります。その前に、まずこのコレクターが依存するいくつかの環境変数を設定する必要があります。

  1. New Relic のライセンスキー を生成し、New Relic アカウントからコピーします。
  2. Lambda Console で作成した関数を開きます。
  3. Configuration を選択し、次に Environment variables を選択します。
  4. Environment variables の下で、 Edit を選択します。
  5. 環境変数の追加 を選択します。
  6. キーの場合はNEW_RELIC_LICENSE_KEYに設定し、を手順1で生成したライセンスキーの値に設定します。次に、[保存]を選択します。
  7. 環境変数の追加 を再度選択します。
  8. Keyの場合はNEW_RELIC_OPENTELEMETRY_ENDPOINTに設定し、 Valueを以下のオプションのいずれかに設定します(New Relicリージョンによって異なります)。次に、[保存]を選択します。
  • otlp.nr-data.net:4317:NewRelicアカウントが米国地域にある場合
  • otlp.eu01.nr-data.net:4317:NewRelicアカウントがEU地域にある場合

SAMおよびCloudFormationテンプレートの場合、関数のプロパティに以下を追加します。お住まいの地域のyour-license-key-hereをNewRelicライセンスキーに、 otlp.nr-data.net:4317をNewRelicOpenTelemetryエンドポイントに必ず置き換えてください。

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をNewRelicライセンスキーに置き換え、 otlp.nr-data.net:4317をNewRelicリージョンに適したエンドポイントに置き換えます。上記のリストを参照してください。

ステップ5:コレクターの設定

次に、OpenTelemetry Lambda Collectorのデフォルト構成を、テレメトリをNewRelicOpenTelemetryエンドポイントにエクスポートする構成でオーバーライドします。これを行うには、関数に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パッケージのルートディレクトリにバンドルして、再デプロイします。

  1. 作成した関数を Lambda Console で開きます。
  2. Configuration を選択し、次に Environment variables を選択します。
  3. Environment variables の下で、 Edit を選択します。
  4. 環境変数の追加 を選択します。
  5. キーセットOPENTELEMETRY_COLLECTOR_CONFIG_FILEの場合、/var/task/collector.yamlに設定します。
  6. そして、 Save を選択します。

SAMやCloudFormationのテンプレートの場合は、関数のプロパティにこれを追加します。

yourFunctionHere:
Type: AWS::Serverless::Function
Properties:
...
Environment:
Variables:
...
OPENTELEMETRY_COLLECTOR_CONFIG_FILE: /var/task/collector.yaml

重要

これは、関数のルートディレクトリにcollector.yamlをバンドルしていることを前提としています。別の場所にバンドルした場合は、 /var/task/collector.yamlcollector.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 Agentは、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 クイックスタート をご覧ください。

Copyright © 2022 New Relic株式会社。

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.