当前位置:  开发笔记 > 编程语言 > 正文

使用TelemetryClient的静态实例和Application Insights

如何解决《使用TelemetryClient的静态实例和ApplicationInsights》经验,为你挑选了2个好方法。

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



1> darth_phoeni..:

根据文档你应该:

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

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


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

2> StriplingWar..:

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之类的内容。

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有