• /
  • ログイン
  • 無料アカウント

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

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

問題を作成する

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

PREVIEW

AWS LambdaとOpenTelemetry for Javaを併用するための機能はまだ開発中です。

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

前提条件

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

ステップ1:レイヤーのインストール

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

インストールするには

  1. 作成した関数を Lambda Console で開きます。

  2. **「レイヤー」 「デザイナー」 のセクションで、 「レイヤーの追加」 を選択します。**

  3. 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リージョンに置き換えてください。

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

  1. 作成した関数を Lambda Console で開きます。
  2. Configuration を選択し、次に Environment variables を選択します。
  3. Environment variables の下で、 Edit を選択します。
  4. 環境変数の追加 を選択します。
  5. 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 にエクスポートする必要があります。その前に、まずこのコレクターが依存するいくつかの環境変数を設定する必要があります。

  1. New Relic のライセンスキー を生成し、New Relic アカウントからコピーします。
  2. Lambda Console で作成した関数を開きます。
  3. Configuration を選択し、次に Environment variables を選択します。
  4. Environment variables の下で、 Edit を選択します。
  5. 環境変数の追加 を選択します。
  6. Key には、 NEW_RELIC_LICENSE_KEY を設定し、 Value には、ステップ1で生成したライセンスキーの値を設定します。そして、 Save を選択します。
  7. 環境変数の追加 を再度選択します。
  8. 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-hereNew 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パッケージのルートディレクトリに束ねて、再デプロイします。

  1. 作成した関数を Lambda Console で開きます。
  2. Configuration を選択し、次に Environment variables を選択します。
  3. Environment variables の下で、 Edit を選択します。
  4. 環境変数の追加 を選択します。
  5. KeyOPENTELEMETRY_COLLECTOR_CONFIG_FILE を設定し、 Value/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.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 クイックスタート をご覧ください。

問題を作成する
Copyright © 2022 New Relic Inc.