YARP Distributed Tracing (Theo dõi phân tán)
Nguồn: YARP Distributed Tracing
YARP là một thành phần ASP.NET Core, vì vậy nó có thể dễ dàng tích hợp vào các hệ thống tracing (theo dõi) khác nhau, giống như bất kỳ ứng dụng ASP.NET Core nào khác.
.NET có hỗ trợ tích hợp và có thể cấu hình cho distributed tracing (theo dõi phân tán) mà YARP tận dụng để cho phép các kịch bản như vậy hoạt động ngay lập tức.
Sử dụng OpenTelemetry (OTEL)
YARP hỗ trợ distributed tracing sử dụng OpenTelemetry (OTEL). Khi một request đến và có một listener cho Activities, thì ASP.NET Core sẽ truyền bá Trace Context trace-id, hoặc tạo một cái mới nếu cần, và tạo các spans/activities mới cho công việc được thực hiện. Ngoài ra, YARP có thể tạo activities cho:
- Forwarding Requests (Chuyển tiếp yêu cầu)
- Active health checks for clusters (Kiểm tra sức khỏe chủ động cho các cluster)
Các activities này chỉ được tạo ra nếu có một listener cho ActivitySource có tên là Yarp.ReverseProxy.
Ví dụ: Application Insights
Ví dụ, để theo dõi các trace với Application Insights, ứng dụng proxy cần sử dụng các SDK OpenTelemetry .NET và Azure Monitor.
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()
// Sử dụng helper để cấu hình Azure Monitor mặc định
.UseAzureMonitor(o =>
{
o.ConnectionString = builder.Configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"];
})
.WithTracing(t =>
{
// Lắng nghe các tracing activities của YARP
t.AddSource("Yarp.ReverseProxy");
});
var app = builder.Build();
app.MapReverseProxy();
app.Run();Ví dụ: OpenTelemetry hosting
<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"));
// Cấu hình OTel và 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()
);
// Xây dựng và khởi động ứng dụng
var app = builder.Build();
app.MapReverseProxy();
app.Run();Lưu ý rằng việc gọi AddHttpClientInstrumentation() là bắt buộc cùng với việc gọi AddSource("Yarp.ReverseProxy") để các request spans được phát ra.
Xem Tài liệu ASP.NET về Observability với OpenTelemetry.
Miễn là các trace đang được ghi vào cùng một kho lưu trữ cho cả proxy và các destination server, thì các công cụ phân tích tracing có thể tương quan các request và cung cấp biểu đồ Gantt, v.v., bao gồm toàn bộ quá trình xử lý request khi chúng chuyển qua các server.
Mô hình tương tự có thể được sử dụng với các OTEL exporter tích hợp sẵn cho Jaeger và Zipkin, hoặc với nhiều nhà cung cấp APM đang áp dụng OTEL.
Sử dụng custom tracing headers (header theo dõi tùy chỉnh)
Khi sử dụng cơ chế truyền bá không được tích hợp sẵn trong .NET (ví dụ: B3 propagation), bạn nên triển khai một DistributedContextPropagator tùy chỉnh cho scheme đó.
YARP sẽ xóa bất kỳ header nào trong DistributedContextPropagator.Fields để propagator có thể thêm lại chúng vào request trong lệnh gọi Inject.
Pass-through proxy (Proxy chuyển tiếp thẳng)
Nếu bạn không muốn proxy tham gia tích cực vào trace, và muốn giữ nguyên tất cả các tracing header như cũ, bạn có thể làm điều đó bằng cách đặt SocketsHttpHandler.ActivityHeadersPropagator thành null.
services.AddReverseProxy()
.ConfigureHttpClient((context, handler) => handler.ActivityHeadersPropagator = null);