如何在使用调试配置时自动禁用应用程序洞察力并仅在发布时启用它?
是否可以在不创建另一个仅用于调试的检测密钥的情况下执行此操作?
我有 trackevent
语句分散在整个代码中,将它们包含在调试预处理器检查中并不是一个理想的解决方案。
我当前的解决方案是将 ApplicationInsights.config
文件的 Build Action
设置为 None
,这样它就不会被复制到项目的输出目录中,但这不是一个可以根据活动构建配置自动执行的过程。
有一个开发者模式,但需要手动更改(如果可以有条件地设置配置文件,清空instrumentationkey也解决了问题)。请参阅http://apmtips.com/blog/2015/02/02/developer-mode/
您可以尝试像这样使用 TelemetryConfiguration.DisableTelemetry 属性的东西..
#if DEBUG
TelemetryConfiguration.Active.DisableTelemetry = true;
#endif
作为其他解决方案的补充,我建议将以下内容添加到 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 等一些工具配合使用效果更好,这些工具比 #
指令更能理解它。
Conditional
属性中替换它。
TelemetryConfiguration
未定义。
对于 ASP.NET Core 项目,默认情况下 App Insights 处于打开状态,这实际上将大量信息记录到调试窗口中。
要禁用它,请转到“工具--> 选项--> 项目和解决方案--> Web 项目”并选中“禁用 Asp.Net Core Web 项目的本地 Application Insights”。
下面是禁用本地应用洞察的图像。
https://i.stack.imgur.com/QH8T3.png
有关该问题的更多信息,您可以查看官方 github 问题 here
使用 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 核心中没有被弃用并且效果很好。只是省略另一行。
如问题中所述,不部署或部署 ApplicationInsights.config 而不会生成 <instrumentationkey>key</instrumentationkey>
阻止事件。然后,您可以将检测密钥放入代码中(仅在我的情况下发布)
#if !DEBUG
Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration.Active.InstrumentationKey = "instrumentation key";
#endif
在此调用之后创建的每个 TelemetryClient
都将具有正确的键并跟踪事件,因此您不必在所有地方更改代码。不调用上述方法或将参数留空将阻止事件,因为没有配置键。
基本上,ApplicationInsights.config
文件会覆盖任何设置检测密钥的代码,删除其中的 <instrumentationkey>key</instrumentationkey>
将允许您使用代码来配置密钥。 如果您完全删除该文件,它将不起作用。
这是确认:“如果您想动态设置密钥 - 例如,如果您想将结果从应用程序发送到不同的资源 - 您可以从配置文件中省略密钥,并在代码中设置它。”
ApplicationInsights.Debug/Release.config
一起使用
我决定使用这两种方法。我已将 InstrumentationKey
移至 Web.config
,它将被 Web.Release.config
或 Web.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;
}
}
从 ASP.NET Core 3.1 开始:
要禁用将任何 App Insights 遥测记录到 Azure:
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
}
}
TelemetryConfiguration
?
我刚遇到同样的问题。
我们想控制 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;
在其他一些解决方案上略有不同。把它放在你的 global.asax 中:
Microsoft.ApplicationInsights.Extensibility.Implementation.TelemetryDebugWriter.IsTracingDisabled = Debugger.IsAttached;
在调试器下运行时,它将关闭应用程序洞察调试输出,但在 Ctrl+F5 场景下允许它,并将调试版本发布到测试服务器
我们发现阻止它跟踪到调试日志的最简单方法很简单:
Extensibility.Implementation.TelemetryDebugWriter.IsTracingDisabled = True
在 ASP.NET Core 应用程序中,您可以将以下内容添加到 Startus.cs 以关闭开发环境中的 Application Insights:
if (env.IsDevelopment()) {
TelemetryConfiguration.Active.DisableTelemetry = true;
}
将此添加到构造函数中,就在 builder.AddApplicationInsightsSettings();
命令之后,您将不会再看到 AI 日志堵塞您的调试控制台。
Microsoft.ApplicationInsights.AspNetCore 版本 2.1
services.AddApplicationInsightsTelemetry(options =>
{
options.EnableDebugLogger = false;
});
Application Insights Telemetry (unconfigured)
消息 - 因为如果是这样,它似乎不起作用:-(
TelemetryDebugWriter.IsTracingDisabled = true;
来删除它们。
上面建议的解决方案已被弃用(参考: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
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
#region Disable Application Insights debug informations
#if DEBUG
TelemetryConfiguration.Active.DisableTelemetry = true;
TelemetryDebugWriter.IsTracingDisabled = true;
#endif
#endregion
//...
}
从 .NET Core 3.1 开始:
var telemetryConfiguration = TelemetryConfiguration.CreateDefault();
telemetryConfiguration.DisableTelemetry = true;
var telemetryClient = new TelemetryClient(telemetryConfiguration); // Use this instance
TelemetryDebugWriter.IsTracingDisabled = true;
我们可以修改“appsetting.json”文件,添加如下属性
"ApplicationInsights": {
"EnableRequestTrackingTelemetryModule": false,
"EnableEventCounterCollectionModule": false,
"EnableDependencyTrackingTelemetryModule": false,
"EnablePerformanceCounterCollectionModule": false,
"EnableDiagnosticsTelemetryModule": false
}
您可以找到更多信息 here。
WindowsAppInitializer.InitializeAsync();
之前添加此语句(我也在它之后尝试过),但 Visual Studio 应用程序洞察事件计数器增加了。由于会话和用户太多,我无法查看此会话是否有效地记录在 azure 门户中。我晚上试试。