Deshabilitar la información de la aplicación en la depuración

99

¿Cómo puedo deshabilitar la información de la aplicación automáticamente cuando utilizo una configuración de depuración y habilitarla solo en el lanzamiento?
¿Es posible hacer esto sin crear otra clave de instrumentación solo para depuración?

Tengo trackeventdeclaraciones esparcidas por todo el código, incluirlas dentro de una verificación de preprocesador de depuración no es una solución ideal.

Mi solución actual es establecer el Build Actiondel ApplicationInsights.configarchivo a Nonefin de que no se copia en el directorio de salida del proyecto, pero esto no es un proceso que puede ser automatizada basada en la configuración de generación activa.

Hay un modo de desarrollador, pero debe cambiarse manualmente (si fue posible configurar condicionalmente el archivo de configuración, vaciar también el problema resuelto de la clave de instrumentación). Ver http://apmtips.com/blog/2015/02/02/developer-mode/

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

Alberto Rivelli
fuente

Respuestas:

69

Puede intentar usar TelemetryConfiguration.DisableTelemetry Property Algo así ...

#if DEBUG
            TelemetryConfiguration.Active.DisableTelemetry = true;
#endif
Abhijit Jana
fuente
Intenté agregar esta declaración justo antes WindowsAppInitializer.InitializeAsync();(también lo intenté después) pero el contador de eventos de información de la aplicación de Visual Studio aumentó. No pude ver si esta sesión se registró efectivamente en el portal azure porque hay demasiadas sesiones y usuarios. Lo intentaré durante la noche.
Alberto Rivelli
Alberto, probé así: 'código' público sellado clase parcial MainPage: Page {TelemetryClient telemetry; Public MainPage () {this.InitializeComponent (); #if DEBUG TelemetryConfiguration.Active.DisableTelemetry = true; #endif telemetry = new TelemetryClient (); } private void button_Click (remitente del objeto, RoutedEventArgs e) {telemetry.TrackEvent ("Evento personalizado"); } 'código' .. y parece estar funcionando. Probaré otras páginas también. te mantendrá actualizado
Abhijit Jana
Además, desde el propio Visual Studio, puede comprobar si los eventos de telemetría se envían o no. Acabo de publicar este ayer Cómo obtener el número de eventos de Application Insights de Visual Studio 2015
Abhijit Jana
Eso es lo que escribí, el contador de eventos de Visual Studio aumentó.
Alberto Rivelli
2
Incluso con DisableTelemetry configurado en verdadero y una clave de instrumentación vacía, los módulos de telemetría seguirán recopilando datos. Los datos no se enviarán, pero se recopilarán. Vea este problema registrado en App Insights: github.com/Microsoft/ApplicationInsights-dotnet/issues/397 Si desea deshabilitar la salida de debut, puede seguir los pasos que se encuentran en github.com/Microsoft/ApplicationInsights-dotnet/issues/310
Guillaume LaHaye
61

Como una adición a las otras soluciones, sugeriría agregar lo siguiente, digamos a 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;
}

La ventaja de esto es que no necesita cambios en las configuraciones y funciona mejor con algunas herramientas como ReSharper, que lo entenderán mejor que las #directivas.

Alexander Schmidt
fuente
1
Por lo general, implementamos la configuración DEBUG en la etapa de preparación y la configuración RELEASE en la producción. Ambos pueden tener habilitada la telemetría PROPIA. Entonces, su cambio deshabilitará la telemetría para el entorno de ensayo.
Sergey G.
1
@Sergey Sugeriría definir una configuración única y definir una variable STAGING allí. Por lo tanto, puede distinguir mejor entre depurar localmente. Otra opción sería definir un nuevo símbolo LOCAL y reemplazarlo en el Conditionalatributo.
Alexander Schmidt
Por lo general, tenemos diferentes cadenas de conexión de base de datos, cuentas de almacenamiento y otras configuraciones para STAG y PROD (como la identificación de la aplicación FB, la cuenta SendGrid, la configuración de la aplicación, etc.). Además, a nivel local tenemos el emulador de almacenamiento de Azure y SQL Express local. Por tanto, no hay forma de trabajar con una única configuración. Necesitamos 3 configuraciones diferentes y la local debe tener la telemetría deshabilitada.
Sergey G.
Aún puede definir un símbolo personalizado en más de una de sus configuraciones. Entonces, en lugar de usar Conditional ("DEBUG"), podría hacer Conditional ("WHATEVER"). Alternativamente, puede tomar un valor de appSettings y usar transformaciones para eliminarlo en entornos no locales.
joelmdev
34

Para los proyectos de ASP.NET Core, App Insights está ACTIVADO de forma predeterminada, lo que en realidad registra una tonelada de información en la ventana de depuración.

Para deshabilitarlo, vaya a "HERRAMIENTAS -> Opciones -> Proyectos y soluciones -> Proyectos web" y marque "Deshabilitar información de aplicaciones locales para proyectos web Asp.Net Core".

A continuación se muestra la imagen para deshabilitar la información de la aplicación local.

Imagen

Para obtener más información sobre el problema, puede ver el problema oficial de github aquí.

Siva Chamarthi
fuente
22

Como se explica en la pregunta, no implementar o implementar un ApplicationInsights.config sin <instrumentationkey>key</instrumentationkey>bloquear la generación de eventos. Luego puede poner la clave de instrumentación en el código (solo en el lanzamiento en mi caso)

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

Todos los TelemetryClientcreados después de esta llamada tendrán la clave correcta y realizarán un seguimiento de los eventos para que no tenga que cambiar el código en todos los lugares. No llamar al método anterior o dejar el parámetro vacío bloqueará los eventos porque no hay una clave configurada.

Básicamente, el ApplicationInsights.configarchivo anula cualquier código que establezca la clave de instrumentación, eliminar el <instrumentationkey>key</instrumentationkey>interior le permitirá usar el código para configurar la clave. Si elimina el archivo por completo, no funciona.

Aquí está la confirmación: "Si desea establecer la clave de forma dinámica, por ejemplo, si desea enviar resultados desde su aplicación a diferentes recursos, puede omitir la clave del archivo de configuración y configurarla en el código".

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

Alberto Rivelli
fuente
1
Vea este blog sobre cómo usar esto con una versión separadaApplicationInsights.Debug/Release.config
Yahoo Serious
16

He decidido utilizar ambos enfoques. He movido el InstrumentationKeya Web.configy será reemplazado por la transformación de Web.Release.configo Web.Debug.config. (no olvide eliminarlo del ApplicationInsights.configarchivo). Entonces he llamado a este método desde elApplication_Start()

public static void RegisterTelemetryInstrumentationKey()
{
    if (string.IsNullOrWhiteSpace(WebConfigurationManager.AppSettings["TelemetryInstrumentationKey"])
    {
        TelemetryConfiguration.Active.DisableTelemetry = true;
    }
    else
    {
        TelemetryConfiguration.Active.InstrumentationKey = AppSettings.TelemetryInstrumentationKey;
    }
}
Sergey G.
fuente
esto es obsoleto hoy, ¿cómo lo hacemos hoy correctamente?
l --''''''--------- '' '' '' '' '' ''
15

Al ejecutar una aplicación web ASP.NET Core 2.1 con Visual Studio 2017 (15.9.2), la opción "Deshabilitar información de aplicación local para proyectos web Asp.Net Core" no borró el resultado en mi ventana de depuración.

Sin embargo, agregar lo siguiente a Configure () en Startup.cs hizo el trabajo;

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

Tenga en cuenta que IsTracingDisabled fue la solución clave , ¡pero lo dejé en DisableTelemetry por si acaso! Además, tener ambas líneas una al lado de la otra es útil cuando se buscan referencias similares entre proyectos de .NET Framework y .NET Core en la misma solución.

alv
fuente
2
esto es obsoleto hoy, ¿cómo lo hacemos hoy correctamente?
l --''''''--------- '' '' '' '' '' ''
11

Acabo de tener el mismo problema.

Queríamos controlar la configuración en web.config, por lo que agregamos una clave DisableAITelemetry dentro de la configuración de nuestra aplicación:

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

Con las compilaciones en vivo y de demostración, no incluiremos un valor (por lo que el valor predeterminado es falso).

Luego podríamos resolverlo agregando esto:

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

Juego ligeramente diferente en algunas de las otras soluciones. Pon esto en tu global.asax:

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

Desactivará la salida de depuración de la información de la aplicación cuando se ejecute en el depurador, pero lo permitirá en escenarios de Ctrl + F5 y depurará las compilaciones publicadas en los servidores de prueba.

Josh
fuente
10

En una aplicación ASP.NET Core, puede agregar lo siguiente a Startus.cs para desactivar Application Insights en el entorno de desarrollo:

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

Agregue esto al constructor, justo después del builder.AddApplicationInsightsSettings();comando y ya no verá registros de IA obstruyendo su consola de depuración.

saludar
fuente
No ... no hizo ninguna diferencia para mí (con ASP.Net Core 2.1). Sigue recibiendo una montaña de mensajes de "Telemetría de Application Insights" en la ventana Salida.
Mike Gledhill
7

Hemos encontrado que la forma más sencilla de evitar que se rastree en el registro de depuración es tan simple como:

Extensibility.Implementation.TelemetryDebugWriter.IsTracingDisabled = True
Peter Jarrett
fuente
5

Microsoft.ApplicationInsights.AspNetCore Versión 2.1

services.AddApplicationInsightsTelemetry(options =>
{
    options.EnableDebugLogger = false;
});
JJS
fuente
¿Se supone que esto oculta los Application Insights Telemetry (unconfigured)mensajes del panel de depuración en Visual Studio, porque si es así no parece funcionar :-(
Simon_Weaver
3
No estoy seguro de cuál es ese tipo de mensaje. Creo que estás buscando TelemetryDebugWriter.IsTracingDisabled = true;eliminarlos.
JJS
3
         public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            #region Disable Application Insights debug informations
#if DEBUG
            TelemetryConfiguration.Active.DisableTelemetry = true;
            TelemetryDebugWriter.IsTracingDisabled = true;
#endif
            #endregion
//...
}
SZL
fuente
1
esto es obsoleto hoy, ¿cómo lo hacemos hoy correctamente?
l --''''''--------- '' '' '' '' '' ''
0

Desde .NET Core 3.1:

var telemetryConfiguration = TelemetryConfiguration.CreateDefault();
telemetryConfiguration.DisableTelemetry = true;

var telemetryClient = new TelemetryClient(telemetryConfiguration);   // Use this instance
TelemetryDebugWriter.IsTracingDisabled = true;
fuego de seda
fuente
1
Aquí están los documentos para hacer esto, incluida la obtención de TelemetryConfiguration a través de la inyección de dependencia: docs.microsoft.com/en-us/azure/azure-monitor/app/…
Noah Stahl
0

A partir de ASP.NET Core 3.1:

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

(lo anterior se puede llamar desde cualquier lugar, pero cuanto antes en el ciclo de vida de su aplicación, mejor).

Ambos se pueden usar juntos para suprimir toda la actividad de Application Insights en su código. Me #if DEBUGguardo con una directiva para asegurarme de que AppInsights no haga nada en mi máquina local, pero sí emite eventos cuando se carga en nuestro servidor de desarrollo de Azure:

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

        TelemetryDebugWriter.IsTracingDisabled = true;
#endif
    }
}
Ian Kemp
fuente