ASP.NET コアコンポーネントとして、YARPは他の ASP.NET コアアプリケーションと同じ異なるトレースシステムに簡単に統合できます。
.NET には、YARP が利用する分散トレースの構成可能なサポートが組み込まれており、このようなシナリオをすぐに使用できます。
Open Telemetry の使用
YARP では、Open Telemetry (OTEL) を使用した分散トレースがサポートされています。 要求が入り、アクティビティのリスナーがある場合、ASP.NET Core は トレース コンテキスト のトレース ID を伝達するか、必要に応じてトレース コンテキストのトレース ID を作成し、実行された作業の新しいスパン/アクティビティを作成します。 さらに、YARP は次のアクティビティを作成できます。
- 要求の転送
- クラスターのアクティブな正常性チェック
これらは、ActivitySource
という名前の Yarp.ReverseProxy
のリスナーがある場合にのみ作成されます。
例: Application Insights
たとえば、Application Insights を使用してトレースを監視するには、プロキシ アプリケーションで Open Telemetry SDK と Azure Monitor SDK を使用する必要があります。
application.csproj
:
<ItemGroup>
<PackageReference Include="Azure.Monitor.OpenTelemetry.AspNetCore" Version="1.0.0-beta.3" />
</ItemGroup>
Program.cs
:
using Azure.Monitor.OpenTelemetry.AspNetCore;
using OpenTelemetry.Trace;
using System.Diagnostics;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddReverseProxy().LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));
builder.Services.AddOpenTelemetry()
// Use helper to configure Azure Monitor defaults
.UseAzureMonitor(o =>
{
o.ConnectionString = builder.Configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"];
})
.WithTracing(t =>
{
// Listen to the YARP tracing activities
t.AddSource("Yarp.ReverseProxy");
});
var app = builder.Build();
app.MapReverseProxy();
app.Run();
例: OpenTelemetry ホスティング
<ItemGroup>
<PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.7.0" />
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.7.0" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.7.0" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.7.0" />
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.7.0" />
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.7.0" />
</ItemGroup>
using OpenTelemetry.Logs;
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddReverseProxy().LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));
// configure OTel and OTLP
const string serviceName = "yarpProxy";
builder.Logging.AddOpenTelemetry(options =>
{
options
.SetResourceBuilder(
ResourceBuilder.CreateDefault()
.AddService(serviceName))
.AddOtlpExporter();
});
builder.Services.AddOpenTelemetry()
.ConfigureResource(resource => resource.AddService(serviceName))
.WithTracing(tracing => tracing
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddSource("Yarp.ReverseProxy")
.AddOtlpExporter()
);
// build and start app
var app = builder.Build();
app.MapReverseProxy();
app.Run();
要求スパンを出力するには、AddHttpClientInstrumentation()
呼び出しと AddSource("Yarp.ReverseProxy")
呼び出しが必要であることに注意してください。
OpenTelemetry による ASP.NET の可観測性に関するドキュメントを参照してください。
トレースがプロキシサーバーと転送先サーバーの同じストアに記録されている場合、トレース分析ツールは要求を関連付け、サーバー間で遷移する要求のエンドツーエンドの処理をカバーするガント チャートなどを提供できます。
同じパターンは、Jaeger と Zipkin の組み込みの OTEL エクスポーター、または OTEL を採用 APM ベンダーの多くで使用できます。
カスタム トレース ヘッダーの使用
.NET に組み込まれていない伝達メカニズム (たとえば、B3 伝達 ) を使用する場合は、そのスキームのカスタム [DistributedContextPropagator
] を実装する必要があります。
YARP は [DistributedContextPropagator.Fields
] 内のすべてのヘッダーを削除し、プロパゲーターが Inject
呼び出し中に要求にヘッダーを再追加できるようにします。
パススルー プロキシ
プロキシがトレースに積極的に参加しないようにし、すべてのトレース ヘッダーを as-isのままにしたい場合は、SocketsHttpHandler.ActivityHeadersPropagator
を null
に設定します。
services.AddReverseProxy()
.ConfigureHttpClient((context, handler) => handler.ActivityHeadersPropagator = null);
DistributedContextPropagator
DistributedContextPropagator.Fields
ASP.NET Core