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

この機械翻訳は、参考として提供されています。

In the event of any inconsistency between the English version and the translated version, the English versionwill take priority. Please visit this page for more information.

問題を作成する

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. DesignerセクションのLayersの下で、 Add a layerを選択します。

  3. Specify an ARNの下に、以下のリストから関数のアーキテクチャーのレイヤー ARN の 1 つを貼り付けます。 {region}を AWS リージョン (例: us-east-1 ) に置き換えます。

  4. 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. Add environment variable

    を選択します。

  6. Key

    NEW_RELIC_LICENSE_KEYに設定し、

    Value

    を手順 1 で生成したライセンスキーの値に設定します。 次に、

    Save

    選択します。

  7. もう一度

    Add environment variable

    選択します。

  8. Key

    の場合はNEW_RELIC_OPENTELEMETRY_ENDPOINTに設定し、

    Value

    を以下のオプションのいずれかに設定します (New Relic リージョンによって異なります)。 次に、

    Save

    選択します。

  9. もう一度

    Add environment variable

    選択します。

  10. Key

    OTEL_SERVICE_NAMEに設定し、

    Value

    を関数の名前に設定します。 次に、

    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
    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. Add environment variable

    を選択します。

  5. Key

    にはOPENTELEMETRY_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.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.