Application Insight的TelemetryClient线程安全吗?

Mia*_*ang 10 c# multithreading azure azure-application-insights

在此链接:https://azure.microsoft.com/en-us/documentation/articles/app-insights-api-custom-events-metrics/

它明确地说:

TelemetryClient是线程安全的.

我们建议您为应用的每个模块使用TelemetryClient实例.

但是,MSDN文档(https://msdn.microsoft.com/en-us/library/azure/microsoft.applicationinsights.telemetryclient.aspx)说:

此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的.任何实例成员都不保证是线程安全的.

所以问题是,TrackEvent和TrackMetric等大多数功能都不是静态的.如果我按照第一篇文章,为我的Web服务设置单例实例,我会遇到线程问题吗?

小智 9

TelemetryClient是线程安全的.有效的用法是创建单例并重用它.您不会遇到重用实例的问题.

  • 每个TelemtryClient都会创建自己的频道,自己的遥测初始化器,处理器等副本.这是浪费资源.管理字段应该通过遥测初始化程序和公共容器(如HttpContext或OperationContext或某些DI)完成. (3认同)

Str*_*ior 5

当MSDN Docs说给定的类不是线程安全的时,它们通常是不正确的。我不确定人们如何标记他们的代码才能使这些文档反映出类的线程安全性,但是我已经看到很多实例,这些文档不正确。

您链接的Azure文章的当前版本显示:

TelemetryClient是线程安全的。

对于ASP.NET和Java项目,将自动捕获传入的HTTP请求。您可能想为应用程序的其他模块创建TelemetryClient的其他实例。例如,您可能在中间件类中有一个TelemetryClient实例来报告业务逻辑事件。您可以设置诸如UserId和DeviceId之类的属性来标识计算机。此信息附加到实例发送的所有事件。

TelemetryClient.Context.User.Id = "...";
TelemetryClient.Context.Device.Id = "...";
Run Code Online (Sandbox Code Playgroud)

最后一点非常重要。即使该类是线程安全的,但是如果您编写的Web应用程序中的UserId可能会发生变化,您也可能应该为这些值都相同的每个范围重用遥测客户端的实例(例如每个Request) ),但不能作为静态/单实例。

更新资料

在ASP.NET Core中,Application Insights大量使用依赖项注入并将TelemetryClient注册为单例!如文档所述

我们不建议TelemetryClient在ASP.NET Core应用程序中创建新实例。的单例实例TelemetryClient已在DependencyInjection容器中注册,该容器TelemetryConfiguration与其余遥测共享。TelemetryClient仅当其需要与遥测其余部分分开的配置时,才建议创建一个新实例。

这意味着您应避免在客户端上下文中设置不想在整个应用程序中使用的变量,而应利用遥测初始化程序在每个遥测对象上设置诸如用户ID之类的内容。