asp.net-core - ITelemetryProcessor 中断依赖跟踪
问题描述
我为我的 .NET Core 2.1 Web API 设置了一个自定义 ITelemetryProcessor。我不希望 HTTP 状态代码 400 或 401 在 Application Insights 中显示为错误。以下类执行此操作,但一旦我使用它,SQL 和 HTTP 客户端依赖跟踪将不再起作用:
ApplicationInsights400IsOkProcessor
public class ApplicationInsights400IsOkProcessor : ITelemetryProcessor {
private ITelemetryProcessor Next { get; set; }
/// <summary>
/// Link processors to each other in a chain.
/// </summary>
/// <param name="next"></param>
public ApplicationInsights400IsOkProcessor(ITelemetryProcessor next) {
this.Next = next;
}
/// <summary>
/// API Aufrufe mit Rückgabecode 400 und 401 sind keine Fehler
/// </summary>
/// <param name="item">Telemetry zum Verarbeiten</param>
public void Process(ITelemetry item) {
var requestTelemetry = item as RequestTelemetry;
if (requestTelemetry == null) return;
bool parsed = Int32.TryParse(requestTelemetry.ResponseCode, out int code);
if (!parsed) return;
switch (code) {
case 400:
requestTelemetry.Success = true;
requestTelemetry.Context.Properties["Overridden400"] = "true";
break;
case 401:
requestTelemetry.Context.Properties["Overridden401"] = "true";
requestTelemetry.Success = true;
break;
}
this.Next.Process(item);
}
在 .NET Core 2.0 中,我使用了一个自定义 ITelemetryInitializer,例如 Microsoft 的这个示例: https ://docs.microsoft.com/en-us/azure/application-insights/app-insights-api-filtering-sampling#add-properties-遥测初始化器
这是通过将以下内容添加到 Configure Services() 来使用的:
TelemetryConfiguration.Active.TelemetryInitializers
.Add(new MyTelemetryInitializer());
在 .NET Core 2.1 中,这似乎不再适用
更新: 根据我 cijothomas 的回答,审查了代码以确保在所有情况下都调用 this.Next.Process(item)。以下是工作版本:
ApplicationInsights400IsOkProcessor
public class ApplicationInsights400IsOkProcessor : ITelemetryProcessor {
private ITelemetryProcessor Next { get; set; }
public ApplicationInsights400IsOkProcessor(ITelemetryProcessor next) {
this.Next = next;
}
public void Process(ITelemetry item) {
if (item is RequestTelemetry requestTelemetry) {
bool parsed = Int32.TryParse(requestTelemetry.ResponseCode, out int code);
if (parsed) {
switch (code) {
case 400:
requestTelemetry.Success = true;
requestTelemetry.Context.Properties["Overridden400"] = "true";
break;
case 401:
requestTelemetry.Context.Properties["Overridden401"] = "true";
requestTelemetry.Success = true;
break;
}
}
}
this.Next.Process(item);
}
}
解决方案
在所有情况下,您都没有调用 next.Process() ,因此导致项目被丢弃。您的场景需要使用ITelemetryInitializer
, 而不是ITelemetryProcessor
,因为您只是尝试修改自动收集的信息,而不是尝试根据条件删除项目。
类似于以下内容:
public class ApplicationInsights400IsOkInitializer: ITelemetryInitializer
{
public void Initialize(ITelemetry telemetry)
{
var requestTelemetry = telemetry as RequestTelemetry;
// Is this a TrackRequest() ?
if (requestTelemetry == null) return;
bool parsed = Int32.TryParse(requestTelemetry.ResponseCode, out int code);
if (!parsed) return;
switch (code)
{
case 400:
requestTelemetry.Success = true;
requestTelemetry.Context.Properties["Overridden400"] = "true";
break;
case 401:
requestTelemetry.Context.Properties["Overridden401"] = "true";
requestTelemetry.Success = true;
break;
}
}
}
推荐阅读
- javascript - 在 React 中使用 async / await 不正确地更新状态
- apache-spark - 在使用 AWS Glue 作业在 redshift 中导入数据时添加时间戳列
- angular - 测试树枝茉莉花角
- android - 热门决定应该在 unity3d 游戏中选择 xxhdpi、xhdpi、hdpi、mdpi 或 ldpi 的哪个资产包变体,以获得没有像素化的体面 UI?
- java - 从谷歌脚本调用java jar库
- html - 我正在尝试获取文本,但我得到了?(值)并且无法单击。这是 selenium 中的一个下拉按钮(默认情况下选择值)
- java - 用 arraylist 填充 setMulitiChoiceItems 不起作用
- java - 为什么在 Spring Boot 中 SOAP 请求 obj 数据从客户端作为 Null 进入服务器
- spring-integration - 使用客户端 ConnectionFactory 停止 TCP 适配器
- sails.js - 如何检查船帆水线中是否存在数据