次の方法で共有


YARP 分散トレース

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.ActivityHeadersPropagatornullに設定します。

services.AddReverseProxy()
    .ConfigureHttpClient((context, handler) => handler.ActivityHeadersPropagator = null);

DistributedContextPropagator DistributedContextPropagator.Fields