Diagnostics–Part II

Author: Brian Swan <brian.swan@microsoft.com>

Date: Monday, September 26, 2011, 11:11:14 AM

Tags: Tutorial, Diagnostics

Table of Contents

    Note:This article pertains to the CodePlex SDK initially released late 2009. The Windows Azure team has since then released a newer version of the Azure SDK for PHP on Github. Please refer to the Windows Azure PHP Developer Center for documentation on this more recent version of the SDK.

    Please stay tuned and come back here regularly as we are working on refreshing the tutorials to deliver up to date and useful content for our PHP developers.

    ;

    Reposted from Brian Swan's Windows Azure's Silver Lining blog

    In part 1 of this two part series, I showed how you can use a configuration file (the diagnostics.wadcfg file) to configure Azure diagnostics. However, that approach requires that you know all the diagnostic information that you want to collect before you deploy your application. In this post, I'll show how you can use the Windows Azure SDK for PHP API to configure diagnostic information after an application has been deployed to Windows Azure.

    Recall from part 1 that the Windows Azure Diagnostics Monitor persists your diagnostics configuration in your Azure Blob storage (in a container called wad-control-container). One configuration file is stored for each role instance your are running (the name of each file is of the format <deployment_id>/<role_name>/<role_instance_name>). You could, of course, download the configuration files (they are XML files), edit them, and upload them to your Blob storage. The Diagnostics Monitor would, on it's configured schedule, check for updates and apply them. However, it would be much more fun to write code to do this for us. So, from here, I'll walk you through a PHP script that turns on the collection of 3 performance counters. I'll provide the complete script at the end, and provide some guidance as to how you can turn on other diagnostics. (I'll assume that you have read part 1 of this series.)

    First, I'll include the classes I'll use:

    require_once 'Microsoft/WindowsAzure/Storage/Blob.php'; 
    require_once 'Microsoft/WindowsAzure/Diagnostics/Manager.php';
    require_once 'Microsoft/WindowsAzure/Management/Client.php';
    

    Next, I'll define several constants I'll use in my script:

    // Define constants for using Blob and Client classes.
    define("STORAGE_ACCOUNT_NAME", "your_storage_account_name");
    define("STORAGE_ACCOUNT_KEY", "your_storage_account_key");
    define("ROLE_NAME", "PhpOnAzure.Web");
    define("SID", 'your_azure_subscription_id');
    define("CERTIFICATE", 'path\to\your\management\certificate.pem');
    define("PASSPHRASE", 'your_certificate_passphrase');
    define("DNS_PREFIX", 'dns_prefix_for_your_hosted_service');
    define("SLOT", 'production'); //production or staging
    

    A couple notes about these constants:

    Now I'll use the Client, Blob, and Manager classes to get deployment information and current diagnostic configuration (from my blob storage). I'll also define an array that contains the performance counters I want to collect:

    // Get deployment
    $client = new Microsoft_WindowsAzure_Management_Client(SID, CERTIFICATE, PASSPHRASE);
    $deployment = $client->getDeploymentBySlot(DNS_PREFIX, SLOT); 
    
    // Create diagnostics manager
    $blob = new Microsoft_WindowsAzure_Storage_Blob('blob.core.windows.net', STORAGE_ACCOUNT_NAME, STORAGE_ACCOUNT_KEY);
    $manager = new Microsoft_WindowsAzure_Diagnostics_Manager($blob); 
    
    // Specify performance counters to collect.
    $counters = array('\Processor(_Total)\% Processor Time', '\Memory\Available Mbytes', '\TCPv4\Connections Established' );
    

    And finally, I'll loop through the role instances for my deployment and turn on the performance counters I defined above.

    // Create and set a configuration for each Web role.
    foreach($deployment->roleinstancelist as $index => $value) {   
        if($value['rolename'] == ROLE_NAME) {        
            $role_id = $deployment->privateid."/".ROLE_NAME."/".ROLE_NAME."_IN_".$index;        
            $configuration = $manager->getConfigurationForRoleInstance($role_id);         
            foreach($counters as $c) {             
                $configuration->DataSources->PerformanceCounters->addSubscription($c, "60");        
            }         
            $configuration->DataSources->OverallQuotaInMB = 10;        
            $configuration->DataSources->PerformanceCounters->BufferQuotaInMB = 10;            
            $configuration->DataSources->PerformanceCounters->ScheduledTransferPeriodInMinutes = 1;         
            $manager->setConfigurationForRoleInstance($role_id,$configuration);    
        }
    }
    

    A couple of notes about the code above:

    • This code assumes that you might have multiple roles for a deployment (e.g. a worker role). It will only turn on performance counters for the specified ROLE_NAME.
    • The getConfigurationForRoleInstance method on the Manager class requires a "role Id" parameter. The role Id is of this format: <deployment id>/<role name>/<role name>_IN_<instance index>.
    • The DataSources property on the Configuration class has several properties that you can set: ; overallquotainmb, logs, diagnosticinfrastructurelogs, performancecounters, windowseventlog, and directories.

    That's it. Within a few minutes after executing that script you should begin seeing performance counter data written to the WADPerformanceCountersTable table in your Windows Azure Table storage.

    Collecting other diagnostic information is similar. However, you'll need to look more closely at these classes in the SDK to figure out the details:

    • ConfigurationDiagnosticsInfrasctuctureLogs
    • ConfigurationDirectories
    • ConfigurationLogs
    • ConfigurationWindowsEventLog

    I'd be happy to dive into the details of using any of those classes…just post a comment!

    Thanks.

    -Brian

    Oh yes, and here's the complete script, as promised:

    <?php
    require_once 'Microsoft/WindowsAzure/Storage/Blob.php'; 
    require_once 'Microsoft/WindowsAzure/Diagnostics/Manager.php';
    require_once 'Microsoft/WindowsAzure/Management/Client.php';
     
    
    // Define constants for using Blob and Client classes.
    define("STORAGE_ACCOUNT_NAME", "your_storage_account_name");
    define("STORAGE_ACCOUNT_KEY", "your_storage_account_key");
    define("ROLE_NAME", "PhpOnAzure.Web");
    define("SID", 'your_azure_subscription_id');
    define("CERTIFICATE", 'path\to\your\management\certificate.pem');
    define("PASSPHRASE", 'your_certificate_passphrase');
    define("DNS_PREFIX", 'dns_prefix_for_your_hosted_service');
    define("SLOT", 'production'); //production or staging
    
    // Get deployment
    $client = new Microsoft_WindowsAzure_Management_Client(SID, CERTIFICATE, PASSPHRASE);
    $deployment = $client->getDeploymentBySlot(DNS_PREFIX, SLOT);
    
    // Create diagnostics manager
    $blob = new Microsoft_WindowsAzure_Storage_Blob('blob.core.windows.net', STORAGE_ACCOUNT_NAME, STORAGE_ACCOUNT_KEY);
    $manager = new Microsoft_WindowsAzure_Diagnostics_Manager($blob);
    
    // Specify performance counters to collect.
    $counters = array('\Processor(_Total)\% Processor Time', '\Memory\Available Mbytes', '\TCPv4\Connections Established' ); 
    
    // Create and set a configuration for each Web role.
    foreach($deployment->roleinstancelist as $index => $value) {
        if($value['rolename'] == ROLE_NAME) {
            $role_id = $deployment->privateid."/".ROLE_NAME."/".ROLE_NAME."_IN_".$index;
            $configuration = $manager->getConfigurationForRoleInstance($role_id); 
            foreach($counters as $c) { 
                $configuration->DataSources->PerformanceCounters->addSubscription($c, "60");
            } 
            $configuration->DataSources->OverallQuotaInMB = 10;
            $configuration->DataSources->PerformanceCounters->BufferQuotaInMB = 10;
            $configuration->DataSources->PerformanceCounters->ScheduledTransferPeriodInMinutes = 1; 
            $manager->setConfigurationForRoleInstance($role_id,$configuration);
        }
    }
    ?>
    
 
blog comments powered by Disqus

Related Content