【问题标题】:Disable application insights in debug在调试中禁用应用程序洞察力
【发布时间】:2015-11-10 12:09:17
【问题描述】:

如何在使用调试配置时自动禁用应用程序洞察力并仅在发布时启用它?
是否可以在不创建另一个仅用于调试的检测密钥的情况下执行此操作?

我有trackevent 语句分散在整个代码中,将它们包含在调试预处理器检查中并不是一个理想的解决方案。

我目前的解决方案是将ApplicationInsights.config文件的Build Action设置为None,这样就不会复制到项目的输出目录中,但这不是一个可以基于活动构建自动化的过程配置。

有一个开发者模式,但需要手动更改(如果可以有条件地设置配置文件,清空instrumentationkey也解决了问题)。见http://apmtips.com/blog/2015/02/02/developer-mode/

参考:http://blogs.msdn.com/b/visualstudioalm/archive/2015/01/07/application-insights-support-for-multiple-environments-stamps-and-app-versions.aspx

【问题讨论】:

  • 对于 2021 年遇到此问题的任何人:按有效而不是投票对答案进行排序,以获得最新信息。

标签: c# azure-application-insights


【解决方案1】:

从 ASP.NET Core 3.1 开始:

public void Configure(IApplicationBuilder app, IHostingEnvironment env,
    TelemetryConfiguration configuration)
{
    configuration.DisableTelemetry = true;
}
TelemetryDebugWriter.IsTracingDisabled = true;

(上面可以从任何地方调用,但应用程序的生命周期越早越好)。

两者可以一起使用来抑制代码中的所有 Application Insights 活动。我使用#if DEBUG 指令进行保护,以确保 AppInsights 在我的本地计算机上不执行任何操作,但在发布到 Azure 云中的开发服务器时会发出事件:

public void Configure(IApplicationBuilder app, IHostingEnvironment env,
    TelemetryConfiguration configuration)
{
    if (env.IsDevelopment())
    {
#if DEBUG
        configuration.DisableTelemetry = true;

        TelemetryDebugWriter.IsTracingDisabled = true;
#endif
    }
}

【讨论】:

  • 我不确定这是否在 .net core 3.1 之后发生了变化,但 IsDevelopment() 不是 IHostingEnvironment 上的一种方法吗?感谢您展示我们可以将TelemetryConfiguration 传递给Configure
  • @Jedidja 感谢您发现这个错字 - 我已经更正了。
【解决方案2】:

我们可以修改“appsetting.json”文件,添加如下属性

"ApplicationInsights": {
    "EnableRequestTrackingTelemetryModule": false,
    "EnableEventCounterCollectionModule": false,
    "EnableDependencyTrackingTelemetryModule": false,
    "EnablePerformanceCounterCollectionModule": false,
    "EnableDiagnosticsTelemetryModule": false
  }

更多信息您可以找到here

【讨论】:

    【解决方案3】:

    上面建议的解决方案已被弃用(参考:https://github.com/microsoft/applicationinsights-dotnet/issues/1152)。在 dotnet core 中,动态禁用遥测的新方法是这样的:

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddApplicationInsightsTelemetry();
        }
    
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, TelemetryConfiguration configuration)
        {
            configuration.DisableTelemetry = true;
            ...
        }
    

    (参考:https://docs.microsoft.com/en-us/azure/azure-monitor/app/asp-net-core#disable-telemetry-dynamically

    如果您想在自定义 WebApplicationFactory 中禁用遥测(在进行集成测试时),您可以这样做:

    public class CustomWebApplicationFactory<TStartup> : WebApplicationFactory<TStartup> where TStartup : class
        protected override void ConfigureWebHost(IWebHostBuilder builder)
        {
            builder.ConfigureServices((context, services) =>
            {
                // Disable application insights during testing.
                services.Configure<TelemetryConfiguration>(
                    (telemetryConfig) => {
                        telemetryConfig.DisableTelemetry = true;
                    });
            });
            base.ConfigureWebHost(builder);
        }
    }
    

    有关集成测试的更多信息,请参阅https://docs.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-5.0

    【讨论】:

      【解决方案4】:

      从 .NET Core 3.1 开始:

      var telemetryConfiguration = TelemetryConfiguration.CreateDefault();
      telemetryConfiguration.DisableTelemetry = true;
      
      var telemetryClient = new TelemetryClient(telemetryConfiguration);   // Use this instance
      TelemetryDebugWriter.IsTracingDisabled = true;
      

      【讨论】:

      【解决方案5】:
               public void Configure(IApplicationBuilder app, IHostingEnvironment env)
              {
                  #region Disable Application Insights debug informations
      #if DEBUG
                  TelemetryConfiguration.Active.DisableTelemetry = true;
                  TelemetryDebugWriter.IsTracingDisabled = true;
      #endif
                  #endregion
      //...
      }
      

      【讨论】:

      • 今天已经过时了,我们今天如何正确地做到这一点?
      【解决方案6】:

      使用 Visual Studio 2017 (15.9.2) 运行 ASP.NET Core 2.1 Web 应用程序时,“为 Asp.Net Core Web 项目禁用本地 Application Insights”没有清除我的“调试”窗口中的输出。

      但是,在 Startup.cs 中将以下内容添加到 Configure() 中就可以了;

      if (_env.IsDevelopment())
      {
          app.UseDeveloperExceptionPage();
          TelemetryConfiguration.Active.DisableTelemetry = true;
          TelemetryDebugWriter.IsTracingDisabled = true;
      }
      

      请注意,IsTracingDisabled 是关键解决方案,但我为了更好的措施离开了 DisableTelemetry!此外,在同一解决方案中搜索 .NET Framework 和 .NET Core 项目之间的类似引用时,将两行并排放置会很有帮助。

      【讨论】:

      • 今天已经过时了,我们今天如何正确地做到这一点?
      • TelemetryDebugWriter.IsTracingDisabled = true 在最新的 asp.net 核心中没有被弃用,并且效果很好。只需省略另一行。
      【解决方案7】:

      对于 ASP.NET Core 项目,App Insights 默认开启,这实际上将大量信息记录到调试窗口中。

      要禁用它,请转到“工具--> 选项--> 项目和解决方案--> Web 项目”并选中“禁用 Asp.Net Core Web 项目的本地 Application Insights”。

      下图是禁用本地应用洞察的图片。

      有关该问题的更多信息,您可以查看官方 github 问题here

      【讨论】:

      • 这对我不起作用。看起来应该,但由于某种原因,我的调试输出仍然充斥着这些毫无意义的消息。
      • 不起作用....我所做的方法是添加 services.AddApplicationInsightsTelemetry(... 仅当不是开发环境时。
      【解决方案8】:

      我决定同时使用这两种方法。我已将InstrumentationKey 移动到Web.config,它将被Web.Release.configWeb.Debug.config 的转换所取代。 (不要忘记将其从ApplicationInsights.config 文件中删除)。然后我从Application_Start()调用了这个方法

      public static void RegisterTelemetryInstrumentationKey()
      {
          if (string.IsNullOrWhiteSpace(WebConfigurationManager.AppSettings["TelemetryInstrumentationKey"])
          {
              TelemetryConfiguration.Active.DisableTelemetry = true;
          }
          else
          {
              TelemetryConfiguration.Active.InstrumentationKey = AppSettings.TelemetryInstrumentationKey;
          }
      }
      

      【讨论】:

      • 今天已经过时了,我们今天如何正确地做到这一点?
      【解决方案9】:

      Microsoft.ApplicationInsights.AspNetCore 2.1 版

      services.AddApplicationInsightsTelemetry(options =>
      {
          options.EnableDebugLogger = false;
      });
      

      【讨论】:

      • 这是否应该隐藏 Visual Studio 调试面板中的 Application Insights Telemetry (unconfigured) 消息 - 因为如果是这样,它似乎不起作用:-(
      • 我不确定那种信息是什么。我相信您正在寻找 TelemetryDebugWriter.IsTracingDisabled = true; 来删除那些。
      【解决方案10】:

      在 ASP.NET Core 应用程序中,您可以将以下内容添加到 Startus.cs 以关闭开发环境中的 Application Insights:

      if (env.IsDevelopment()) {
          TelemetryConfiguration.Active.DisableTelemetry = true;
      }
      

      builder.AddApplicationInsightsSettings(); 命令之后将其添加到构造函数中,您将不会再看到 AI 日志堵塞您的调试控制台。

      【讨论】:

      • 不...对我没有任何影响(使用 ASP.Net Core 2.1)。在“输出”窗口中仍然会收到大量“Application Insights Telemetry”消息。
      【解决方案11】:

      其他一些解决方案略有不同。把它放在你的 global.asax 中:

      Microsoft.ApplicationInsights.Extensibility.Implementation.TelemetryDebugWriter.IsTracingDisabled = Debugger.IsAttached;
      

      在调试器下运行时会关闭应用洞察调试输出,但在 Ctrl+F5 场景下允许它和调试版本发布到测试服务器

      【讨论】:

        【解决方案12】:

        我们发现阻止它跟踪到调试日志的最简单方法很简单:

        Extensibility.Implementation.TelemetryDebugWriter.IsTracingDisabled = True
        

        【讨论】:

          【解决方案13】:

          如问题中所述,不部署或部署 ApplicationInsights.config 而不会生成&lt;instrumentationkey&gt;key&lt;/instrumentationkey&gt; 阻止事件。 然后,您可以将检测密钥放入代码中(仅在我的情况下发布)

          #if !DEBUG
              Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration.Active.InstrumentationKey = "instrumentation key";
          #endif
          

          在此调用之后创建的每个TelemetryClient 都将具有正确的密钥并跟踪事件,因此您不必在所有地方更改代码。 不调用上述方法或将参数留空将阻塞事件,因为没有配置键。

          基本上ApplicationInsights.config 文件会覆盖任何设置检测密钥的代码,删除其中的&lt;instrumentationkey&gt;key&lt;/instrumentationkey&gt; 将允许您使用代码来配置密钥。 如果您完全删除该文件,它将不起作用。

          这是确认: “如果你想动态设置密钥——例如,如果你想将结果从应用程序发送到不同的资源——你可以从配置文件中省略密钥,而是在代码中设置它。”

          参考:https://azure.microsoft.com/en-us/documentation/articles/app-insights-configuration-with-applicationinsights-config/#_instrumentationkey

          【讨论】:

          • 请参阅this blog 如何将其与单独的ApplicationInsights.Debug/Release.config 一起使用
          【解决方案14】:

          作为其他解决方案的补充,我建议将以下内容添加到Global.asax

          protected void Application_Start()
          {    
              DisableApplicationInsightsOnDebug();
              // do the other stuff
          }
          
          /// <summary>
          /// Disables the application insights locally.
          /// </summary>
          [Conditional("DEBUG")]
          private static void DisableApplicationInsightsOnDebug()
          {
              TelemetryConfiguration.Active.DisableTelemetry = true;
          }
          

          这样做的好处是,它不需要更改配置,并且与 ReSharper 等工具配合使用效果更好,比 #-directives 更能理解它。

          【讨论】:

          • 我们通常将 DEBUG 配置部署到 staging 并将 RELEASE 配置部署到生产。它们都可以启用 OWN 遥测。因此,您的更改将禁用暂存环境的遥测。
          • @Sergey 我建议定义一个配置并在那里定义一个 STAGING 变量。因此,您可以更好地区分本地调试。另一种选择是定义一个新符号 LOCAL 并在 Conditional-attribute 中替换它。
          • 通常我们有不同的数据库连接字符串、存储帐户和 STAG 和 PROD 的其他设置(如 FB 应用程序 ID、SendGrid 帐户、应用程序设置等)。此外,我们在本地拥有 Azure 存储模拟器和本地 SQL Express。所以没有办法使用单一配置。我们需要 3 种不同的配置,并且本地配置应该禁用遥测。
          • 您仍然可以在多个配置上定义自定义符号。然后,您可以使用 Conditional("WHATEVER"),而不是使用 Conditional("DEBUG")。或者,您可以从 appSettings 中获取一个值,并使用转换在非本地环境中将其吹走。
          • TelemetryConfiguration 未定义。
          【解决方案15】:

          我也遇到了同样的问题。

          我们想控制 web.config 中的设置,因此在我们的应用设置中添加了 DisableAITelemetry 键:

            <appSettings>
              <add key="DisableAITelemetry" value="true" />
            </appSettings>
          

          在实时和演示版本中,我们不会包含值(因此它默认为 false)。

          然后我们可以通过添加这个来解决它:

          bool disable;
          string disableAiTelemetry = ConfigurationManager.AppSettings["DisableAITelemetry"];
          bool.TryParse(disableAiTelemetry, out disable);
          TelemetryConfiguration.Active.DisableTelemetry = disable;
          

          【讨论】:

            【解决方案16】:

            你可以尝试使用TelemetryConfiguration.DisableTelemetry属性 像这样的..

            #if DEBUG
                        TelemetryConfiguration.Active.DisableTelemetry = true;
            #endif
            

            【讨论】:

            • 我尝试在 WindowsAppInitializer.InitializeAsync(); 之前添加此语句(我也尝试过),但 Visual Studio 应用程序洞察事件计数器增加了。由于会话和用户太多,我无法查看此会话是否有效地记录在 azure 门户中。我晚上试试。
            • Alberto,我这样测试过 - 'code' public seal partial class MainPage : Page { TelemetryClient telemetry;公共 MainPage() { this.InitializeComponent(); #if DEBUG TelemetryConfiguration.Active.DisableTelemetry = true; #endif 遥测 = 新 TelemetryClient(); } private void button_Click(object sender, RoutedEventArgs e) { telemetry.TrackEvent("Event Custom"); '代码' .. 并且似乎正在工作。我也会尝试其他一些页面。会及时更新
            • 另外,您可以从 Visual Studio 本身检查遥测事件是否已发送。我昨天刚刚发布了这个How to get number of Application Insights events from Visual Studio 2015
            • 这就是我写的,视觉工作室事件计数器增加了。
            • 即使 DisableTelemetry 设置为 true 且检测密钥为空,遥测模块仍将继续收集数据。数据不会被发送,但会被收集。请参阅针对 App Insights 记录的此问题:github.com/Microsoft/ApplicationInsights-dotnet/issues/397 如果要禁用首次输出,可以按照 github.com/Microsoft/ApplicationInsights-dotnet/issues/310 中的步骤操作
            猜你喜欢
            • 2016-09-17
            • 1970-01-01
            • 2020-08-26
            • 1970-01-01
            • 1970-01-01
            • 2020-11-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多