Application Insights - ILogger + Data Sampling

Application Insights - ILogger + Data Sampling

Ola pessoALL,

Há um tempo escrevi um post sobre como redirecionar o log padrão do asp.net core para o Application Insights. Se voce não leu, leia aqui

Hoje irei fazer uma pequena atualização naquela configuração e mostrar como podemos desabilitar o sampling que eh automático em projetos asp.net core.
Para saber em detalhes sobre o sampling consulte a documentação

Em resumo, o sampling é muito bom para evitar que ultrapassemos o limite gratuito do Application Insights (até essa data são 5GB/mês) mas em alguns casos é interessante desabilitar para não perder logs importantes. (Por padrão a retenção do AI são 3 meses)

No meu caso armazeno logs de uma api que faz interface com gateways de pagamento e o AI é a parada número 1 quando algo de erro acontece e precisamos investigar mais a fundo, mas devido ao sampling recentemente aconteceu de uma requisição importante não aparecer nos logs.

Habilitando o redirecionamento do ILogger

Para redirecionarmos todos os logs da aplicação de uma maneira simples, basta atualizarmos o método CreateWebHostBuilder na classe Program.cs

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .ConfigureLogging(logging => {
                    logging.AddApplicationInsights();
                    logging.AddFilter<ApplicationInsightsLoggerProvider>("", LogLevel.Information);
                });

Desabilitando Data Sampling

Para desabilitar o data sampling do Application Insights altere o método ConfigureServices:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddApplicationInsightsTelemetry(opts =>
            {
                // On the payments API we don't want to sample requests, since we need all the logs available
                opts.EnableAdaptiveSampling = false;
                // Disable heartbeat
                opts.EnableHeartbeat = false;
                // Reads the key from env variables or local configuration, defaults to testing app insithgs on azure.
                opts.InstrumentationKey = Configuration.GetValue("APPINSIGHTS_INSTRUMENTATIONKEY", "");
            });
        }

(opcional) Habilitando log de parâmetros do EF

Um dos benefícios de redirecionar os logs do asp.net core é que podemos ver as queries executadas no banco e o tempo de cada uma, que auxilia bastante na melhora da performance.
Em alguns casos precisamos ter o valor dos parâmetros de fácil acesso para simular a query e ajudar o DBA com o tunning. O que vou mostrar a seguir não é recomendável em produção. Use por sua conta e risco.

services.AddDbContext<DataContext>(opts =>
            {
                opts.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),
                    providerOptions => providerOptions.EnableRetryOnFailure());
                // Habilita o log do valor dos parâmetros.
                opts.EnableSensitiveDataLogging();
            });

Conclusão

Espero ter ajudado vocês a ter mais informações sobre a execução da aplicação. Desabilite o data sampling em casos específicos e sempre fique atento aos custos do Application Insights.

[]s e até a próxima!