【问题标题】:TelemetryClient produces inconsistent results in Application InsightsTelemetryClient 在 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(所有内核)”。任何想法为什么会发生这种奇怪的行为?:

【问题讨论】:

    标签: azure azure-application-insights azureportal telemetry


    【解决方案1】:

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

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

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

    更多阅读:Flushing dataEnsure 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
    • 完美。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 2021-05-25
    • 2016-08-14
    • 2019-11-28
    • 2017-06-10
    • 1970-01-01
    相关资源
    最近更新 更多