Início rápido de código: Capturando diagnósticos no seu aplicativo do Windows Azure
Atualizado: novembro de 2011
As etapas a seguir descrevem como capturar diagnóstico no aplicativos do Windows Azure. Antes de continuar, verifique se você atende aos pré-requisitos listados em Início rápido de código do Windows Azure. Este exemplo também supõe que você esteja familiarizado com o desenvolvimento de aplicativos básicos no Windows Azure e com algumas ferramentas do Azure, como discutido em Início rápido de código: Criar e implantar um aplicativo ASP.NET no Windows Azure.
O Windows Azure fornece recursos que permitem diagnosticar dados, como contadores de desempenho, logs de eventos e logs do IIS. (Para obter uma lista mais abrangente das fontes de dados que podem ser usadas no Windows Azure, consulte Initializing and Configuring Diagnostic Data Sources.)
O processo de implementação de diagnóstico no aplicativo requer o seguinte:
-
Importar o módulo Diagnóstico para a definição de serviço.
-
Especificar a cadeia de conexão de diagnóstico para usar no aplicativo.
-
Definir as configurações que determinam os dados que serão monitorados, o intervalo de transferência para a conta de armazenamento e o tamanho máximo do buffer de arquivo alocado para o buffer de dados.
Este exemplo mostra como capturar contadores de desempenho. Uma técnica similar seria usada para outros tipos de fontes de dados que podem ser capturados pelo diagnóstico do Windows Azure.
-
Importe o módulo Diagnóstico para o serviço. O arquivo de definição de serviço em nuvem (por exemplo, ServiceDefinition.csdef) permite especificar um módulo de importação com o uso de um elemento
<Import>(que é filho do elemento<Imports>). Inclua o módulo Diagnóstico para cada função cujo diagnóstico você deseja capturar. Você pode importar o módulo Diagnóstico para funções Web ou de trabalho. A seguir é mostrado como isso seria feito para um aplicativo que contém uma WebRole (consulte os elementos<Imports>e<Import>).<?xml version="1.0" encoding="utf-8"?> <ServiceDefinition name="MyAzureApplication" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"> <WebRole name="WebRole1"> <Sites> <Site name="Web"> <Bindings> <Binding name="Endpoint1" endpointName="Endpoint1" /> </Bindings> </Site> </Sites> <Endpoints> <InputEndpoint name="Endpoint1" protocol="http" port="80" /> </Endpoints> <Imports> <Import moduleName="Diagnostics" /> </Imports> </WebRole> </ServiceDefinition>
-
Especifique a cadeia de conexão de diagnóstico para usar no aplicativo. A cadeia de conexão de diagnóstico informa o Windows Azure sobre a conta de armazenamento que será usada para armazenar as informações de diagnóstico capturadas. A cadeia de conexão de diagnóstico é determinada com base na definição
Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionStringno arquivo de configuração de serviço (por exemplo, ServiceConfiguration.Cloud.cscfg ou ServiceConfiguration.Local.cscfg). Para a primeira parte deste exemplo, usaremos a conta de armazenamento de desenvolvimento local. Para especificar a conta de armazenamento de desenvolvimento local, o valor deMicrosoft.WindowsAzure.Plugins.Diagnostics.ConnectionStringseriaUseDevelopmentStorage=true. Isso é mostrado no seguinte exemplo (consulte o elemento<Setting>):<?xml version="1.0" encoding="utf-8"?> <ServiceConfiguration serviceName="MyAzureApplication" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="1" osVersion="*"> <Role name="WebRole1"> <Instances count="1" /> <ConfigurationSettings> <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="UseDevelopmentStorage=true" /> </ConfigurationSettings> </Role> </ServiceConfiguration>
-
Especifique qualquer definição de configuração personalizada que você gostaria de incluir na captura de diagnóstico. Este processo envolve a criação de um objeto da classe de configuração de diagnóstico apropriado e a definição dos valores desejados. Por exemplo, para especificar as definições de configuração do contador de desempenho, use a classe PerformanceCountersBufferConfiguration . Essa classe, que herda as propriedades BufferQuotaInMB e ScheduledTransferPeriod da classe DiagnosticDataBufferConfiguration, informa o módulo Diagnóstico do Windows Azure sobre os dados do contador de desempenho que devem ser capturados, juntamente com outras definições associadas à captura de dados. Por exemplo, as propriedades BufferQuotaInMB, DataSources e ScheduledTransferPeriod representam, respectivamente, o tamanho máximo do buffer de arquivo, as fontes de dados para os contadores de desempenho que estão sendo monitorados e o intervalo entre as transferências do buffer de dados.
Quando o aplicativo é iniciado, um conjunto padrão de configurações é criado. É possível modificar as configurações padrão, como mostrado no método
OnStart()do exemplo a seguir. (A implementaçãoOnStartinclui uma função auxiliar,ShowConfig, que simplesmente mostra os valores de configuração antes e depois da personalização.)using System; using System.Collections.Generic; using System.Linq; using Microsoft.WindowsAzure; using Microsoft.WindowsAzure.Diagnostics; using Microsoft.WindowsAzure.ServiceRuntime; using System.Diagnostics; // For Trace namespace WebRole1 { public class WebRole : RoleEntryPoint { public override bool OnStart() { try { // For information on handling configuration changes // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357. DiagnosticMonitorConfiguration config = DiagnosticMonitor.GetDefaultInitialConfiguration(); // Display information about the default configuration. ShowConfig(config); // Add in configuration settings for several performance counters. config.PerformanceCounters.ScheduledTransferPeriod = TimeSpan.FromMinutes(2D); config.PerformanceCounters.BufferQuotaInMB = 10; // Use 30 seconds for the perf counter sample rate. TimeSpan perfSampleRate = TimeSpan.FromSeconds(30D); config.PerformanceCounters.DataSources.Add(new PerformanceCounterConfiguration() { CounterSpecifier = @"\Memory\Available Bytes", SampleRate = perfSampleRate }); config.PerformanceCounters.DataSources.Add(new PerformanceCounterConfiguration() { CounterSpecifier = @"\Processor(_Total)\% Processor Time", SampleRate = perfSampleRate }); config.PerformanceCounters.DataSources.Add(new PerformanceCounterConfiguration() { CounterSpecifier = @"\ASP.NET\Applications Running", SampleRate = perfSampleRate }); // Display information about the changed configuration. ShowConfig(config); // Apply the updated configuration to the diagnostic monitor. // The first parameter is for the connection string configuration setting. DiagnosticMonitor.Start("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString", config); } catch (Exception e) { Trace.WriteLine("Exception during WebRole1.OnStart: " + e.ToString()); // Take other action as needed. } return base.OnStart(); } private void ShowConfig(DiagnosticMonitorConfiguration config) { try { if (null == config) { Trace.WriteLine("Null configuration passed to ShowConfig"); return; } // Display the general settings of the configuration Trace.WriteLine("*** General configuration settings ***"); Trace.WriteLine("Config change poll interval: " + config.ConfigurationChangePollInterval.ToString()); Trace.WriteLine("Overall quota in MB: " + config.OverallQuotaInMB); // Display the diagnostic infrastructure logs Trace.WriteLine("*** Diagnostic infrastructure settings ***"); Trace.WriteLine("DiagnosticInfrastructureLogs buffer quota in MB: " + config.DiagnosticInfrastructureLogs.BufferQuotaInMB); Trace.WriteLine("DiagnosticInfrastructureLogs scheduled transfer log filter: " + config.DiagnosticInfrastructureLogs.ScheduledTransferLogLevelFilter); Trace.WriteLine("DiagnosticInfrastructureLogs transfer period: " + config.DiagnosticInfrastructureLogs.ScheduledTransferPeriod.ToString()); // List the Logs info Trace.WriteLine("*** Logs configuration settings ***"); Trace.WriteLine("Logs buffer quota in MB: " + config.Logs.BufferQuotaInMB); Trace.WriteLine("Logs scheduled transfer log level filter: " + config.Logs.ScheduledTransferLogLevelFilter); Trace.WriteLine("Logs transfer period: " + config.Logs.ScheduledTransferPeriod.ToString()); // List the Directories info Trace.WriteLine("*** Directories configuration settings ***"); Trace.WriteLine("Directories buffer quota in MB: " + config.Directories.BufferQuotaInMB); Trace.WriteLine("Directories scheduled transfer period: " + config.Directories.ScheduledTransferPeriod.ToString()); int count = config.Directories.DataSources.Count, index; if (0 == count) { Trace.WriteLine("No data sources for Directories"); } else { for (index = 0; index < count; index++) { Trace.WriteLine("Directories configuration data source:"); Trace.WriteLine("\tContainer: " + config.Directories.DataSources[index].Container); Trace.WriteLine("\tDirectory quota in MB: " + config.Directories.DataSources[index].DirectoryQuotaInMB); Trace.WriteLine("\tPath: " + config.Directories.DataSources[index].Path); Trace.WriteLine(""); } } // List the event log info Trace.WriteLine("*** Event log configuration settings ***"); Trace.WriteLine("Event log buffer quota in MB: " + config.WindowsEventLog.BufferQuotaInMB); count = config.WindowsEventLog.DataSources.Count; if (0 == count) { Trace.WriteLine("No data sources for event log"); } else { for (index = 0; index < count; index++) { Trace.WriteLine("Event log configuration data source:" + config.WindowsEventLog.DataSources[index]); } } Trace.WriteLine("Event log scheduled transfer log level filter: " + config.WindowsEventLog.ScheduledTransferLogLevelFilter); Trace.WriteLine("Event log scheduled transfer period: " + config.WindowsEventLog.ScheduledTransferPeriod.ToString()); // List the performance counter info Trace.WriteLine("*** Performance counter configuration settings ***"); Trace.WriteLine("Performance counter buffer quota in MB: " + config.PerformanceCounters.BufferQuotaInMB); Trace.WriteLine("Performance counter scheduled transfer period: " + config.PerformanceCounters.ScheduledTransferPeriod.ToString()); count = config.PerformanceCounters.DataSources.Count; if (0 == count) { Trace.WriteLine("No data sources for PerformanceCounters"); } else { for (index = 0; index < count; index++) { Trace.WriteLine("PerformanceCounters configuration data source:"); Trace.WriteLine("\tCounterSpecifier: " + config.PerformanceCounters.DataSources[index].CounterSpecifier); Trace.WriteLine("\tSampleRate: " + config.PerformanceCounters.DataSources[index].SampleRate.ToString()); Trace.WriteLine(""); } } } catch (Exception e) { Trace.WriteLine("Exception during ShowConfig: " + e.ToString()); // Take other action as needed. } } } }
O exemplo mostra uma chamada sendo feita para GetDefaultInitialConfiguration, que retorna uma instância da classe DiagnosticMonitorConfiguration, que representa a configuração do monitor de diagnóstico padrão. Em seguida, a configuração padrão é modificada para incluir três configurações do contador de desempenho. O período de transferência agendado para os contadores de desempenho é definido como 2 minutos, com um tamanho máximo de buffer de 10 megabytes. Se o buffer exceder esse tamanho, as entradas mais antigas serão excluídas. Portanto, leve isso em conta ao dimensionar os buffers de dados e definir a frequência dos intervalos de transferência. Os contadores de desempenho são especificados por meio das propriedades CounterSpecifier e SampleRate.
Observe que, após a modificação da configuração do monitor de diagnóstico, uma chamada é feita para o método Start. Se o método DiagnosticMonitor.Start não for chamado, nenhuma alteração na configuração do monitor de diagnóstico será capturada pelo monitor de diagnóstico. Se o aplicativo configurar incorretamente as cotas atribuídas aos diretórios ou à cota geral, uma exceção poderá ser gerada pelo método DiagnosticMonitor.Start. Verifique se o aplicativo trata de toda exceção retornada pelo método DiagnosticMonitor.Start; se o aplicativo não tratar da exceção, a função será reciclada de forma contínua. A cota geral padrão para uso pelos diretórios de diagnóstico é de 4 GB. Para usar um valor menor, especifique-o definindo a propriedade OverallQuotaInMB. Para usar um valor maior, especifique-o no arquivo de definição de serviço. De forma específica, defina o valor no atributo sizeInMB do elemento <LocalStorage>, com o atributo name definido como DiagnosticStore. Por exemplo:
<LocalResources> <LocalStorage name="DiagnosticStore" sizeInMB="8192" cleanOnRoleRecycle="false"/> </LocalResources>
Observação: |
|---|
A soma das cotas coletivas usadas pelos logs de diagnóstico devem ser menores ou iguais ao valor de DiagnosticMonitorConfiguration.OverallQuotaInMB. Além disso, o valor DiagnosticMonitorConfiguration.OverallQuotaInMB deve ser menor ou igual ao valor especificado no atributo sizeInMB do elemento <LocalStorage>, com o atributo name definido como DiagnosticStore (ou menor ou igual a 4 GB se o atributo sizeInMB do armazenamento de diagnóstico não for especificado no arquivo de definição de serviço). |
O atributo cleanOnRoleRecycle especifica se o recurso de armazenamento local deve ser limpo quando uma instância de função é reciclada. Se for definido como true, o recurso local será limpo (se a instância de função for reciclada, qualquer diagnóstico existente que não tenha sido transferido será perdido); se for definido como false, o recurso local será persistido por todo o ciclo de vida da função.
Supondo-se uma execução bem-sucedida do exemplo e a captura de diagnóstico do contador de desempenho, o armazenamento de desenvolvimento local conterá uma tabela nomeada WADPerformanceCountersTable. (WAD é abreviatura do Diagnóstico do Windows Azure.) Se você examinar essa tabela (com o Gerenciador de Servidores do Visual Studio), observará as linhas de entidades que representam os dados capturados por meio do diagnóstico. Dentre essas entidades estão valores para as colunas nomeadas CounterName e CounterValue; esses valores se destinam aos contadores de desempenho especificados.
A definição de outras configurações de diagnóstico seria similar à efetuada aqui para os contadores de desempenho. Por exemplo, a classe WindowsEventLogsBufferConfiguration tem propriedades que definem configurações para logs de eventos. Consulte DiagnosticMonitorConfiguration para obter mais informações sobre as configurações de diagnóstico que podem ser definidas.
Durante o desenvolvimento do aplicativo, você poderá usar somente a conta de armazenamento de desenvolvimento local para armazenar os dados do diagnóstico. No entanto, para capturar o diagnóstico de um aplicativo implantado no Windows Azure, é necessário usar uma conta de armazenamento válida (não local), que pode ser configurada via portal do Windows Azure. Para especificar uma conta de armazenamento válida para uso com um aplicativo implantado, modifique o valor usado na configuração Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString. Este é um exemplo que mostra como isso seria exibido no arquivo de configuração de serviço (use os valores da conta de armazenamento para as configurações YourAccountName e YourAccountKey):
<Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="DefaultEndpointsProtocol=https;AccountName=YourAccountName;AccountKey=YourAccountKey" />
Para obter mais informações sobre configurações de conta de armazenamento, consulte Como especificar uma conta de armazenamento para transferências.
Para simplificar, o exemplo acima não leva em conta que sua configuração pode ser alterada, caso você deseje reiniciar a instância de função. Você pode resolver isso programaticamente incluindo um manipulador de eventos para o evento Changing. Para obter mais informações, consulte Como usar o evento RoleEnvironment.Changing. Em relação à manipulação programática desse evento, observe que a classe DiagnosticMonitorConfiguration contém uma propriedade, ConfigurationChangePollInterval, que especifica a frequência com que a função deve verificar a existência de uma alteração de configuração. Além disso, as instruções Trace, que resultam em uma saída visível no emulador do computador, não são capturadas na implantação do Windows Azure, a menos que você especifique um ouvinte de rastreamento. Para obter mais informações sobre ouvintes de rastreamento no Windows Azure, consulte DiagnosticMonitorTraceListener.
Como mencionado acima, esse exemplo capturou os dados de diagnóstico do contador de desempenho armazenados em uma tabela do Windows Azure nomeada WADPerformanceCountersTable. Outros dados de diagnóstico são armazenados em diferentes tabelas de armazenamento do Windows Azure. A tabela a seguir lista as propriedades DiagnosticMonitorConfiguration e a tabela de armazenamento correspondente do Windows Azure:
| Propriedade DiagnosticMonitorConfiguration | Tabela de armazenamento do Windows Azure correspondente |
|---|---|
| WADDiagnosticInfrastructureLogsTable | |
| WADDirectoriesTable | |
| WADLogsTable | |
| WADPerformanceCountersTable | |
| WADWindowsEventLogsTable |
O Windows Azure também dá suporte à capacidade de transferir dados de diagnóstico sob demanda (em vez de usar um intervalo específico). Para obter mais informações sobre transferência de diagnóstico sob demanda, consulte Como executar uma transferência por demanda.
Este exemplo mostra como um aplicativo típico que usa funções Web e/ou de trabalho importaria o módulo de diagnóstico para a definição de serviço e, em seguida, configuraria programaticamente os dados que você deseja coletar e opcionalmente transferir. Se o aplicativo contiver tarefas de inicialização que realizam operações de diagnóstico não incluídas nas operações padrão, ou se o aplicativo usar a função VM (que não dá suporte a tarefas de inicialização nem ao método OnStart), use um arquivo de configuração de diagnóstico (diagnostics.wadcfg), em vez da técnica mostrada neste exemplo. Para obter mais informações sobre o arquivo de configuração de diagnóstico, consulte Using the Windows Azure Diagnostics Configuration File.
Você poderá achar útil o Windows Azure Management Tool, um snap-in do MMC (Console de Gerenciamento Microsoft), para a exibição de informações de diagnóstico (bem como para outros aspectos de gerenciamento do Azure). Para obter mais informações sobre o Windows Azure Management Tool, inclusive de um local para download, consulte Windows Azure Management Tool (MMC). Além do snap-in do MMC, uma variedade de softwares de visualização de diagnóstico de terceiros está disponível e pode ser encontrada ao pesquisar online.
Aviso: |
|---|
| Os valores fornecidos neste exemplo são meramente ilustrativos. Ao implementar configurações de diagnóstico para aplicativos do Windows Azure, leve em conta vários fatores, como a taxa de amostragem de dados, o tamanho máximo do buffer e intervalos de transferência, além de encargos de armazenamento e transferência de dados. |
Observação:
Aviso: