【问题标题】:Is Application Insight's TelemetryClient Thread Safe?Application Insight 的 TelemetryClient 线程安全吗?
【发布时间】:2016-06-07 21:05:08
【问题描述】:

在此链接上: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 中为共享)成员都是线程安全的。不保证任何实例成员都是线程安全的。

所以问题是,TrackEvent 和 TrackMetric 等大多数函数都不是静态的。如果我遵循第一篇文章,为我的 Web 服务提供一个单例实例,我会遇到线程问题吗?

【问题讨论】:

  • 您不会遇到线程问题。如果您需要我,我可以进一步详细说明,但出于所有密集目的,您不会遇到线程问题。
  • 问题中的 MSDN 链接重定向到的new docs page 没有矛盾的非线程安全免责声明。

标签: c# multithreading azure azure-application-insights


【解决方案1】:

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

【讨论】:

  • 您可能希望从不同的地方使用 TelemetryClient 的新实例,以便您可以设置操作 id 或您可能希望用来将遥测数据链接在一起的其他字段。例如,request+dependency 或 pageview+dependency 使用共享操作 id,以便您可以找到来自特定请求或 pageview 的依赖调用。如果您在整个应用程序中只使用一个遥测客户端,那么这样做会有点困难。
  • 每个 TelemtryClient 都会创建自己的通道、遥测初始化器、处理器等副本。这是对资源的浪费。管理字段应该通过遥测初始化器和通用容器(如 HttpContext 或 OperationContext 或一些 DI)来完成。
  • 是否有文档提到它或建议的使用方法? official doc 没有任何建议。查看其他来源,听起来拥有 TelemetryClient 的multiple instances 可能很有用,这种用法将取决于场景。
【解决方案2】:

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

the Azure article you linked 的当前版本说:

TelemetryClient 是线程安全的。

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

TelemetryClient.Context.User.Id = "...";
TelemetryClient.Context.Device.Id = "...";

最后一点非常重要。即使该类是线程安全的,如果您正在编写类似 Web 应用程序的东西,其中 UserId 可能会更改,您可能应该为这些值都相同的每个范围重用遥测客户端的实例(如每个请求),但不是作为静态/单例实例。

更新

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

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

这意味着您应该避免在客户端上下文中设置不希望在整个应用程序中使用的变量,而是利用 Telemetry Initializers 在每个遥测对象上设置用户 ID 等内容.

【讨论】:

  • 能否为 ASP.NET Core 单例注册添加引用?
  • @gabe:是的。完成。
猜你喜欢
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 2020-04-15
  • 2018-07-18
  • 2011-07-04
  • 2014-04-26
  • 2012-11-30
  • 2010-12-30
相关资源
最近更新 更多