Olá pessoal,
No post anterior “Performance Counters nas roles do #Azure – Parte 1” vimos como iniciar uma nova ‘Solution’, como configurar nossa ‘Connection String’ para que os dados que coletarmos com os ‘Performance Counters’ possam ser persistidos em nossa ‘Azure Table Storage’ e que utilizaremos a ferramenta ‘Azure Storage Explorer’ para verificar seu conteúdo.
Estão vamos lá para iniciarmos esta nossa segunda parte primeiro abra o projeto passado, e em seguida vamos começa a codificar.
A primeira coisa é verificar se as APIs de Diagnóstigo, de RunTime e Storage estão referenciadas, caso não estejam, referenciem-nas pois serão necessárias neste projeto (post) e nos posteriores.
using Microsoft.WindowsAzure;using Microsoft.WindowsAzure.Diagnostics;using Microsoft.WindowsAzure.ServiceRuntime;using Microsoft.WindowsAzure.StorageClient;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.Diagnostics;
using Microsoft.WindowsAzure.ServiceRuntime;
using Microsoft.WindowsAzure.StorageClient;
Para saber mais sobre as APIs citadas acima acesse este link Windows Azure Managed Library Reference.
Para este exemplo precisaremos adicionar mais uma classe para isso clique com o botão direito sobre sua ‘Class Library’ no meu caso chama-se ‘CollectPC’, vá até a opção ‘Add’ e depois clique em ‘Class..’, conforme abaixo.
Aparecerá a segunte tela informe um novo nome e clique em ‘Add’.
Sua ‘Solution Explorer’ deve estar com uma estrutura conforme a apresentada abaixo.
Nosso projeto para este post contará com 1 ‘Worker Role’ que inserimos no início da ‘Solution’ e 2 classes, vamos à implementação agora e ver o que temos de código.
Abaixo como ilustração deixarei as imagens e trechos de códigos com os comentários.
No arquivo ‘WorkerRole.cs’temos a seguinte implementação no método ‘OnStart()’.
public override bool OnStart() { // Set the maximum number of concurrent connections ServicePointManager.DefaultConnectionLimit = 12; //Setamos as configurações 'default' de gerenciamento //e monitoramento da role atual DiagnosticMonitorConfiguration dmConfig = DiagnosticMonitor.GetDefaultInitialConfiguration(); //Define de quanto em quanto tempo as informações serão transferidas //o tempo pode ser definido em milesegundos, segundos, minutos, // horas e dias TimeSpan tsEventLogXfer = TimeSpan.FromSeconds(15); //Define de quanto em quanto tempo as informações serão coletadas //o tempo pode ser definido em milesegundos, segundos, minutos, // horas e dias TimeSpan timeToCollect = System.TimeSpan.FromSeconds(15); //Chama o método AddWorkerRoleCounters passando as informações //de configurações iniciais e de tempo de coleta PerformanceCounters.AddWorkerRoleCounters(dmConfig, timeToCollect); dmConfig.PerformanceCounters.ScheduledTransferPeriod = tsEventLogXfer; //Inicia o 'Diagnostic Monitor' com as configurações que definimos DiagnosticMonitor.Start("azureStorageConnectionString", dmConfig); return base.OnStart(); }
public override bool OnStart()
{
// Set the maximum number of concurrent connections
ServicePointManager.DefaultConnectionLimit = 12;
//Setamos as configurações 'default' de gerenciamento //e monitoramento da role atual
DiagnosticMonitorConfiguration dmConfig = DiagnosticMonitor.GetDefaultInitialConfiguration();
//Define de quanto em quanto tempo as informações serão transferidas //o tempo pode ser definido em milesegundos, segundos, minutos, // horas e dias
TimeSpan tsEventLogXfer = TimeSpan.FromSeconds(15); //Define de quanto em quanto tempo as informações serão coletadas //o tempo pode ser definido em milesegundos, segundos, minutos, // horas e dias
TimeSpan timeToCollect = System.TimeSpan.FromSeconds(15);
//Chama o método AddWorkerRoleCounters passando as informações //de configurações iniciais e de tempo de coleta
PerformanceCounters.AddWorkerRoleCounters(dmConfig, timeToCollect);
dmConfig.PerformanceCounters.ScheduledTransferPeriod = tsEventLogXfer;
//Inicia o 'Diagnostic Monitor' com as configurações que definimos
DiagnosticMonitor.Start("azureStorageConnectionString", dmConfig); return base.OnStart();
}
Seu código deve estar semelhante à imagem abaixo.
Já no arquivo ‘performanceCounters.cs’ teremos duas implementações, primeiro uma ‘Collection’ que armazenará todas as informações dos contadores.
/// <summary>/// Cria uma 'colection' com as configurações e informações/// dos 'Performance Counters'/// </summary>public class AddCounters{ private IList<PerformanceCounterConfiguration> _counters; public AddCounters(IList<PerformanceCounterConfiguration> counterCollection) { _counters = counterCollection; } public void AddCounter(string counterName, TimeSpan interval) { PerformanceCounterConfiguration perfCounter = new PerformanceCounterConfiguration(); perfCounter.CounterSpecifier = counterName; perfCounter.SampleRate = interval; _counters.Add(perfCounter); }}
E por último temos a implementação do método com os ‘Performance Counters’ que desejamos obter informações.
public class PerformanceCounters{ public static void AddWorkerRoleCounters(DiagnosticMonitorConfiguration dmConfig, TimeSpan interval) { AddCounters counters = new AddCounters(dmConfig.PerformanceCounters.DataSources); // Memória counters.AddCounter(@"\Memory\Committed Bytes", interval); counters.AddCounter(@"\Memory\Available MBytes", interval); // TCP Connections counters.AddCounter(@"\TCPv4\Connections Established", interval); counters.AddCounter(@"\TCPv4\Segments Sent/sec", interval); // Disco counters.AddCounter(@"\LogicalDisk(_Total)\Free Megabytes", interval); counters.AddCounter(@"\LogicalDisk(_Total)\% Free Space", interval); // Processador counters.AddCounter(@"\Processor(_Total)\% Processor Time", interval); // Rede counters.AddCounter(@"\Network Interface(*)\Bytes Received/sec", interval); counters.AddCounter(@"\Network Interface(*)\Bytes Sent/sec", interval); // .NET CLR counters.AddCounter(@"\.NET CLR Exceptions\# Exceps Thrown / sec", interval); counters.AddCounter(@"\.NET CLR Memory\# Bytes in all Heaps", interval); // Web Services counters.AddCounter(@"\ServiceModelService 3.0.0.0\Calls Per Second", interval); counters.AddCounter(@"\ServiceModelService 3.0.0.0\Calls Failed Per Second", interval); counters.AddCounter(@"\ServiceModelService 3.0.0.0\Calls Faulted Per Second", interval); counters.AddCounter(@"\ServiceModelService 3.0.0.0\Calls Outstanding", interval); }}
public class PerformanceCounters
public static void AddWorkerRoleCounters(DiagnosticMonitorConfiguration dmConfig, TimeSpan interval)
AddCounters counters = new AddCounters(dmConfig.PerformanceCounters.DataSources);
// Memória
counters.AddCounter(@"\Memory\Committed Bytes", interval);
counters.AddCounter(@"\Memory\Available MBytes", interval);
// TCP Connections
counters.AddCounter(@"\TCPv4\Connections Established", interval);
counters.AddCounter(@"\TCPv4\Segments Sent/sec", interval); // Disco
counters.AddCounter(@"\LogicalDisk(_Total)\Free Megabytes", interval);
counters.AddCounter(@"\LogicalDisk(_Total)\% Free Space", interval);
// Processador
counters.AddCounter(@"\Processor(_Total)\% Processor Time", interval);
// Rede
counters.AddCounter(@"\Network Interface(*)\Bytes Received/sec", interval);
counters.AddCounter(@"\Network Interface(*)\Bytes Sent/sec", interval);
// .NET CLR
counters.AddCounter(@"\.NET CLR Exceptions\# Exceps Thrown / sec", interval);
counters.AddCounter(@"\.NET CLR Memory\# Bytes in all Heaps", interval);
// Web Services
counters.AddCounter(@"\ServiceModelService 3.0.0.0\Calls Per Second", interval);
counters.AddCounter(@"\ServiceModelService 3.0.0.0\Calls Failed Per Second", interval);
counters.AddCounter(@"\ServiceModelService 3.0.0.0\Calls Faulted Per Second", interval);
counters.AddCounter(@"\ServiceModelService 3.0.0.0\Calls Outstanding", interval);
E está feito! Agora basta rodar e conferir o resultado dos seus ‘Performance Counters’ no ‘Azure Storage Explorer’.
Boa sorte, sucesso e divirtam-se!
Lucas A. Romão MSN: laromao@oxygenhost.com.br Blog: http://laromao.wordpress.com/ | Twitter: @LucasRomao Líder da Comunidade Azure Services Brasil | Twitter: @AzureServicesBR
Luciano Lima [MVP] edited Original. Comment: Correções ortográficas.