将日志记录更新为发送到Application Insights,以便使用OpenTelemetry SDK,但这导致HTTP状态码过滤失效
我刚刚更新了在我的项目中将日志记录到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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。