.NET AWS Lambda 関数を Splunk Observability Cloud にインストルメンテーションする 🔗
以下の OpenTelemetry テンプレートを使用して、.NET AWS Lambda 関数をインストルメンテーションし、Splunk Observability Cloud にトレースを送信できます。テンプレートは以下のパッケージを使用します:
AWS Lambda for Splunk APM で .NET 関数をインストルメンテーションするには、以下の手順に従います:
既存の AWS Lambda を以下のテンプレートと統合するか、テンプレートを使用して新しい関数を開始します:
using Amazon.Lambda.Core;
using OpenTelemetry;
using OpenTelemetry.Exporter;
using OpenTelemetry.Instrumentation.AWSLambda;
using OpenTelemetry.ResourceDetectors.AWS;
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.ResourceDetectors.AWS#usage
.AddDetector(new AWSEBSResourceDetector()))
.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()!;
}
}
aws-lambda-tools-defaults.json ファイルを編集し、
function-handler
エントリーを変更することで、新しい関数ハンドラTracingFunctionHandler
がメインエントリーポイントとして設定されていることを確認します。また、AWS ウェブコンソールを使用して、Runtime settings のハンドラを変更することもできます。テンプレートは以下の環境変数を想定しています:
AWS_LAMBDA_FUNCTION_NAME
: AWS Lambda関数の名前SPLUNK_ACCESS_TOKEN
:Splunk インジェストアクセストークンSPLUNK_REALM
:Splunk インジェスト領域。例:us0
また、このテンプレートには
ConfigureSplunkTelemetry()
に以下のカスタマイズポイントが含まれています:カスタムインストルメンテーション・ライブラリを追加して、他のサードパーティライブラリをサポートします。NuGet と
OpenTelemetry.Instrumentation.
で始まる文字列を使用してライブラリを検索できます。ライブラリの中には、すでに
System.Diagnostics.DiagnosticSource
モジュールが組み込まれているものもあります。カスタムDiagnosticSource
名を含めるには、.AddSource()
メソッドを使用してください。AWS パッケージには、環境を記述するのに役立つ複数の
ResourceDetectors
要素が含まれています。ユースケースに合わせてディテクターを選択してください。
デフォルトの AWS テンプレートが期待するように、
FunctionHandler
関数にコードを追加します。