Veeam Hyper-V Host CPU Used MHz Performance Provider

Veeam.Virt.Extensions.HyperV.Module.HostCPUMHz.PerformanceProvider (DataSourceModuleType)

Element properties:

TypeDataSourceModuleType
IsolationAny
AccessibilityInternal
RunAsDefault
OutputTypeSystem.Performance.Data

Member Modules:

ID Module Type TypeId RunAs 
DS DataSource System.Performance.DataProvider Default
PerfScript ProbeAction Veeam.Virt.Extensions.ScriptProbe.PropertyBag Default
Filter ConditionDetection System.ExpressionFilter Default
Mapper ConditionDetection System.Performance.DataGenericMapper Default

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
Frequencyint$Config/Frequency$FrequencyFrequency
TimeoutSecondsint$Config/TimeoutSeconds$TimeoutSecondsTimeoutSeconds
Verbosebool$Config/Verbose$VerboseVerbose

Source Code:

<DataSourceModuleType ID="Veeam.Virt.Extensions.HyperV.Module.HostCPUMHz.PerformanceProvider" Accessibility="Internal" Batching="false">
<Configuration>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="ObjectName" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="CounterName" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="InstanceName" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="Frequency" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="TimeoutSeconds" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="Verbose" type="xsd:boolean"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="Frequency" Selector="$Config/Frequency$" ParameterType="int"/>
<OverrideableParameter ID="TimeoutSeconds" Selector="$Config/TimeoutSeconds$" ParameterType="int"/>
<OverrideableParameter ID="Verbose" Selector="$Config/Verbose$" ParameterType="bool"/>
</OverrideableParameters>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<DataSource ID="DS" TypeID="Perf!System.Performance.DataProvider">
<ComputerName>.</ComputerName>
<CounterName>% Total Run Time</CounterName>
<ObjectName>Hyper-V Hypervisor Logical Processor</ObjectName>
<InstanceName>_Total</InstanceName>
<AllInstances>false</AllInstances>
<Frequency>$Config/Frequency$</Frequency>
</DataSource>
<ProbeAction ID="PerfScript" TypeID="VVEVB!Veeam.Virt.Extensions.ScriptProbe.PropertyBag">
<ScriptName>HostCPUMHz.js</ScriptName>
<Arguments>"$Data/Value$" "$Config/Verbose$"</Arguments>
<ScriptBody><Script>// HostCPUMHz.js
var SCRIPT_NAME = "HostCPUMHz.js";
var ARGUMENT_COUNT = 2;
var SEVERITY_ERROR = 1;
var SEVERITY_WARNING = 2;
var SEVERITY_INFO = 4;
var EVENT_ID = 3701;
if (WScript.Arguments.length != ARGUMENT_COUNT) {
WScript.Quit(0);
}

var Verbose = false;
var scriptlog = "";
var momApi = new ActiveXObject("MOM.ScriptAPI");
var pBag = momApi.CreatePropertyBag();

var totalCPUMHz = 0;
var cpuUsageMHz = -1;

try {
var totalRunTimePct = WScript.Arguments(0);
if (WScript.Arguments(1) == "false") {
Verbose = false;
}
else {
Verbose = true;
}


scriptlog += "Incoming parameters are: totalRunTimePct=" + totalRunTimePct + " Verbose=" + Verbose;


var totalCPUMHz = getTotalCPU();


if (totalCPUMHz &gt;= 0 &amp;&amp; totalRunTimePct &gt;= 0)
cpuUsageMHz = totalCPUMHz * (totalRunTimePct / 100);
}
catch (e) {
momApi.LogScriptEvent(SCRIPT_NAME, EVENT_ID, SEVERITY_ERROR, e.message);
}
finally {
scriptlog += "\r\n outgoing value is cpuUsageMHz=" + cpuUsageMHz;
if (Verbose) {
momApi.LogScriptEvent(SCRIPT_NAME, EVENT_ID, SEVERITY_INFO, scriptlog);
}
pBag.AddValue("cpuUsageMHz", cpuUsageMHz);
momApi.Return(pBag);
}

function getTotalCPU() {
var coreSpeed = 0;
var cpuCount = 0;
var numOfCores = 0;
var objSWbemLocator = new ActiveXObject("WbemScripting.SWbemLocator");
var wmiSvc = objSWbemLocator.ConnectServer(".", "root\\cimv2");
var query = "SELECT MaxClockSpeed,NumberOfCores FROM Win32_Processor";
var results = wmiSvc.ExecQuery(query);
if (results != null &amp;&amp; results.Count &gt; 0) {
cpuCount = results.Count;
var item = results.ItemIndex(0);
var coreSpeedProp = item.Properties_.Item("MaxClockSpeed");
if (coreSpeedProp != null) {
coreSpeed = coreSpeedProp.Value;
}
var coreCountProp = item.Properties_.Item("NumberOfCores");
if (coreCountProp != null)
numOfCores = coreCountProp.Value;
}
var totalMHz = coreSpeed * cpuCount * numOfCores;
scriptlog += "\r\n selected values from WMI are MaxClockSpeed=" + coreSpeed + " NumberOfCores=" + numOfCores + " cpuCount=" + cpuCount;
if (totalMHz &gt; 0)
return totalMHz;
else
return -1;
}</Script></ScriptBody>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
</ProbeAction>
<ConditionDetection ID="Filter" TypeID="System!System.ExpressionFilter">
<Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery Type="String">Property[@Name='cpuUsageMHz']</XPathQuery>
</ValueExpression>
<Operator>NotEqual</Operator>
<ValueExpression>
<Value Type="String">-1</Value>
</ValueExpression>
</SimpleExpression>
</Expression>
</ConditionDetection>
<ConditionDetection ID="Mapper" TypeID="Perf!System.Performance.DataGenericMapper">
<ObjectName>$Config/ObjectName$</ObjectName>
<CounterName>$Config/CounterName$</CounterName>
<InstanceName>$Config/InstanceName$</InstanceName>
<Value>$Data/Property[@Name='cpuUsageMHz']$</Value>
</ConditionDetection>
</MemberModules>
<Composition>
<Node ID="Mapper">
<Node ID="Filter">
<Node ID="PerfScript">
<Node ID="DS"/>
</Node>
</Node>
</Node>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>Perf!System.Performance.Data</OutputType>
</DataSourceModuleType>