Veeam Hyper-V Host VMs and State Performance Provider

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

Element properties:

TypeDataSourceModuleType
IsolationAny
AccessibilityInternal
RunAsDefault
OutputTypeSystem.Performance.Data

Member Modules:

ID Module Type TypeId RunAs 
PDS DataSource Veeam.Virt.Extensions.ScriptDatasource.PropertyBag Default
PM ConditionDetection System.Performance.DataGenericMapper Default

Overrideable Parameters:

IDParameterTypeSelectorDisplay NameDescription
IntervalSecondsint$Config/IntervalSeconds$IntervalSecondsIntervalSeconds
TimeoutSecondsint$Config/TimeoutSeconds$TimeoutSecondsTimeoutSeconds

Source Code:

<DataSourceModuleType ID="Veeam.Virt.Extensions.HyperV.Module.VMsInStateCounter.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="Value" type="xsd:string"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="IntervalSeconds" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" minOccurs="1" name="TimeoutSeconds" type="xsd:integer"/>
</Configuration>
<OverrideableParameters>
<OverrideableParameter ID="IntervalSeconds" Selector="$Config/IntervalSeconds$" ParameterType="int"/>
<OverrideableParameter ID="TimeoutSeconds" Selector="$Config/TimeoutSeconds$" ParameterType="int"/>
</OverrideableParameters>
<ModuleImplementation Isolation="Any">
<Composite>
<MemberModules>
<DataSource ID="PDS" TypeID="VVEVB!Veeam.Virt.Extensions.ScriptDatasource.PropertyBag">
<IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
<SyncTime/>
<ScriptName>VMsInStateCounter.js</ScriptName>
<Arguments/>
<ScriptBody><Script>// VMsInStateCounter.js
var SCRIPT_NAME = "VMsInStateCounter.js";
var SEVERITY_ERROR = 1;
var SEVERITY_WARNING = 2;
var SEVERITY_INFO = 4;
var EVENT_ID = 3702;

var momApi = new ActiveXObject("MOM.ScriptAPI");
var pBag = momApi.CreatePropertyBag();
var servername = "";
var vmRunning = 0;
var vmPoweredOff = 0;
var vmPaused = 0;
var vmSaved = 0;
var vmTotal = 0;

try {
GetHostComputerName();
var vms = getVMComputerSystemInstances();
if (vms != null) {
vmTotal = vms.Count;
for (var i = 0; i &lt; vms.Count; i++) {
var vm = vms.ItemIndex(i);
var enabledStateProperty = vm.Properties_.Item("EnabledState");
if (enabledStateProperty != null) {
var enabledStateValue = enabledStateProperty.Value;
switch (enabledStateValue) {
case 2:
vmRunning++;
break;
case 3:
vmPoweredOff++;
break;
case 6:
vmSaved++;
break;
case 9:
vmPaused++;
break;
default:
break;
}
}
}
}
}
catch (e) {
//Invalid namespace on Win 2012 node
if (e.number == -2147217394) {
}
else {
momApi.LogScriptEvent(SCRIPT_NAME, EVENT_ID, SEVERITY_ERROR, e.message + " error number: " + e.number);
}
}
finally {
pBag.AddValue("vmRunning", vmRunning);
pBag.AddValue("vmPoweredOff", vmPoweredOff);
pBag.AddValue("vmPaused", vmPaused);
pBag.AddValue("vmSaved", vmSaved);
pBag.AddValue("vmTotal", vmTotal);
momApi.Return(pBag);
}

function getVMComputerSystemInstances() {
var objSWbemLocator = new ActiveXObject("WbemScripting.SWbemLocator");
var wmiSvc = objSWbemLocator.ConnectServer(".", "root\\virtualization\\v2");
var query = "SELECT ElementName, EnabledState, Name FROM Msvm_ComputerSystem WHERE Name &lt;&gt;'" + servername + "'";
var results = wmiSvc.ExecQuery(query);
return results;
}
function GetHostComputerName() {
var oNetwork;
oNetwork = new ActiveXObject("WScript.Network");
servername = oNetwork.ComputerName;
}</Script></ScriptBody>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
</DataSource>
<ConditionDetection ID="PM" TypeID="Perf!System.Performance.DataGenericMapper">
<ObjectName>$Config/ObjectName$</ObjectName>
<CounterName>$Config/CounterName$</CounterName>
<InstanceName>$Config/InstanceName$</InstanceName>
<Value>$Config/Value$</Value>
</ConditionDetection>
</MemberModules>
<Composition>
<Node ID="PM">
<Node ID="PDS"/>
</Node>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>Perf!System.Performance.Data</OutputType>
</DataSourceModuleType>