Microsoft.SystemCenter.VirtualMachineManager.2016.Report.TimedPowerShell.VPortUsagePerformanceProvider (DataSourceModuleType)

Element properties:

TypeDataSourceModuleType
IsolationAny
AccessibilityPublic
RunAsDefault
OutputTypeSystem.Performance.Data

Member Modules:

ID Module Type TypeId RunAs 
DS1 DataSource Microsoft.SystemCenter.VirtualMachineManager.2016.Report.TimedPowerShell.PerformanceProvider Default

Overrideable Parameters:

IDParameterTypeSelector
IntervalSecondsint$Config/IntervalSeconds$
TimeoutSecondsint$Config/TimeoutSeconds$

Source Code:

<DataSourceModuleType ID="Microsoft.SystemCenter.VirtualMachineManager.2016.Report.TimedPowerShell.VPortUsagePerformanceProvider" Accessibility="Public" Batching="false">
<Configuration>
<IncludeSchemaTypes>
<SchemaType>System!System.ParamListSchema</SchemaType>
<SchemaType>System!System.ExpressionEvaluatorSchema</SchemaType>
<SchemaType>Windows!Microsoft.Windows.PowerShellSchema</SchemaType>
</IncludeSchemaTypes>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="IntervalSeconds" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="TimeoutSeconds" type="xsd:integer"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="Parameters" type="NamedParametersType" minOccurs="0" maxOccurs="1"/>
</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="DS1" TypeID="Microsoft.SystemCenter.VirtualMachineManager.2016.Report.TimedPowerShell.PerformanceProvider">
<IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
<ScriptName>GetVPortPerfData</ScriptName>
<ScriptBody><Script>param($DeviceID)

$evt = New-Object System.Diagnostics.Eventlog("Application");
$evt.Source = "Microsoft.SystemCenter.VirtualMachineManager.2016.Report.VPortUsageCollection";
$errevent = [System.Diagnostics.EventLogEntryType]::Error;

$error.Clear()
$oAPI = New-Object -comObject 'MOM.ScriptAPI'
$pBagVNicReceived = $oAPI.CreatePropertyBag()
$pBagVNicSent = $oAPI.CreatePropertyBag()

$SyntheticEthernetPortClass = "Msvm_SyntheticEthernetPortSettingData"
$EmulatedEthernetPortClass = "Msvm_EmulatedEthernetPortSettingData"
$WMIQueryFailureCode = 26001;

# DeviceID format is like "Microsoft:38A2575F-162A-49BE-ADE4-A4CD2856A900\F080A659-FBA0-414D-BC80-D0501C39E7C1"
# Format the single slash into double \\ , to embed it into a WQL Query
if ($DeviceID -ne $null)
{
$DeviceIDArray = $DeviceID.Split('\');
# Device Id can have multiple slashes
if ($DeviceIDArray -ne $null)
{
foreach ($deviceIdPart in $DeviceIDArray)
{
$DeviceIDFixed = $DeviceIDFixed + $deviceIdPart + "\\";
}
$DeviceIDFixed = $DeviceIDFixed.TrimEnd("\\")
}

$WQLQueryFormat = "Select Connection from {0} where InstanceId='{1}'"
$WQLQuerySynthetic = [String]::Format( $WQLQueryFormat, $SyntheticEthernetPortClass, $DeviceIDFixed);
$WQLQueryEmulated = [String]::Format( $WQLQueryFormat, $EmulatedEthernetPortClass, $DeviceIDFixed);

$wmiResultArray = gwmi -Query $WQLQuerySynthetic -Namespace "root\virtualization"

# check out emulated if nothing found in synthetic port setting data
if ($wmiResultArray -eq $null)
{
$wmiResultArray = gwmi -Query $WQLQueryEmulated -Namespace "root\virtualization"
}

if ($wmiResultArray -ne $null)
{
$connectionArray = $wmiResultArray.Connection
if ($connectionArray -ne $null -and $connectionArray.Count -ne 0)
{
# Sample connection string is like
#\\HOSTNAME\root\virtualization:Msvm_SwitchPort.CreationClassName="Msvm_SwitchPort",Name="afa71add-a5c8-4b6a-a611-529e9
# 42bc017",SystemCreationClassName="Msvm_VirtualSwitch",SystemName="corp-SCVMM-ce9b6c56-9953-4c8b-afca-49e1f660bb12"
$connectionString = $connectionArray[0]

# split the connection string to get switch name and port name
$connectionStringPieces = $connectionString.Split('"');

if ($connectionStringPieces -ne $null)
{
# craft the perfmon instance name = VirtualSwitch.Name_SwitchPort.Name
$VPortPerfmonInstanceName = $connectionStringPieces[7] + "_" + $connectionStringPieces[3]
$wmiPerfCounter = gwmi Win32_PerfRawData_NvspPortStats_HyperVVirtualSwitchPort -Filter "Name ='$VPortPerfmonInstanceName'"
if ($wmiPerfCounter -ne $null)
{

$pBagVNicReceived.AddValue('CounterName', 'Bytes Received/sec');
$pBagVNicSent.AddValue('CounterName', 'Bytes Sent/sec');

$pBagVNicReceived.AddValue('InstanceName', $DeviceID);
$pBagVNicSent.AddValue('InstanceName', $DeviceID);

$pBagVNicReceived.AddValue('CounterValue', [double]$wmiPerfCounter.BytesReceivedPersec);
$pBagVNicSent.AddValue('CounterValue', [double]$wmiPerfCounter.BytesSentPersec);

$pBagVNicReceived
$pBagVNicSent
}
}
}
}
else
{
$evt.WriteEntry("Got null results from " + $WQLQuerySynthetic, $errevent, $WMIQueryFailureCode);
}
}

</Script></ScriptBody>
<Parameters>$Config/Parameters$</Parameters>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
<ObjectName>Virtual Port</ObjectName>
<CounterName>$Data/Property[@Name='CounterName']$</CounterName>
<InstanceName>$Data/Property[@Name='InstanceName']$</InstanceName>
<Value>$Data/Property[@Name='CounterValue']$</Value>
</DataSource>
</MemberModules>
<Composition>
<Node ID="DS1"/>
</Composition>
</Composite>
</ModuleImplementation>
<OutputType>SystemPerf!System.Performance.Data</OutputType>
</DataSourceModuleType>