wasabi and management certificates

Topics: Autoscaling Application Block ("Wasabi")
Sep 28, 2012 at 3:47 PM

Hi,

I'm trying to setup autoscaling for a worker role and have a few questions. First, my approach is to add a new worker role to the existing application that contains the worker role I want to autoscale, and then setup the leasing so only one instance will manage the autoscaling. Is this a valid approach? If it is, do I need to worry about uploading a management certificate since the autoscale worker is in the same application?

I've read many of the available articles and many of them discuss management certificates, but haven't really found a good explanation of what it's for and when it's necessary.

Thanks,

Scott

 

Sep 30, 2012 at 2:40 PM

Yes, the management certificates are needed internally to use the Windows Azure API to scale the application.  The reason is that you don't want just anyone to be able to scale an application (that would be bad!) so you need to present the management certificate to manage Azure.

There are a variety of references out there but a good place to start is Deploying the Autoscaling Application Block.

--
Randy Levy
Enterprise Library support engineer
entlib.support@live.com 

Sep 30, 2012 at 5:23 PM

Thanks for responding.

In the app.config for the autoscale worker, I put in the info for the management certificate that VS2010 uses to publish the application. Is that valid?

 

At this point, my deploy succeeds with both the autoscale worker and the target worker, which are in the same deployment. Shorty after starting though, I RDP to the autoscale instance and find this exception in the event log

   Application: WaWorkerHost.exe Framework Version: v4.0.30319 Description: The process was terminated due to an unhandled exception. Exception Info: System.IO.FileLoadException Stack: at System.RuntimeTypeHandle.GetTypeByName(System.String, Boolean, Boolean, Boolean, System.Runtime.CompilerServices.StackCrawlMarkHandle, Boolean, System.Runtime.CompilerServices.ObjectHandleOnStack) at System.RuntimeTypeHandle.GetTypeByName(System.String, Boolean, Boolean, Boolean, System.Threading.StackCrawlMark ByRef, Boolean) at System.Type.GetType(System.String) at System.Diagnostics.TraceUtils.GetRuntimeObject(System.String, System.Type, System.String) at System.Diagnostics.TypedElement.BaseGetRuntimeObject() at System.Diagnostics.ListenerElement.GetRuntimeObject() at System.Diagnostics.ListenerElement.GetRuntimeObject() at System.Diagnostics.ListenerElementsCollection.GetRuntimeObject() at System.Diagnostics.TraceSource.Initialize() at System.Diagnostics.TraceSource.TraceData(System.Diagnostics.TraceEventType, Int32, System.Object) at Microsoft.Practices.EnterpriseLibrary.WindowsAzure.Autoscaling.Logging.SystemDiagnosticsLogger.Write(System.Collections.Generic.IEnumerable`1<System.String>, System.Diagnostics.TraceEventType, Int32, System.String, System.Collections.Generic.IDictionary`2<System.String,System.Object>) at Microsoft.Practices.EnterpriseLibrary.WindowsAzure.Autoscaling.Logging.LoggerExtensions.Write(Microsoft.Practices.EnterpriseLibrary.WindowsAzure.Autoscaling.Logging.ILogger, System.String, System.Diagnostics.TraceEventType, Int32, System.Exception) at Microsoft.Practices.EnterpriseLibrary.WindowsAzure.Autoscaling.DataPointsCollection.Sampler.Sample() at System.Reactive.Linq.Observable+<>c__DisplayClass408`2+<>c__DisplayClass40a[[System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Reactive.Unit, System.Reactive, Version=1.0.10621.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]].<Select>b__407(Int64) at System.Reactive.Linq.Observable+<>c__DisplayClass4bf+<>c__DisplayClass4c1.<Timer>b__4be(System.Action`1<System.DateTimeOffset>) at System.Reactive.Concurrency.Scheduler.InvokeRec3[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]](System.Reactive.Concurrency.IScheduler, Pair`2<System.__Canon,System.Action`2<System.__Canon,System.Action`2<System.__Canon,System.DateTimeOffset>>>) at System.Reactive.Concurrency.ThreadPoolScheduler+<>c__DisplayClass8`1[[System.Reactive.Concurrency.Scheduler+Pair`2[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], System.Reactive, Version=1.0.10621.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]].<Schedule>b__6(System.Object) at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) at System.Threading._TimerCallback.PerformTimerCallback(System.Object) 

 

If looks like the autoscaler is trying to log a diagnostic trace message, but is unable to load the trace listener class. However,  I get this even after removing all the trace listeners from the autoscaler app.config. Is there some way to see what class it's trying to load?

Thanks,

Scott

Oct 1, 2012 at 5:54 AM

Have you configured logging as per Autoscaling Application Block Logging?

--
Randy Levy
Enterprise Library support engineer
entlib.support@live.com