处于调试模式时的 Application Insights

Posted

技术标签:

【中文标题】处于调试模式时的 Application Insights【英文标题】:Application Insights when in debug mode 【发布时间】:2016-08-15 16:53:35 【问题描述】:

我刚刚在我的 MVC 应用程序中启用了 Application Insights,并注意到在本地调试时,我的 Azure Application Insight 中捕获了跟踪信息。

在调试模式下,我想阻止我的应用在我的 Azure Application Insight 中记录事件,但仍会在 Visual Studio 的“诊断工具”>“事件”窗口中显示事件和日志记录信息。

我尝试了以下方法,虽然这会阻止在我的 Azure AI 中捕获事件,但 Visual Studio 不再在事件窗口中显示调试信息。

 protected void Application_Start()
 
        #if DEBUG
        TelemetryConfiguration.Active.DisableTelemetry = true;
        #endif
 

我上网寻找答案无济于事。希望有人能帮忙。

【问题讨论】:

今天的正确做法是什么? 【参考方案1】:

最便宜的方法是将 Instrumentation Key 设置为全 0。没有 NULL iKey,因此它只会删除消息。

00000000-0000-0000-0000-000000000000

如果您想使用Application_Start(),您可以使用#DEBUG 指令或System.Diagnostics.Debugger.IsAttached 属性来执行此操作。然而,这种方法并不完全可靠。您可以尝试,但您的体验可能不一致。

如果你有时间,你应该创建一个TelemetryInitializer,它会根据调试器是否附加来更改检测密钥。这将确保仅当您在调试会话中时才会发生这种情况。这样,如果您不小心将 Debug 发布到生产环境,您就不会丢失遥测数据。

public class CustomeWebRequestTelemetryModule :  Microsoft.ApplicationInsights.Extensibility.ITelemetryInitializer

    public void Initialize(ITelemetry telemetry)
    
        if (telemetry != null && System.Diagnostics.Debugger.IsAttached)
        
            telemetry.Context.InstrumentationKey = "00000000-0000-0000-0000-000000000000";
        
    

【讨论】:

这非常有效,也是我一直在寻找的方法。谢谢。【参考方案2】:

您对在 Application Insights 中发送遥测数据有什么顾虑?例如,您可以拥有一个单独的 Application Insights 资源(由检测密钥标识),该资源仅用于您的调试体验,并且在生产环境中,将检测密钥切换为指向生产资源。

另外,我们最近引入了“本地模式”——无需连接到 Azure 即可在 Visual Studio 中使用 Application Insights。在这种情况下,来自上次调试会话的遥测数据会保留在您的本地计算机上,并可用于搜索并集成到 Diagnostics Hub。见这里:https://azure.microsoft.com/en-us/documentation/articles/app-insights-release-notes-vsix/#version-43

我相信为了实现这一点,您需要从 applicationinsights.xml 中删除检测密钥,但我不是 100% 确定。将要求我的同事在此处添加更多信息...如果这是您正在寻找的,请告诉我们。 奥列格

【讨论】:

在配置了 Application Insights (AI) 的 Visual Studio 中调试应用程序时,可以直接在 VS 中以“本地模式”查看 AI 消息的输出(而不是实际传输到远程 AI 端点)。我还没有遇到过如何将日志记录和遥测信息从外部应用程序传输到这个本地 AI。例如,如果我的系统有两个不同的应用程序正在运行——甚至是一个纯 html 单页 Web 应用程序——是否可以在调试模式下将其他应用程序连接到本地 VS AI 实例?【参考方案3】:

@DebugThings 答案将(大部分)有效,尽管如果您使用 0 作为 ikey,您可能仍在发送遥测数据,但 可能也被拒绝被 AI 后端视为无效 ikey。

就个人而言,最好的解决方案是创建一个单独的“调试”iKey,并在以调试模式构建时在代码中使用该 iKey。

protected void Application_Start()

    #if DEBUG
    TelemetryConfiguration.Active.InstrumentationKey = "your debug ikey";
    #endif

这样,您可以“调试”您发送的任何遥测数据而不会污染您的生产环境,并且在发布版本中,您的配置文件中的 iKey 仍将被使用。这可让您确保发送正确的自定义属性/指标,而不会用完您目前允许的固定数量。

这是一篇关于根据环境等使用配置将数据发送到不同地方的博客文章:

https://blogs.msdn.microsoft.com/visualstudioalm/2015/01/07/application-insights-support-for-multiple-environments-stamps-and-app-versions/

这里有一个类似的问题,有类似的答案: Disable application insights in debug

【讨论】:

以上是关于处于调试模式时的 Application Insights的主要内容,如果未能解决你的问题,请参考以下文章

处于编辑模式时的 UITableViewCell 宽度问题

如何在设备处于睡眠模式时的某个特定时间在 android 中推送本地通知

无法判断 Vue 项目是处于调试模式还是 Visual Studio 的发布模式

Visual Studio 2010 认为它处于调试模式(但它设置为发布模式)

在 debug=false 的 Web 应用程序中,处于调试模式的 DLL 会发生啥?

UWP 应用程序在未处于调试模式时崩溃