将日志记录更新为发送到Application Insights,以便使用OpenTelemetry SDK,但这导致HTTP状态码过滤失效

后端开发 2026-07-12

我刚刚更新了在我的项目中将日志记录到Application Insights的代码,以使用OpenTelemetry SDK;不知为何,我无法让对404 HTTP状态码的过滤生效,例如把健康检查返回的404从 Application Insights中隐藏起来。

So I have my LoggingWebAppBuilderExtension.cs:

//...Redacted code for space...
.WithTracing(tracing => 
{
    tracing.AddAspNetCoreInstrumentation(options => 
    {
        // This hook runs at the exact moment the metrics are being finalized.
        options.EnrichWithHttpResponse = (activity, response) => 
        {
            if (response.StatusCode == 404)
            {
                // This flips the 'Success' bit for the metric engine
                activity.SetStatus(ActivityStatusCode.Ok);
                activity.SetTag("otel.status_code", "OK");

                // This is the NUCLEAR OPTION: 
                // It changes the tag that the Metrics engine uses for the chart.
                // It will now count as a '200' in your charts.
                activity.SetTag("http.response.status_code", "200");
            }
        };
    });
    tracing.AddProcessor<ResponseCodeProcessor>(); 
})

return builder;

Then, I have my ResponseCodeProcessor.cs:

internal sealed class ResponseCodeProcessor : BaseProcessor<Activity>
{
    public override void OnEnd(Activity activity)
    {
        if (activity.Kind == ActivityKind.Server)
        {
            var statusCode = activity.GetTagItem("http.response.status_code")?.ToString();

            if (statusCode == "404")
            {
                activity.IsAllDataRequested = false;
                activity.ActivityTraceFlags &= ~ActivityTraceFlags.Recorded;
            }
        }
    }
}

我已经尝试从Application Insights中移除所有的404,但不知为何,虽然我能把该操作从操作列表中移除,但计数器似乎仍在统计它们。下面是一张截图:

在此处输入图片描述

有人在这方面有解决办法吗?

解决方案

所以我想我找到了一个解决方案……不知道是否是最佳实践,但这是对我有用的方法。

LoggingWebAppBuilderExtension:

    .WithTracing(tracing =>
    {
        tracing.AddAspNetCoreInstrumentation(options =>
        {
            options.EnrichWithHttpResponse = (activity, response) =>
            {
                if (response.StatusCode == 404)
                {
                    activity.SetStatus(ActivityStatusCode.Ok);
                    activity.SetTag("otel.status_code", "OK");
                    activity.SetTag("http.response.status_code", "200");
                    activity.SetTag("IsFakeSuccess", "true");
                }
            };
        });
        tracing.AddProcessor<ResponseCodeProcessor>();
    });


return builder;

ResponseCodeProcessor:

internal sealed class ResponseCodeProcessor : BaseProcessor<Activity>
{
    public override void OnEnd(Activity activity)
    {
        if (activity.Kind == ActivityKind.Server)
        {
            var isFake = activity.GetTagItem("IsFakeSuccess")?.ToString();

            if (isFake == "true")
            {
                activity.IsAllDataRequested = false;
                activity.ActivityTraceFlags &= ~ActivityTraceFlags.Recorded;
            }
        }
    }
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章