.NET9让指标更纯正

Metrics为程序健康运行提供了保驾护航,但过多的指标又会为问题调查,大屏展示,以及基础日志存储带来更多的负担,特别对一些几乎没有意义的指示,比如健康检查的请求指标。

.NET 9 引入了一个新功能,允许在某些端点和请求上选择不采集HTTP 指标记录。

你可以通过以下方法排除某些端点的指标记录:

  • 在 Web API 控制器、SignalR Hub 或 gRPC 服务上添加 [DisableHttpMetrics] 特性。

  • 在应用程序启动时映射端点时,调用 DisableHttpMetrics()

using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Http.HttpResults;
using OpenTelemetry.Metrics;


var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHealthChecks();
builder.Services.AddOpenTelemetry()
    .WithMetrics(builder =>
    {
        builder.AddMeter("Microsoft.AspNetCore.Hosting",
"Microsoft.AspNetCore.Server.Kestrel");
        builder.AddView("http.server.request.duration",
new ExplicitBucketHistogramConfiguration
            {
                Boundaries = new double[] { 0, 0.005, 0.01, 0.025, 0.05,
0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10 }
            });
    });


var app = builder.Build();


app.MapGet("/test", () =>
{
return "ok";
});
app.MapHealthChecks("/healthz");
app.Run();

运行程序,接下来执行下面的命令:

dotnet-counters monitor -n DisableHttpMetricsDemo --counters Microsoft.AspNetCore.Hosting

(如果没有安装dotnet-counters,请用下面命令安装:dotnet tool install --global  dotnet-counters )

然后请求http://localhost:5189/healthz,结果如下:
4fe701ee5548fcbdd8905b25ba5d0ce2.png

现在修改26行代码如下:

app.MapHealthChecks("/healthz").DisableHttpMetrics();

再次运行跟踪命令,并请求/healthz,这时/healthz就不会出现在指标中了。

在更复杂的场景中,如果请求没有直接映射到某个端点,或者你希望动态地选择不采集某些 HTTP 请求的指标记录,可以使用 IHttpMetricsTagsFeature 接口上的新属性 MetricsDisabled。在处理 HTTP 请求时,将 MetricsDisabled 设置为 true 即可选择不采集该请求的指标记录。

通过中间件条件性地选择不采集HTTP 请求的指标记录。

app.Use(async (context, next) =>
{
if (context.Request.Headers.ContainsKey("x-disable-metrics"))
    {
var feature = context.Features.Get<IHttpMetricsTagsFeature>();
if (feature != null)
        {
            feature.MetricsDisabled = true;
        }
    }
await next(context);
});

具体验证方式如上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值