ApplicationInsights - 防止快速成功请求的示例

ApplicationInsights - prevent samples of quick successful requests

提问人:Andy 提问时间:11/7/2023 最后编辑:Andy 更新时间:11/8/2023 访问量:79

问:

我有一个连接到应用程序见解的应用程序,我们有相当多的请求。绝大多数是低于 80 毫秒的,但我们有一些是 >300 毫秒。 我遇到的问题是,当我们想要调查较长的查询时,我们发现我们没有它们的样本,因为快速运行的请求已经填满了样本配额。

我希望能够做的是防止/限制快速成功的请求包含在示例中,但保留为请求总体指标的一部分。

我尝试了自定义 ITelemetryProcessor 来排除快速调用,但它们在指标计数上也不再可见,因此我不知道它们是否被调用。

我尝试了 ITelemetryInitializer 并设置了请求。ProactiveSamplingDecision = SamplingDecision.SampledOut,但这也会将其从指标中删除。

该应用程序使用 C# .Net 4.8(完整框架)

有没有人做过类似的事情,或者可以帮助我实现我想做的事情?

TelemetryInitializer 的代码:

public class MyTelemetryInitializer : ITelemetryInitializer
{
    public void Initialize(ITelemetry telemetry)
    {
        var requestTelemetry = telemetry as RequestTelemetry;
        // Is this a TrackRequest() ?
        if (requestTelemetry == null) return;

        if (requestTelemetry.Success == true && requestTelemetry.Duration.TotalMilliseconds < 100)
        {
            requestTelemetry.ProactiveSamplingDecision = SamplingDecision.SampledOut;
        }
    }
}

TelementryFilter 的代码:

public class SuccessfulTelementryFilter : ITelemetryProcessor
{
    private ITelemetryProcessor Next { get; set; }        
    
    public SuccessfulTelementryFilter(ITelemetryProcessor next)
    {
        this.Next = next;
    }
    public void Process(ITelemetry item)
    {
        var request = item as RequestTelemetry;

        if (request != null && request.Success == true && request.Duration.Milliseconds < 100)
        {
            return;
        }

        this.Next.Process(item);
    }
}
ASP.NET-MVC AZURE-APPLICATION-INSIGHTS NET-4.8

评论

0赞 Suresh Chikkam 11/7/2023
您好@Andy,您能分享一下您厌倦的一段代码吗?
1赞 Andy 11/7/2023
@SureshChikkam我已经添加了我的代码。
0赞 Suresh Chikkam 11/7/2023
问题可能是由于主动抽样决策和自定义处理器之间的相互作用造成的。设置 时,它会有效地从所有指标和示例中删除遥测项。requestTelemetry.ProactiveSamplingDecision = SamplingDecision.SampledOut
0赞 Suresh Chikkam 11/7/2023
而不是这样,为什么不能使用该属性来防止采样而不将其从指标中排除。@AndyIRequestTelemetry.ProactiveSamplingEligibility

答:

0赞 Suresh Chikkam 11/7/2023 #1

关于 ,设置为 确实会从整体指标中排除遥测项,这就是在指标中看不到它们的原因。相反,您可以使用该属性来阻止采样,而无需将其从指标中排除。MyTelemetryInitializerProactiveSamplingDecisionSamplingDecision.SampledOutIRequestTelemetry.ProactiveSamplingEligibility

尝试这种替代方法,请查看下文。

  • 创建一个自定义遥测类型,用于扩展类并添加用于排除的自定义属性。RequestTelemetry
using Microsoft.ApplicationInsights.DataContracts;

public class CustomRequestTelemetry : RequestTelemetry
{
    public bool ExcludeFromSampling { get; set; }
}
  • 根据属性筛选出遥测项。ExcludeFromSampling
public class MyTelemetryInitializer : ITelemetryInitializer
{
    public void Initialize(ITelemetry telemetry)
    {
        if (telemetry is CustomRequestTelemetry customRequestTelemetry)
        {
            if (customRequestTelemetry.Success == true && customRequestTelemetry.Duration.TotalMilliseconds < 100)
            {
                customRequestTelemetry.ExcludeFromSampling = true;
            }
        }
    }
}
  • 自定义遥测处理器应检查此属性,并防止对遥测项进行采样。
using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.Extensibility;

public class SuccessfulTelemetryFilter : ITelemetryProcessor
{
    private ITelemetryProcessor Next { get; set; }

    public SuccessfulTelemetryFilter(ITelemetryProcessor next)
    {
        this.Next = next;
    }

    public void Process(ITelemetry item)
    {
        if (item is CustomRequestTelemetry customRequestTelemetry && customRequestTelemetry.ExcludeFromSampling)
        {
            return;
        }

        this.Next.Process(item);
    }
}
  • 在 Application Insights 配置中注册自定义遥测初始值设定项和遥测处理器。
TelemetryConfiguration.Active.DefaultTelemetrySink.TelemetryProcessorChainBuilder
    .Use((next) => new SuccessfulTelemetryFilter(next))
    .Build();

TelemetryConfiguration.Active.DefaultTelemetrySink.TelemetryProcessorChainBuilder
    .Use((next) => new MyTelemetryInitializer(next))
    .Build();

过滤后的响应:

enter image description here

评论

0赞 Andy 11/8/2023
我的 RequestTelementry 上没有该属性。我需要安装其他软件包吗?
0赞 Andy 11/8/2023
如果我从 ITelemetryProcessor 返回,是否会从 Application Insights 中完全排除 telementry,并且不会针对指标显示?我的第一种方法是执行此操作,但 telementry 请求未发送到 Application Insights,因此看起来从未调用过该终结点。
0赞 Suresh Chikkam 11/8/2023
是的,@Andy,遥测项将完全从 Application Insights 中排除,包括指标。更改采样策略 与其完全排除这些快速请求,不如降低它们的采样率。
0赞 Andy 11/8/2023
此外,RequestTelemetry 是一个密封类,因此不能继承自。
0赞 Andy 11/8/2023
您知道如何更改 paticular 请求的采样策略吗?因为它看起来像是全有或全无的事情。