Frage

I am working on an example from Microsoft that shows how to use autoscaling (http://www.windowsazure.com/en-us/develop/net/how-to-guides/autoscaling/). The worker role installed on the cloud generates a performance counter and locally, a console application reads this counter and applies autoscaling.

Everything looks fine, the performance counter is available from WADPerformanceCountersTable and the console application accesses correctly to the storage but it cannot find the worker role inside WADPerformanceCountersTable. This is the generated exception:

Autoscaling General Error: 2001 : 
Microsoft.Practices.EnterpriseLibrary.WindowsAzure.Autoscaling.DataPointsCollection.DataPointsCollectionException:
Could not retrieve performance counter with name '\Processor(_Total)\% Processor Time'
for target 'WorkerRoleExample' from the WADPerformanceCountersTable table. ---> 
System.ArgumentOutOfRangeException: Could not retrieve the role with alias 'WorkerRoleExample' from the service information store.
Please review the service information store to fix this.

Configuration files of Autoscaling Application Block (both files are part of a console application):

rules.xml:

<?xml version="1.0" encoding="utf-8" ?>
<rules xmlns="http://schemas.microsoft.com/practices/2011/entlib/autoscaling/rules">
  <constraintRules>
    <rule name="default" enabled="true" rank="1" description="The default constraint rule">
      <actions>
        <range min="1" max="2" target="WorkerRoleExample"/>
      </actions>
    </rule>
  </constraintRules>
  <reactiveRules>
    <rule name="ScaleUpOnHighUtilization" rank="10" description="Scale up the web role" enabled="true" >
      <when>
        <any>
          <greaterOrEqual operand="WebRoleA_CPU_Avg_5m" than="60"/>
        </any>
      </when>
      <actions>
        <scale target="WorkerRoleExample" by="1"/>
      </actions>
    </rule>
    <rule name="ScaleDownOnLowUtilization" rank="10" description="Scale up the web role" enabled="true" >
      <when>
        <all>
          <less operand="WebRoleA_CPU_Avg_5m" than="60"/>
        </all>
      </when>
      <actions>
        <scale target="WorkerRoleExample" by="-1"/>
      </actions>
    </rule>
  </reactiveRules>
  <operands>
    <performanceCounter alias="WebRoleA_CPU_Avg_5m"
                        performanceCounterName="\Processor(_Total)\% Processor Time"
                        source ="WorkerRoleExample"
                        timespan="00:05:00" aggregate="Average"/>
  </operands>
</rules>

services.xml:

<?xml version="1.0" encoding="utf-8" ?>
<serviceModel xmlns="http://schemas.microsoft.com/practices/2011/entlib/autoscaling/serviceModel">
  <subscriptions>
    <subscription name="TestingWorkerRole"
                  certificateThumbprint="**************"
                  subscriptionId="**************"
                  certificateStoreLocation="CurrentUser"
                  certificateStoreName="My">
      <services>
        <service dnsPrefix="**************" slot="Staging">
          <roles>
            <role alias="AutoscalingApplicationRole"
                  roleName="WorkerRoleExample"
                  wadStorageAccountName="targetstorage"/>
          </roles>
        </service>
      </services>
      <storageAccounts>
        <storageAccount alias="targetstorage"
          connectionString="DefaultEndpointsProtocol=https;AccountName=*****;AccountKey=*******">
        </storageAccount>
      </storageAccounts>
    </subscription>
  </subscriptions>
</serviceModel>

Worker role running on the cloud generates a performance counter:

public override bool OnStart()
{
    // Set the maximum number of concurrent connections 
    ServicePointManager.DefaultConnectionLimit = 12;

    CreatePerformanceCounters();

    return base.OnStart();
}

private static void CreatePerformanceCounters()
{
    DiagnosticMonitorConfiguration diagConfig = DiagnosticMonitor.GetDefaultInitialConfiguration();

    var procTimeConfig = new PerformanceCounterConfiguration();
    procTimeConfig.CounterSpecifier = @"\Processor(_Total)\% Processor Time";
    procTimeConfig.SampleRate = TimeSpan.FromSeconds(10);

    diagConfig.PerformanceCounters.DataSources.Add(procTimeConfig);
    diagConfig.PerformanceCounters.ScheduledTransferPeriod = TimeSpan.FromMinutes(1);

    DiagnosticMonitor.Start("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString", diagConfig);
}
War es hilfreich?

Lösung

In services.xml try changing this:

<role alias="AutoscalingApplicationRole"
              roleName="WorkerRoleExample"
              wadStorageAccountName="targetstorage"/>

To this:

<role alias="WorkerRoleExample"
              roleName="WorkerRoleExample"
              wadStorageAccountName="targetstorage"/>

In rules.xml the target attribute of the scale element looks for a matching alias attribute on the role element in services.xml - it was looking for WorkerRoleExample and couldn't find it.

It would also work if, instead of the above, in rules.xml you changed:

<scale target="WorkerRoleExample" by="1"/>

To this:

<scale target="AutoscalingApplicationRole" by="1"/>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top