Docs » Splunk Observability Cloud 用のサーバーレス関数を実装する » AWSのLambda関数をSplunk Observability Cloudにインストルメンテーションする » AWS Lambda 関数を Splunk Observability Cloud にインストルメンテーションする » .NET AWS Lambda 関数を Splunk Observability Cloud にインストルメンテーションする

.NET AWS Lambda 関数を Splunk Observability Cloud にインストルメンテーションする 🔗

以下の OpenTelemetry テンプレートを使用して、.NET AWS Lambda 関数をインストルメンテーションし、Splunk Observability Cloud にトレースを送信できます。テンプレートは以下のパッケージを使用します:

AWS Lambda for Splunk APM で .NET 関数をインストルメンテーションするには、以下の手順に従います:

  1. 既存の AWS Lambda を以下のテンプレートと統合するか、テンプレートを使用して新しい関数を開始します:

using Amazon.Lambda.Core;
using OpenTelemetry;
using OpenTelemetry.Exporter;
using OpenTelemetry.Instrumentation.AWSLambda;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
using System.Diagnostics;

namespace DotNetInstrumentedLambdaExample;

public class Function
{
   public static readonly TracerProvider TracerProvider;

   static Function()
   {
      TracerProvider = ConfigureSplunkTelemetry()!;
   }

   // Note: Do not forget to point function handler to here.
   public string TracingFunctionHandler(string input, ILambdaContext context)
      => AWSLambdaWrapper.Trace(TracerProvider, FunctionHandler, input, context);

   public string FunctionHandler(string input, ILambdaContext context)
   {
      // TODO: Your function handler code here
   }

   private static TracerProvider ConfigureSplunkTelemetry()
   {
      var serviceName = Environment.GetEnvironmentVariable("AWS_LAMBDA_FUNCTION_NAME") ?? "Unknown";
      var accessToken = Environment.GetEnvironmentVariable("SPLUNK_ACCESS_TOKEN")?.Trim();
      var realm = Environment.GetEnvironmentVariable("SPLUNK_REALM")?.Trim();

      ArgumentNullException.ThrowIfNull(accessToken, "SPLUNK_ACCESS_TOKEN");
      ArgumentNullException.ThrowIfNull(realm, "SPLUNK_REALM");

      var builder = Sdk.CreateTracerProviderBuilder()
            // Use Add[instrumentation-name]Instrumentation to instrument missing services
            // Use Nuget to find different instrumentation libraries
            .AddHttpClientInstrumentation()
            .AddAWSInstrumentation()
            // Use AddSource to add your custom DiagnosticSource source names
            //.AddSource("My.Source.Name")
            .SetSampler(new AlwaysOnSampler())
            .AddAWSLambdaConfigurations(opts => opts.DisableAwsXRayContextExtraction = true)
            .ConfigureResource(configure => configure
                  .AddService(serviceName, serviceVersion: "1.0.0")
                  // Different resource detectors can be found at
                  // https://github.com/open-telemetry/opentelemetry-dotnet-contrib/tree/main/src/OpenTelemetry.Resources.AWS#usage
                  .AddAWSEBSDetector())
            .AddOtlpExporter(opts =>
            {
               opts.Endpoint = new Uri($"https://ingest.{realm}.signalfx.com/v2/trace/otlp");
               opts.Protocol = OtlpExportProtocol.HttpProtobuf;
               opts.Headers = $"X-SF-TOKEN={accessToken}";
            });

      return builder.Build()!;
   }
}
  1. Make sure that the main entry point is set to TracingFunctionHandler by updating the function-handler field in the aws-lambda-tools-defaults.json file to <project-name>::<class-namespace-with-class-name>::TracingFunctionHandler. You can also do this using the AWS web console, by changing the handler in Runtime settings.

    The following is an example of a aws-lambda-tools-defaults.json file with the function handler set to TracingFunctionHandler. Don’t paste the contents of the example into your file, as most of it won’t match your environment. The part that must match is TracingFunctionHandler.

    {
        "Information": [
            "This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.",
            "To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.",
            "dotnet lambda help",
            "All the command line options for the Lambda command can be specified in this file."
        ],
        "profile": "default",
        "region": "us-west-2",
        "configuration": "Release",
        "function-architecture": "x86_64",
        "function-runtime": "dotnet8",
        "function-memory-size": 512,
        "function-timeout": 30,
        "function-handler": "AWSLambdaSample::AWSLambdaSample.Function::TracingFunctionHandler"
    }
    
  2. テンプレートは以下の環境変数を想定しています:

    • AWS_LAMBDA_FUNCTION_NAME: AWS Lambda関数の名前

    • SPLUNK_ACCESS_TOKEN:Splunk インジェストアクセストークン

    • SPLUNK_REALM:Splunk インジェスト領域。例: us0

  3. また、このテンプレートには ConfigureSplunkTelemetry() に以下のカスタマイズポイントが含まれています:

    • カスタムインストルメンテーション・ライブラリを追加して、他のサードパーティライブラリをサポートします。NuGet と OpenTelemetry.Instrumentation. で始まる文字列を使用してライブラリを検索できます。

    • ライブラリの中には、すでに System.Diagnostics.DiagnosticSource モジュールが組み込まれているものもあります。カスタム DiagnosticSource 名を含めるには、.AddSource() メソッドを使用してください。

    • AWS パッケージには、環境を記述するのに役立つ複数の ResourceDetectors 要素が含まれています。ユースケースに合わせてディテクターを選択してください。

  4. デフォルトの AWS テンプレートが期待するように、FunctionHandler 関数にコードを追加します。

This page was last updated on 2024年10月01日.