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

2024-01-06

我已将 Microsoft Application Insights 集成到我的 Windows 窗体应用程序中。在文件中有关 Windows 桌面应用程序、服务和辅助角色的应用程序见解 https://github.com/Azure/azure-content/blob/master/articles/application-insights/app-insights-windows-desktop.md它使用默认的内存通道,刷新后应用程序会在退出前休眠一秒钟。

 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 显然是同步的 https://github.com/Microsoft/ApplicationInsights-dotnet/blob/master/src/TelemetryChannels/PersistenceChannel/Shared/FlushManager.cs#L119,每个应用程序运行的最后事件未显示在 Azure 中可能是什么问题?

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐