In this screencast, we'll take a look at monitoring Azure applications by capturing event logs and performance counters. We'll also look at using PowerShell to deploy and configure applications using the management API. Finally, we'll take a sneak peek at Azure Diagnostics Manager, a tool from Cerebrata that allows you explore event logs and look at performance counters visually.
Here are some links from the screencast:
Windows Azure Cmdlets
Cerebrata (Cloud Storage Studio and Azure Diagnostics Monitor)
Finally, let’s get into some code snippets! Watch for wrap on the PowerShell lines, and note the single quote ` character as the line continuation:
Creating a self-signed certificate command:
makecert -r -pe -a sha1 -n "CN=Azure Service Test" -ss My -len 2048 -sp "Microsoft Enhanced RSA and AES Cryptographic Provider" -sy 24 AzureServiceTest.cer
Uploading a new deployment to the staging slot, and starting it (requires Azure CmdLets):
$cert = Get-Item cert:\CurrentUser\My\{thumbprint} $sub = "{subscription GUID}" $servicename = "{service name}"
$package = "CloudApp.cspkg" $config = "ServiceConfiguration.cscfg"
[DateTime]$datelabel = Get-Date $lbl = $datelabel.ToString("MM-dd-yyyy-HH:mm")
Write-Host "Label for deployment: " $lbl
Add-PSSnapin AzureManagementToolsSnapIn
Get-HostedService $servicename -Certificate $cert -SubscriptionId $sub | New-Deployment -Slot Staging $package $config -Label $lbl | Get-OperationStatus -WaitToComplete
Get-Deployment staging -serviceName $servicename -SubscriptionId $sub -Certificate $cert | Set-DeploymentStatus running | Get-OperationStatus -WaitToComplete
Increasing the number of instances:
Add-PSSnapin AzureManagementToolsSnapIn
$cert = Get-Item cert:\CurrentUser\My\{thumbprint} $sub = "{subscription GUID}" $servicename = "{service name}" $storage = "{storage name}"
#get storage account name and key $key = (Get-StorageKeys -ServiceName $storage -Certificate $cert -SubscriptionId $sub).Primary $deployId = (Get-HostedService $servicename -SubscriptionId $sub -Certificate $cert | Get-Deployment Production).DeploymentId
Get-HostedService $servicename -Certificate $cert -SubscriptionId $sub | Get-Deployment -Slot Staging | Set-DeploymentConfiguration {$_.RolesConfiguration["WebRole1"].InstanceCount += 1}
Updating the performance counters – specifically, adding total processor time, ASP.NET req/sec, and memory usage to be polled every 30 seconds, and uploaded every 1 minute:
Add-PSSnapin AzureManagementToolsSnapIn
$cert = Get-Item cert:\CurrentUser\My\{thumbprint} $sub = "{subscription GUID}" $servicename = "{service name}" $storage = "{storage name}"
#get storage account name and key $key = (Get-StorageKeys -ServiceName $storage -Certificate $cert -SubscriptionId $sub).Primary $deployId = (Get-HostedService $servicename -SubscriptionId $sub -Certificate $cert | Get-Deployment Production).DeploymentId
# rate at which counters are polled $rate = [TimeSpan]::FromSeconds(30)
Get-DiagnosticAwareRoles -StorageAccountName $storage -StorageAccountKey $key -DeploymentId $deployId | foreach { $role = $_ write-host $role Get-DiagnosticAwareRoleInstances $role -DeploymentId $deployId ` -StorageAccountName $storage -StorageAccountKey $key |
foreach { $instance = $_
$config = Get-DiagnosticConfiguration -RoleName $role -InstanceId $_ -StorageAccountName $storage ` -StorageAccountKey $key -BufferName PerformanceCounters -DeploymentId $deployId $processorCounter = New-Object Microsoft.WindowsAzure.Diagnostics.PerformanceCounterConfiguration ` -Property @{CounterSpecifier='\Processor(_Total)\% Processor Time'; SampleRate=$rate } $memoryCounter = New-Object Microsoft.WindowsAzure.Diagnostics.PerformanceCounterConfiguration ` -Property @{CounterSpecifier='\Memory\Available Mbytes'; SampleRate=$rate } $requestsCounter = New-Object Microsoft.WindowsAzure.Diagnostics.PerformanceCounterConfiguration ` -Property @{CounterSpecifier='\ASP.NET Applications(__Total__)\Requests/Sec'; SampleRate=$rate } $config.DataSources.Clear() $config.DataSources.Add($processorCounter) $config.DataSources.Add($memoryCounter) $config.DataSources.Add($requestsCounter) Set-PerformanceCounter -PerformanceCounters $config.DataSources -RoleName $role ` -InstanceId $instance -DeploymentId $deployId ` -TransferPeriod 1 ` -StorageAccountName $storage -StorageAccountKey $key } }
And finally, the webrole.cs class from the screencast:
public class WebRole : RoleEntryPoint { public override bool OnStart() { DiagnosticMonitorConfiguration diagConfig = DiagnosticMonitor.GetDefaultInitialConfiguration();
diagConfig.PerformanceCounters.DataSources.Add( new PerformanceCounterConfiguration() { CounterSpecifier = @"\Processor(_Total)\% Processor Time", SampleRate = TimeSpan.FromSeconds(5) });
diagConfig.PerformanceCounters.DataSources.Add( new PerformanceCounterConfiguration() { CounterSpecifier = @"\Memory\Available Mbytes", SampleRate = TimeSpan.FromSeconds(5) });
diagConfig.PerformanceCounters.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);
diagConfig.Logs.ScheduledTransferLogLevelFilter = LogLevel.Information; diagConfig.Logs.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);
DiagnosticMonitor.Start("DiagnosticsConnectionString", diagConfig);
System.Diagnostics.Trace.TraceInformation("Done configuring diagnostics.");
// For information on handling configuration changes // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357. RoleEnvironment.Changing += RoleEnvironmentChanging;
return base.OnStart(); }
public override void OnStop() { System.Diagnostics.Trace.TraceWarning("Onstop called."); base.OnStop(); }
private void RoleEnvironmentChanging(object sender, RoleEnvironmentChangingEventArgs e) { // If a configuration setting is changing if (e.Changes.Any(change => change is RoleEnvironmentConfigurationSettingChange)) { // Set e.Cancel to true to restart this role instance e.Cancel = true; } } }
In my first Azure Miniseries post, I showed setting up a new cloud service project and migrating an existing ASP.NET application into Azure. Before I dive into other topics, I figured I’d jump to the end and discuss deployment – getting your Azure application into the cloud. Link to original post with download links.