首页 > 解决方案 > 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);
    }

}

标签: asp.net-core.net-coreazure-application-insights

解决方案


在所有情况下,您都没有调用 next.Process() ,因此导致项目被丢弃。您的场景需要使用ITelemetryInitializer, 而不是ITelemetryProcessor,因为您只是尝试修改自动收集的信息,而不是尝试根据条件删除项目。

https://docs.microsoft.com/en-us/azure/application-insights/app-insights-api-filtering-sampling#add-properties-itelemetryinitializer

类似于以下内容:

 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;
         }
    }
  }

推荐阅读