问题 使用TelemetryClient的静态实例和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实例?


6576
2018-01-10 18:35


起源



答案:


根据 文档 你应该:

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

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


10
2018-01-10 19:12



完善!这正是我想要的! - William
你可以这样做,但是对于服务器应用程序或ASP.Net你可以 不 想要使用静态 TelemetryClient。如果使用静态单例,则使用遥测(用户,会话,操作)记录的某些上下文字段将全部预先设置一次。使用新的遥测客户端将(尝试)从asp.net管道继承用户/会话/等,这可以帮助您诊断查看跟踪时发生的情况。在门户网站中,您将能够在跟踪发生的同一会话中看到所有遥测。或者哪个asp.net请求导致了跟踪。 - John Gardner


答案:


根据 文档 你应该:

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

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


10
2018-01-10 19:12



完善!这正是我想要的! - William
你可以这样做,但是对于服务器应用程序或ASP.Net你可以 不 想要使用静态 TelemetryClient。如果使用静态单例,则使用遥测(用户,会话,操作)记录的某些上下文字段将全部预先设置一次。使用新的遥测客户端将(尝试)从asp.net管道继承用户/会话/等,这可以帮助您诊断查看跟踪时发生的情况。在门户网站中,您将能够在跟踪发生的同一会话中看到所有遥测。或者哪个asp.net请求导致了跟踪。 - John Gardner


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。


0
2017-08-20 15:43