使用TelemetryClient的静态实例和Application Insights

时间:2016-01-10 18:35:48

标签: c# logging azure-application-insights

我有一个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实例?

2 个答案:

答案 0 :(得分:14)

根据the docs你应该:

  

...为您的应用的每个模块使用TelemetryClient实例。例如,您的Web服务中可能有一个TelemetryClient用于报告传入的http请求,而另一个用于报告业务逻辑事件的中间件类。

为每个日志创建一个新的遥测客户端可能很昂贵,因此根据您的应用程序的结构,您可能正确使用您在帖子中描述的单例模式。

答案 1 :(得分:4)

darth_phoenixx引用的完整引言实际上是这样的:

  

TelemetryClient是线程安全的。

     

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

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

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

更新

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

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