遥测采样而不会影响错误/故障

时间:2019-04-17 15:20:49

标签: .net azure azure-application-insights telemetry

我想在应用程序见解中记录成功呼叫的百分比。 我碰到了这篇https://docs.microsoft.com/en-us/azure/azure-monitor/app/sampling帖子,我认为固定速率采样在这里很合适。但这是否会同等影响所有日志记录?是否会不再记录一些错误/故障?

我正在寻找一种解决方案,该解决方案可以记录一定比例的成功呼叫,但保留所有失败的请求/错误。

2 个答案:

答案 0 :(得分:1)

我不认为这是开箱即用的,但是您可以编写自己的ITelemetryProcessor

请参阅:https://docs.microsoft.com/en-us/azure/azure-monitor/app/api-filtering-sampling#filtering-itelemetryprocessor

.NET中的Application Insights使用了一系列遥测处理器,可用于过滤遥测,因此您可以编写自己的代码来检查resultCode(我认为这就是Application Insights所称的HTTP状态代码,但是您必须仔细检查)请求遥测对象,如果它是500(或5xx),则批准它,但如果是2xx或3xx,则只有10%的机会发送它。您可以覆盖OKToSend()方法以对ITelemetry输入执行上述检查,并相应地返回true / false。

也许是这样的(我是在浏览器中写的,不一定能按原样完美地工作):

// Approves 500 errors and 10% of other telemetry objects
private bool OKtoSend (ITelemetry telemetry)
{
    if (telemetry.ResponseCode == 500) {
        return true;
    } else {
        Random rnd = new Random();
        int filter = rnd.Next(1, 11);
        return filter == 1;
    }
}

答案 1 :(得分:1)

要排除失败事件以免受到采样的影响(在对其他所有内容进行采样时),请使用此逻辑编写TelemetryInitializer

public class PreventSamplingForFailedTelemetryInitializer: ITelemetryInitializer
{
  public void Initialize(ITelemetry telemetry)
  {
        if(failed)
        {
            // Set to 100, so that actual SamplingProcessors ignore this from sampling considerations.
            ((ISupportSampling)telemetry).SamplingPercentage = 100;
        }
   }
}

(Make sure to add this TelemetryInitializer to the TelemetryConfiguration)

Failed or not can be determined from RequestTelemetry and DependencyTelemetry from their `Success` field.

(the last one in FAQ sections has hints to answer your question https://docs.microsoft.com/en-us/azure/azure-monitor/app/sampling#frequently-asked-questions)