• EnglishEspañol日本語한국어Português
  • ログイン今すぐ開始

この機械翻訳は参考用に提供されます。

英語版と翻訳版に矛盾がある場合は、英語版が優先されます。詳細については、 を参照してください。

問題を作成する

New RelicとOpenTelemetryによる.NET Lambda関数のトレース

PREVIEW

OpenTelemetryfor.NETを搭載したAWSLambdaはまだ開発中です。

Javaについても同様のドキュメントがありますが、OpenTelemetry で AWS Lambda に Python、Go、JavaScript、Ruby、または PHP を使用している場合は、Java または .NET ドキュメントをセットアップの一般的なガイドとして使用できます。詳細については、 OpenTelemetry の AWS ディストリビューション を参照してください。

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

前提条件

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

重要

AWS OTel .NET SDK for Lambda ではDisableAwsXRayContextExtractiontrueに設定されているため、X-Ray を有効にする必要はなくなりました。 詳細については、 AWS OTel .NET SDK for Lambda Readme を参照してください。

レイヤーをインストールする

AWSは、 OpenTelemetry Lambda Collector を含むマネージドレイヤーを公開しています。

インストールするには

  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-collector-amd64-ver-0-90-1:1

  • ARM64: arn:aws:lambda:\<region>:901920570463:layer:aws-otel-collector-arm64-ver-0-90-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-collector-amd64-ver-0-90-1:1
    # Use this if using arm64 architecture
    - !Sub arn:${AWS::Partition}:lambda:${AWS::Region}:901920570463:layer:aws-otel-collector-arm64-ver-0-90-1:1

    重要

    AWSが公開している最新のARNを参照して、上記のレイヤーARNが最新であることを確認してください。

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リージョンによって異なります)。次に、[保存]を選択します。

  9. 環境変数の追加 を再度選択します。

  10. キーの場合はOTEL_SERVICE_NAMEに設定し、を関数の名前に設定します。次に、[保存]を選択します。

  • 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
    OTEL_SERVICE_NAME: your-function-name-here

    重要

    your-license-key-here New Relic に置き換えます otlp.nr-data.net:4317は、New Relic リージョンに適したエンドポイントを使用します (上記のリストを参照)。

コレクターを構成する

次に、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パッケージのルートディレクトリにバンドルします。

*.csproj設定の例は次のようになります。

<ItemGroup>
<Content Include="collector.yaml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>

そして、機能を再展開する。

  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へのパスに置き換えてください。

インストゥルメントがあなたの機能を評価した

まず、 AWS Lambda 用の OpenTelemetry SDKOTLP エクスポータ パッケージを追加します。 OpenTelemetry.Insトゥルメンテーション.AWS や OpenTelemetry.Insトゥルメンテーション.Http などの OpenTelemetryインストゥルメンテーションパッケージをさらに追加して、関数の動作をさらに可視化することができます。

bash
$
dotnet add package OpenTelemetry.Instrumentation.AWSLambda
$
dotnet add package OpenTelemetry.Exporter.OpenTelemetryProtocol
$
dotnet add package OpenTelemetry.Instrumentation.AWS
$
dotnet add package OpenTelemetry.Instrumentation.Http

関数の静的コンストラクターに、 TracerProviderからのAddAWSLambdaConfigurations()AddOtlpExporter()への呼び出しを追加します。

重要

TracerProviderは Lambda コールド スタートごとに 1 回だけ初期化される必要があるため、関数のコンストラクターは静的である必要があります。

TracerProvider tracerProvider = Sdk.CreateTracerProviderBuilder()
// add other instrumentations here
.AddAWSLambdaConfigurations(options => options.DisableAwsXRayContextExtraction = true)
.AddOtlpExporter()
.Build();

重要

X-Ray を有効にしない場合は、必ずDisableAwsXRayContextExtractionプロパティをtrueに設定してください。 そうしないと、トレースはインストゥルメントされません。

元のLambdaハンドラー関数と同じシグネチャでラッパー関数を作成します。 AWSLambdaWrapper.Trace() APIを呼び出し、元のLambda関数であるTracerProviderとその入力をパラメーターとして渡します。

// new Lambda function handler passed in
public string TracingFunctionHandler(JObject input, ILambdaContext context) =>
AWSLambdaWrapper.Trace(tracerProvider, OriginalFunctionHandler, input, context);
public string OriginalFunctionHandler(JObject input, ILambdaContext context) {
return input?.ToString();
}

元のハンドラーが非同期関数である場合は、 Trace()の代わりにTraceAsync() API を使用します。

public Task<APIGatewayProxyResponse> TracingFunctionHandler(APIGatewayProxyRequest request,
ILambdaContext context)
=> AWSLambdaWrapper.TraceAsync(tracerProvider, OriginalFunctionHandler, request, context);
public async Task<APIGatewayProxyResponse> OriginalFunctionHandler(APIGatewayProxyRequest apigProxyEvent, ILambdaContext context)
{
//your function here.
}

例えば、基本的なAPI GatewayのLambda関数は次のようなものです。

using System;
using Amazon.Lambda.APIGatewayEvents;
using Amazon.Lambda.Core;
using OpenTelemetry;
using OpenTelemetry.Instrumentation.AWSLambda;
using OpenTelemetry.Trace;
namespace Example
{
public class Function
{
public static TracerProvider tracerProvider;
static Function()
{
tracerProvider = Sdk.CreateTracerProviderBuilder()
.AddAWSLambdaConfigurations(options => options.DisableAwsXRayContextExtraction = true)
.AddOtlpExporter()
.Build();
// use AwsSdkSample::AwsSdkSample.Function::TracingFunctionHandler as input Lambda handler instead
public APIGatewayProxyResponse TracingFunctionHandler(APIGatewayProxyRequest request, ILambdaContext context)
{
return AWSLambdaWrapper.Trace(tracerProvider, FunctionHandler, request, context);
}
/// <summary>
/// A simple function that takes a APIGatewayProxyRequest and returns a APIGatewayProxyResponse
/// </summary>
/// <param name="input"></param>
/// <param name="context"></param>
/// <returns></returns>
public APIGatewayProxyResponse FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context)
{
return new APIGatewayProxyResponse() {
StatusCode = 200,
Body = Environment.GetEnvironmentVariable("_X_AMZN_TRACE_ID")
};
}
}
}
}

次に、ラッパー関数をLambda関数のハンドラーとして設定します。上記のクラスの場合、ハンドラーはfunction::Example.Function::TracingFunctionHandlerになります。

AWS SDKのトレースを含めた動作例については、 このサンプルアプリ を参照してください。

上記は単なる基本的な例です。より高度なインストゥルメンテーションについては、OpenTelemetry .NET SDK ドキュメントを参照してください。

NewRelicUIでデータを表示する

まず、 Lambda 関数 を何度か起動して、テレメトリの生成を開始します。そこからNew Relicにアクセスして、 トレースメトリクスログ を見つけてください。

テレメトリーは New Relic Serverless の下に表示されません。 代わりに、テレメトリーデータは New Relic OpenTelemetry Nerdlets の下にあります。

分散型トレーシング

場合によっては、この構成でNewRelic内に断片化された分散トレースが表示されることがあります。これは、トレースが開始されるか、ADOTコンテキスト外のサービス(マネージドAWSサービスなど)が関与する場合に発生します。そのサービスのスパンはOpenTelemetryではなくX線によって作成され、ADOTはそれらをNewRelicに転送しません。トレースは断片化されているように見えますが、Lambda関数内のパフォーマンスや、スパンがNewRelicに転送された他のサービスに関する完全な洞察を提供します。

詳細情報

詳細については、 New Relic OpenTelemetry クイックスタート をご覧ください。

Copyright © 2024 New Relic株式会社。

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