如何使用Application Insight的持久性通道防止丢失遥测事件?

时间:2015-10-20 14:52:53

标签: azure azure-application-insights

我已将Microsoft Application Insights集成到我的Windows窗体应用程序中。在使用默认内存中通道的文档Application Insights on Windows Desktop apps, services and worker roles中,在刷新应用程序之后,在退出之前会休眠一秒钟。

 tc.Flush(); // only for desktop apps

 // Allow time for flushing:
 System.Threading.Thread.Sleep(1000);

该文件指出:

  

请注意,Flush()对于持久性通道是同步的,但对于其他通道是异步的。

由于此示例使用的是内存中通道,我可以推断出代码示例中的刷新是异步的,因此是睡眠。

在我的代码中,我使用了持久性通道。在退出我的计划之前,我提出了一个事件应用程序关闭

static void Main(string[] args)
{
    try { /* application code */ }
    finally
    {
        Telemetry.Instance.TrackEvent("Application Shutdown");
        Telemetry.Instance.Flush();
        System.Threading.Thread.Sleep(1000); // allow time for flushing
    }
}

坚持文档,Flush是同步的,因此在应用程序退出之前不需要睡眠。查看到达Azure门户的事件,我可以看到,对于大多数用户而言,应用程序关闭事件未到达云端。单步执行调试器并踩过Flush我也感觉不到任何延迟。

我确定我使用了持久性通道,因为我可以在%LOCALAPPDATA%\Microsoft\ApplicationInsights中看到数据被缓冲。

我的问题是:

  • 作为持久性渠道的Flush clearly is synchronous,每个应用程序运行的最后一个事件在Azure中不会显示的问题是什么?

1 个答案:

答案 0 :(得分:4)

如果我没记错,Flush()会将剩余的遥测数据同步写入缓冲区(在持久通道的情况下为%LOCALAPPDATA%),但它不会启动任何传递操作。如果缓冲区位置没有改变,我希望这个遥测会在下一个应用程序启动后出现,因为AI将读取缓冲的数据并将其发送出去。 我可能会在这里弄错,这背后的逻辑可能会在不久前被改变..