Application Insights 遥测:你能跟踪 traces/events/etc。异步?

Application Insights Telemetry: can you track traces/events/etc. asynchronously?

我是 Azure Application Insights 的长期用户,我在我编写的每个企业应用程序中都大量使用 TelemetryClientTrackTrace()TrackException()

一直让我略感困扰的一件事是这些方法是同步的。由于这些方法与外部 API 通信,因此似乎始终存在阻塞风险;例如,如果网络 down/slow,或者 App Insights 自己的 API 有问题。

在这种情况下,似乎(至少在理论上)整个应用程序可能会挂起。在这种情况下,如果它们曾经发生,我希望我的应用程序能够继续运行,尽管未能在合理的时间范围内进行跟踪。

我在网上做了一些调查,似乎没有内置的方式来异步调用这些方法。你知道有什么方法可以做到这一点吗? (或者..... App Insights API 是否有一种隐藏的黑盒方式来自动防止这类事情发生?)

当然,我知道我总是可以将我的调用包装在 Task 中(例如,await Task.Run(() => myTelemetryClient.TrackTrace("my message"));(或者编写一个执行此操作的异步扩展方法)。我也可以使用计时器来取消这样的请求。但是,如果有更集成的方式来执行此操作,那就太好了。

有谁能赐教吗?这真的是我应该关注的潜在问题吗?还是我只是在向风车倾斜?

更新:我刚才看到, which indicates that AI does indeed handle tracking in an asynchronous manner "under the hood". But how can this be reliable, given the truism that asynchronous operations really need to be made async all the way up and down the call stack是为了防阻塞?

If it's anything like the JS API, the tracking events are placed in a queue then dequeued and sent (possibly in batches at configurable intervals) independently of the TrackXXX methods. Enqueuing an event can be synchronous, but the sending end of the process can operated asynchronously. The queue decouples the two from one another. – spender

我想@spender 回答了我的问题!谢谢!

Is this really a potential problem that I should be concerned with?

没有。 None 的 TrackABC() 方法与任何外部 API 通信或执行任何需要很长时间的操作。 Track() 运行所有遥测初始化程序,然后将项目排队到 in-memory 队列中。

虽然 built-in 遥测初始化器旨在快速完成并且不进行 I/O 或 HttpCalls,但如果用户添加了一个进行 http 调用或类似操作的遥测初始化器,那么是的,它'会影响您的 Track() 调用。但是在正常使用 TelemetryInitializers 的情况下,这应该不是问题。