VMM 2008 R2 Hyper-v Percent CPU Time Rule

Microsoft.SystemCenter.VirtualMachineManager.ManagedHost.PercentProcessorTime.Collection.HyperVHost (Rule)

Element properties:

TargetMicrosoft.SystemCenter.VirtualMachineManager.2008.HyperVHost
CategoryPerformanceHealth
EnabledTrue
Alert GenerateFalse
RemotableTrue

Member Modules:

ID Module Type TypeId RunAs 
DS DataSource Microsoft.Windows.TimedScript.PerformanceProvider Default
WriteToDB WriteAction Microsoft.SystemCenter.CollectPerformanceData Default
WriteToDW WriteAction Microsoft.SystemCenter.DataWarehouse.PublishPerformanceData Default

Source Code:

<Rule ID="Microsoft.SystemCenter.VirtualMachineManager.ManagedHost.PercentProcessorTime.Collection.HyperVHost" Enabled="true" Target="VirtualMachineManager!Microsoft.SystemCenter.VirtualMachineManager.2008.HyperVHost" ConfirmDelivery="false" Remotable="true" Priority="Normal" DiscardLevel="100">
<Category>PerformanceHealth</Category>
<DataSources>
<DataSource ID="DS" TypeID="Windows!Microsoft.Windows.TimedScript.PerformanceProvider">
<IntervalSeconds>900</IntervalSeconds>
<SyncTime/>
<ScriptName>HostCPUUtilizationProvider.vbs</ScriptName>
<Arguments/>
<ScriptBody><Script>
Dim oAPI, oBag
Set oAPI = CreateObject("MOM.ScriptAPI")
Set oBag= oAPI.CreatePropertyBag()

Dim TimePeriodMiliSeconds, strQuery, strLPCountQuery, objWMIService, colItems, sleepTime

TimePeriodMiliSeconds = 30 * 1000
strQuery = "SELECT * FROM Win32_PerfRawData_HvStats_HyperVHypervisorLogicalProcessor where Name='_Total'"
strLPCountQuery = "SELECT * FROM Win32_PerfRawData_HvStats_HyperVHypervisorLogicalProcessor"
Dim F, T1 , P1 , T2 , P2 , CPU
Set objWMIService = GetObject("winmgmts:\\localhost\root\CIMV2")

'Get the LP Count
Set colItems = objWMIService.ExecQuery(strLPCountQuery,,48)
Dim LPCount
LPCount = -1
For Each objItem in colItems
LPCount = LPCount + 1
Next

if LPCount &lt; 1 then
WScript.quit 1
end if

'Record CPU readings with the workaround formula

Set colItems = objWMIService.ExecQuery(strQuery,,48)
For Each objItem in colItems
T1 = objItem.PercentTotalRunTime
P1 = objItem.Timestamp_PerfTime
Next

Wscript.Sleep(TimePeriodMiliSeconds)

Set colItems = objWMIService.ExecQuery(strQuery,,48)

For Each objItem in colItems
F = objItem.Frequency_PerfTime
T2 = objItem.PercentTotalRunTime
P2 = objItem.Timestamp_PerfTime
Next


CPU = (T2 - T1) / ( P2 - P1)
CPU = (F * CPU) / LPCount
CPU = Int(CPU / 100000)

if CPU &gt; 100 then
CPU = 100
end if

call oBag.AddValue("CPUUtilization", Int(CPU))
Call oAPI.Return(oBag)
</Script></ScriptBody>
<TimeoutSeconds>60</TimeoutSeconds>
<ObjectName>Win32_PerfFormattedData_HvStats_HyperVHypervisorLogicalProcessor</ObjectName>
<CounterName>PercentTotalRunTime</CounterName>
<InstanceName>_Total</InstanceName>
<Value>$data/Property[@Name='CPUUtilization']$</Value>
</DataSource>
</DataSources>
<WriteActions>
<WriteAction ID="WriteToDB" TypeID="SC!Microsoft.SystemCenter.CollectPerformanceData"/>
<WriteAction ID="WriteToDW" TypeID="SCDW!Microsoft.SystemCenter.DataWarehouse.PublishPerformanceData"/>
</WriteActions>
</Rule>