我有一个ASP.NET MVC网站,我正在实施Application Insights。现在,我按如下方式记录跟踪事件:
private static TelemetryClient _APM;
private static TelemetryClient APM
{
get
{
if (_APM == null) { _APM = new TelemetryClient(); }
return _APM;
}
}
public static void Trace(string Message)
{
APM.TrackTrace(Message);
}
如您所见,这将为所有跟踪维护TelemetryClient的单个静态实例。这是我们应该如何使用客户端?或者我们是否应该为每个Log创建一个新的TelemetryClient实例?
根据 文档 你应该:
...为您的应用的每个模块使用TelemetryClient实例。例如,您的Web服务中可能有一个TelemetryClient用于报告传入的http请求,而另一个用于报告业务逻辑事件的中间件类。
为每个日志创建一个新的遥测客户端可能很昂贵,因此根据您的应用程序的结构,您可能正确使用您在帖子中描述的单例模式。
根据 文档 你应该:
...为您的应用的每个模块使用TelemetryClient实例。例如,您的Web服务中可能有一个TelemetryClient用于报告传入的http请求,而另一个用于报告业务逻辑事件的中间件类。
为每个日志创建一个新的遥测客户端可能很昂贵,因此根据您的应用程序的结构,您可能正确使用您在帖子中描述的单例模式。
darth_phoenixx引用的完整引用实际上是:
TelemetryClient是线程安全的。
对于ASP.NET和Java项目,将自动捕获传入的HTTP请求。您可能希望为应用程序的其他模块创建TelemetryClient的其他实例。例如,您的中间件类中可能有一个TelemetryClient实例来报告业务逻辑事件。您可以设置UserId和DeviceId等属性来标识计算机。此信息附加到实例发送的所有事件。
TelemetryClient.Context.User.Id = "...";
TelemetryClient.Context.Device.Id = "...";
最后一点非常重要。如果您正在编写类似于UserId可能更改的Web应用程序,您可能应该为每个范围重用遥测客户端的实例,其中这些值将是相同的(如每个请求),但不是静态/单例实例。
更新
在ASP.NET Core中,Application Insights大量使用依赖注入并将TelemetryClient注册为单例!
这意味着你应该 避免 在客户端上下文中设置您不希望在整个应用程序中使用的变量,而是利用遥测初始化器来设置每个遥测对象上的用户ID。