不影响遥测采样errors/failures

Telemetry sampling without affecting the errors/failures

我想在应用洞察中记录一定比例的成功调用。 我遇到了这个 post https://docs.microsoft.com/en-us/azure/azure-monitor/app/sampling 并且我认为 Fixed-rate sampling 在这里是合适的。但这会平等地影响所有日志记录吗?一些 errors/failures 将不再被记录吗?

我正在寻找一种记录一定比例的成功调用但保留所有失败调用的解决方案 requests/errors。

我不认为这是开箱即用的支持,但您可以编写自己的 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 输入执行上述检查,并相应地 return 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;
    }
}

要排除失败的事件进行采样,(同时对其他所有事件进行采样)使用此逻辑编写 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)