Application Insights para aplicativos do console .NET

Aviso

Use o pacote Microsoft.ApplicationInsights.WorkerService e as instruções associadas do Application Insights para aplicativos do Serviço de Trabalho (aplicativos não HTTP) para aplicativos de console. Ele é compatível com versões lts de suporte de longo prazo do .NET Core e .NET Framework ou superior.

O Application Insights permite que você monitore seu aplicativo Web quanto à disponibilidade, desempenho e uso.

Introdução

  • No portal do Azure, crie um recurso do Application Insights.

  • Faça uma cópia da cadeia de conexão. Localize a cadeia de conexão no menu suspenso Informações básicas do recurso que você criou.

  • Instale o pacote Microsoft.ApplicationInsights mais recente.

  • Configure a cadeia de conexão no seu código antes de acompanhar qualquer telemetria (ou configure a variável de ambiente APPLICATIONINSIGHTS_CONNECTION_STRING). Depois disso, você deve ser capaz de acompanhar a telemetria manualmente e vê-la no portal do Azure.

    // You may use different options to create configuration as shown later in this article
    TelemetryConfiguration configuration = TelemetryConfiguration.CreateDefault();
    configuration.ConnectionString = <Copy connection string from Application Insights Resource Overview>;
    var telemetryClient = new TelemetryClient(configuration);
    telemetryClient.TrackTrace("Hello World!");
    

    Observação

    A telemetria não é enviada instantaneamente. Os itens são agrupados e enviados pelo SDK do Application Insights. Os aplicativos de console são encerrados após chamar os métodos Track().

    A telemetria pode não ser enviada a menos que Flush() e Sleep/Delay sejam feitos antes que o aplicativo seja encerrado, conforme mostrado no exemplo completo posteriormente neste artigo. Sleep não é necessário se você estiver usando InMemoryChannel.

  • Instale a versão mais recente do pacote Microsoft.ApplicationInsights.DependencyCollector. Ele acompanha automaticamente o HTTP, SQL ou algumas outras chamadas de dependência externa.

Você pode inicializar e configurar o Application Insights pelo código ou usando o arquivo ApplicationInsights.config. Verifique se a inicialização ocorre o mais cedo possível.

Observação

O ApplicationInsights.config não é compatível com aplicativos .NET Core.

Usar o arquivo de configuração

Para aplicativos baseados em .NET Framework, por padrão, o SDK do Application Insights procura pelo arquivo ApplicationInsights.config no diretório de trabalho quando TelemetryConfiguration está sendo criado. Não há suporte para a leitura do arquivo de configuração no .NET Core.

TelemetryConfiguration config = TelemetryConfiguration.Active; // Reads ApplicationInsights.config file if present

Você também pode especificar um caminho para o arquivo de configuração:

using System.IO;
TelemetryConfiguration configuration = TelemetryConfiguration.CreateFromConfiguration(File.ReadAllText("C:\\ApplicationInsights.config"));
var telemetryClient = new TelemetryClient(configuration);

Você pode obter um exemplo completo do arquivo de configuração ao instalar a versão mais recente do pacote Microsoft.ApplicationInsights.WindowsServer. Veja aqui a configuração mínima para a coleção de dependência que é equivalente ao exemplo de código:

<?xml version="1.0" encoding="utf-8"?>
<ApplicationInsights xmlns="http://schemas.microsoft.com/ApplicationInsights/2013/Settings">
  <ConnectionString>"Copy connection string from Application Insights Resource Overview"</ConnectionString>
  <TelemetryInitializers>
    <Add Type="Microsoft.ApplicationInsights.DependencyCollector.HttpDependenciesParsingTelemetryInitializer, Microsoft.AI.DependencyCollector"/>
  </TelemetryInitializers>
  <TelemetryModules>
    <Add Type="Microsoft.ApplicationInsights.DependencyCollector.DependencyTrackingTelemetryModule, Microsoft.AI.DependencyCollector">
      <ExcludeComponentCorrelationHttpHeadersOnDomains>
        <Add>core.windows.net</Add>
        <Add>core.chinacloudapi.cn</Add>
        <Add>core.cloudapi.de</Add>
        <Add>core.usgovcloudapi.net</Add>
        <Add>localhost</Add>
        <Add>127.0.0.1</Add>
      </ExcludeComponentCorrelationHttpHeadersOnDomains>
      <IncludeDiagnosticSourceActivities>
        <Add>Microsoft.Azure.ServiceBus</Add>
        <Add>Microsoft.Azure.EventHubs</Add>
      </IncludeDiagnosticSourceActivities>
    </Add>
  </TelemetryModules>
  <TelemetryChannel Type="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel.ServerTelemetryChannel, Microsoft.AI.ServerTelemetryChannel"/>
</ApplicationInsights>

Configurar a coleta de telemetria do código

Observação

Não há suporte para a leitura do arquivo de configuração no .NET Core.

  • Durante a inicialização do aplicativo, crie e configure uma instância DependencyTrackingTelemetryModule. Ela deve ser singleton e deve ser preservada pelo tempo de vida do aplicativo.

    var module = new DependencyTrackingTelemetryModule();
    
    // prevent Correlation Id to be sent to certain endpoints. You may add other domains as needed.
    module.ExcludeComponentCorrelationHttpHeadersOnDomains.Add("core.windows.net");
    //...
    
    // enable known dependency tracking, note that in future versions, we will extend this list. 
    // please check default settings in https://github.com/Microsoft/ApplicationInsights-dotnet-server/blob/develop/Src/DependencyCollector/DependencyCollector/ApplicationInsights.config.install.xdt
    
    module.IncludeDiagnosticSourceActivities.Add("Microsoft.Azure.ServiceBus");
    module.IncludeDiagnosticSourceActivities.Add("Microsoft.Azure.EventHubs");
    //....
    
    // initialize the module
    module.Initialize(configuration);
    
  • Adicionar inicializadores de telemetria comuns:

    // ensures proper DependencyTelemetry.Type is set for Azure RESTful API calls
    configuration.TelemetryInitializers.Add(new HttpDependenciesParsingTelemetryInitializer());
    

    Se você criou a configuração com um construtor TelemetryConfiguration() sem formatação, será necessário também habilitar o suporte de correlação. Isso não será necessário se você leu a configuração de um arquivo ou usou TelemetryConfiguration.CreateDefault() ou TelemetryConfiguration.Active.

    configuration.TelemetryInitializers.Add(new OperationCorrelationTelemetryInitializer());
    
  • Você também pode instalar e inicializar o módulo de coletor do Contador de Desempenho conforme descrito neste site.

Exemplo completo

using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.DependencyCollector;
using Microsoft.ApplicationInsights.Extensibility;
using System.Net.Http;
using System.Threading.Tasks;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            TelemetryConfiguration configuration = TelemetryConfiguration.CreateDefault();

            configuration.ConnectionString = "removed";
            configuration.TelemetryInitializers.Add(new HttpDependenciesParsingTelemetryInitializer());

            var telemetryClient = new TelemetryClient(configuration);
            using (InitializeDependencyTracking(configuration))
            {
                // run app...

                telemetryClient.TrackTrace("Hello World!");

                using (var httpClient = new HttpClient())
                {
                    // Http dependency is automatically tracked!
                    httpClient.GetAsync("https://microsoft.com").Wait();
                }

            }

            // before exit, flush the remaining data
            telemetryClient.Flush();

            // Console apps should use the WorkerService package.
            // This uses ServerTelemetryChannel which does not have synchronous flushing.
            // For this reason we add a short 5s delay in this sample.
            
            Task.Delay(5000).Wait();

            // If you're using InMemoryChannel, Flush() is synchronous and the short delay is not required.

        }

        static DependencyTrackingTelemetryModule InitializeDependencyTracking(TelemetryConfiguration configuration)
        {
            var module = new DependencyTrackingTelemetryModule();

            // prevent Correlation Id to be sent to certain endpoints. You may add other domains as needed.
            module.ExcludeComponentCorrelationHttpHeadersOnDomains.Add("core.windows.net");
            module.ExcludeComponentCorrelationHttpHeadersOnDomains.Add("core.chinacloudapi.cn");
            module.ExcludeComponentCorrelationHttpHeadersOnDomains.Add("core.cloudapi.de");
            module.ExcludeComponentCorrelationHttpHeadersOnDomains.Add("core.usgovcloudapi.net");
            module.ExcludeComponentCorrelationHttpHeadersOnDomains.Add("localhost");
            module.ExcludeComponentCorrelationHttpHeadersOnDomains.Add("127.0.0.1");

            // enable known dependency tracking, note that in future versions, we will extend this list. 
            // please check default settings in https://github.com/microsoft/ApplicationInsights-dotnet-server/blob/develop/WEB/Src/DependencyCollector/DependencyCollector/ApplicationInsights.config.install.xdt

            module.IncludeDiagnosticSourceActivities.Add("Microsoft.Azure.ServiceBus");
            module.IncludeDiagnosticSourceActivities.Add("Microsoft.Azure.EventHubs");

            // initialize the module
            module.Initialize(configuration);

            return module;
        }
    }
}