提问人:Andy 提问时间:11/7/2023 最后编辑:Andy 更新时间:11/8/2023 访问量:79
ApplicationInsights - 防止快速成功请求的示例
ApplicationInsights - prevent samples of quick successful requests
问:
我有一个连接到应用程序见解的应用程序,我们有相当多的请求。绝大多数是低于 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);
}
}
答:
0赞
Suresh Chikkam
11/7/2023
#1
关于 ,设置为 确实会从整体指标中排除遥测项,这就是在指标中看不到它们的原因。相反,您可以使用该属性来阻止采样,而无需将其从指标中排除。MyTelemetryInitializer
ProactiveSamplingDecision
SamplingDecision.SampledOut
IRequestTelemetry.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();
过滤后的响应:
评论
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 请求的采样策略吗?因为它看起来像是全有或全无的事情。
评论
requestTelemetry.ProactiveSamplingDecision = SamplingDecision.SampledOut
IRequestTelemetry.ProactiveSamplingEligibility