将TelemetryClient的静态实例与Application Insights结合使用

本文关键字:Insights 结合 Application TelemetryClient 静态 实例 | 更新日期: 2023-09-27 18:29:53

我有一个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的单个静态实例。我们应该这样使用客户端吗?还是我们应该为每个日志创建一个TelemetryClient的新实例?

将TelemetryClient的静态实例与Application Insights结合使用

根据您应该使用的文档:

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

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

darth_phenixx引用的完整引号实际上是:

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等内容。