TelemetryClient 在 Application Insights 中产生不一致的结果

Posted

技术标签:

【中文标题】TelemetryClient 在 Application Insights 中产生不一致的结果【英文标题】:TelemetryClient produces inconsistent results in Application Insights 【发布时间】:2017-10-03 03:33:08 【问题描述】:

我尝试在有和没有刷新的情况下跟踪自定义指标。但是,这些指标只是间歇性地显示在 Application Insights 的“自定义”部分下。第一个问题:是否需要在每次“TrackMetric(metric)”调用后运行“flush()”才能将遥测数据发送到 Application Insights?第二:为什么会出现这种间歇性行为?我一次只写一个指标,所以我并没有用数千个单独的调用来超载 Application Insights。这是我的代码(来自一个简单的控制台应用程序):

    public class Program

    public static void Main(string[] args)
    
        var telemetryClient = new TelemetryClient()
        
            Context =  InstrumentationKey = "hidden instrumentation key" 
        ;
        var metric = new MetricTelemetry
        
            Name = "ImsWithContextMetric2",
            Sum = 42.0
        ;
        telemetryClient.TrackMetric(metric);
        telemetryClient.Flush();
    

我在 Application Insights 中也遇到了这种奇怪的行为,其中我添加的自定义指标显示在“不可用/已弃用的指标”部分下。在“自定义”部分下会弹出一个我什至没有添加的指标,称为“进程 CPU(所有内核)”。任何想法为什么会发生这种奇怪的行为?:

【问题讨论】:

【参考方案1】:

是否需要在每次调用“TrackMetric(metric)”后运行“flush()”才能将遥测数据发送到 Application Insights?

由于您使用控制台应用程序向 Application Insights 发送事件,这可能是短暂的,因此每隔一段时间调用一次.Flush() 绝对是一个好习惯。 SDK 使用 InMemoryChannel 发送遥测数据,并使用内存队列批量发送。所以调用.Flush() 以便强制推送数据非常重要。一个好的做法可能是在事件之后添加一些等待:

telemetryClient.Flush();
Thread.Sleep(1000);

更多阅读:Flushing data,Ensure you don't lose telemetry

但是,这些指标只是间歇性地显示在 Application Insights 的“自定义”部分下。为什么会出现这种间歇性行为?我一次只写一个指标,所以我不会用数千个单独的调用来超载 Application Insights。

有时,Azure 门户中显示的指标会有延迟。它也可以长达几分钟。但是如果你设置正确,你没有超过throttling limit,并且adaptive sampling被禁用,那么遥测没有理由应该是间歇性的。但是,如果您仍然觉得有问题,请启动 fiddler 跟踪(确保您是从非浏览器会话中捕获的)并检查是否有呼叫发送到 dc.services.visualstudio.com。确保响应为 200 OK 并且项目是否被服务器接受。

我在 Application Insights 中也遇到了这种奇怪的行为,其中我添加的自定义指标显示在“不可用/已弃用的指标”部分下。

您使用的是什么版本的 SDK?我刚刚尝试了相同的场景,并且自定义指标显示正确。

在“自定义”部分下弹出了一个我什至没有添加的指标,称为“进程 CPU(所有内核)”。

“进程 CPU”是一个performance counter,用于跟踪 CPU 利用率。我相信如果应用程序在 IIS 或 Azure 上运行,SDK 将只能跟踪这些计数器。它可能是在您创建 Application Insights 资源时在内部添加的。您可以忽略它,因为它没有要绘制的数据。

希望这会有所帮助!

【讨论】:

感谢您的回复。在回答您的问题时,我使用的是 Microsoft.ApplicationInsights 库的最新可用版本,即 2.3。另外,我是否需要在控制台中调用“flush()”后运行 sleep 大约一分钟以确保它始终如一地工作? 另外,什么是“自适应采样”,我该如何关闭它?是否默认禁用? 是的,您应该在刷新缓冲区后添加Thread.Sleep()。我在答案中添加了更多参考。您不必担心应用程序的自适应采样,默认情况下不会启用它,因为它不是 Web 应用程序。你可以阅读更多关于如何做到这一点的方法here。我只是想把它称为一个可能的原因。关于“不可用/不推荐使用的指标”问题,我建议你打开一个问题here 完美。感谢您的帮助!

以上是关于TelemetryClient 在 Application Insights 中产生不一致的结果的主要内容,如果未能解决你的问题,请参考以下文章

拦截 Azure Function 主机关闭:刷新 Application Insights TelemetryClient

Application Insights-TelemetryClient-DependencyTelemetry-UseSampling

Spring Boot 报错 o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applica

PHP 致命错误:未捕获的错误:在 /home/khadija/InstProject/bootstrap/app.php:14 中找不到类“Illuminate\Foundation\Applica

MobileNet V12017-CVPR-MobileNets Efficient Convolutional Neural Networks for Mobile Vision Applica

MobileNet V12017-CVPR-MobileNets Efficient Convolutional Neural Networks for Mobile Vision Applica