Microsoft.SystemCenter.VirtualMachineManager.2012.Report.TimedPowerShell.VMUsagePerformanceProvider (DataSourceModuleType)

Element properties:

TypeDataSourceModuleType
IsolationAny
AccessibilityPublic
RunAsDefault
OutputTypeSystem.Performance.Data

Member Modules:

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

Overrideable Parameters:

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

Source Code:

<DataSourceModuleType ID="Microsoft.SystemCenter.VirtualMachineManager.2012.Report.TimedPowerShell.VMUsagePerformanceProvider" 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 name="IntervalSeconds" type="xsd:integer"/>
<xsd:element name="TimeoutSeconds" type="xsd:integer"/>
<xsd:element 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.2012.Report.TimedPowerShell.PerformanceProvider">
<IntervalSeconds>$Config/IntervalSeconds$</IntervalSeconds>
<ScriptName>GetAllVMUsage</ScriptName>
<ScriptBody><Script>
param($VMMServer, $domain, $username, $pass)

#Creates Property bags containing perf counter data which the rules can parse and write into OM DB
function ProducePerfPropertyBags
{
param($InstanceName, $CPUUtilization, $Memory, $DiskBytes, $NetworkBytesWrite, $NetworkBytesRead, $TotalRAM, $CPUCount, $TotalSizeOfVirtualDisks)
$pBag = $oAPI.CreatePropertyBag()

if ($InstanceName -ne $null)
{

$pBag.AddValue('InstanceName', $InstanceName);
$pBag.AddValue('CounterValueCPU', [double]$CPUUtilization);
$pBag.AddValue('CounterValueMemory', [double]$Memory);
$pBag.AddValue('CounterValueDisk', [double]$DiskBytes);
$pBag.AddValue('CounterValueNetSent', [double]$NetworkBytesWrite);
$pBag.AddValue('CounterValueNetReceive', [double]$NetworkBytesRead);
$pBag.AddValue('CounterValueRAM', [double]$TotalRAM);
$pBag.AddValue('CounterValueCPUCount', [double]$CPUCount);
$pBag.AddValue('CounterValueDiskSize', [double]$TotalSizeOfVirtualDisks);
#$evt.WriteEntry("Created Property bag with VM Metrics for instance : " + $InstanceName, $infoevent, $SuccessCode);
$pBag
}
}

#GetAllVMUsage.ps1 : Gets aggregated service perf data from VMM

#error codes
$SuccessCode = 25900;
$NewPSSessionFailureCode = 25933;
$CredentialNullCode = 25934;
$GetVMMFailureCode = 25935;
$GetVMPerfFailureCode = 25936;
$VMPropertyCount = 9;

$oAPI = New-Object -comObject 'MOM.ScriptAPI'

$evt = New-Object System.Diagnostics.Eventlog("Application");
$evt.Source = "Microsoft.SystemCenter.VirtualMachineManager.2012.Report.VMUsageCollection";
$errevent = [System.Diagnostics.EventLogEntryType]::Error;
$infoevent = [System.Diagnostics.EventLogEntryType]::Information;
$error.Clear();
$cred = $null;
if ($domain -AND $username -AND $pass)
{
#Append domain to get domain\username
$domainUser = $domain + "\" + $username;

#Create Cred object
$securePass = ConvertTo-SecureString -AsPlainText $pass -force
$cred = New-Object System.Management.Automation.PSCredential $domainUser, $securePass;
}

if ($cred -eq $null)
{
$evt.WriteEntry("Credentials are null for user: " + $domainUser, $errevent, $CredentialNullCode);
return;
}

$error.Clear();
$session = New-PSSession -ComputerName $VMMServer -Authentication Default -Credential $cred;
if ($error.Count -ne 0)
{
$evt.WriteEntry($error, $errevent, $NewPSSessionFailureCode);
if ($session -ne $null)
{
Remove-PSSession $session;
}
return;
}

$error.Clear();
$vmmServer = Invoke-Command -Session $session -ArgumentList $VMMServer -ScriptBlock {$module = get-module -name "virtualmachinemanagercore"; if ($module -eq $null) {Import-Module "virtualmachinemanagercore"; } $vmm = Get-SCVMMServer -ComputerName $args[0]; $vmm};
if ($vmmServer -eq $null)
{
$evt.WriteEntry("VMM Server was null" + $error, $errevent, $GetVMMFailureCode);
Remove-PSSession $session;
return;
}
$error.Clear();
$VMPerfList = Invoke-Command -Session $session -ScriptBlock {
Try
{
$cpuPerf = @(Get-SCPerformanceData -AllVM -PerformanceCounter CPUUsage -VMMServer $vmm)
$memPerf = @(Get-SCPerformanceData -AllVM -PerformanceCounter MemoryUsage -VMMServer $vmm)
$diskPerf = @(Get-SCPerformanceData -AllVM -PerformanceCounter StorageIOPSUsage -VMMServer $vmm)
$netSentPerf = @(Get-SCPerformanceData -AllVM -PerformanceCounter NetworkIOSent -VMMServer $vmm)
$netRecvPerf = @(Get-SCPerformanceData -AllVM -PerformanceCounter NetworkIOReceived -VMMServer $vmm)

$cpuPerfMap= @{}
$memPerfMap=@{}
$diskPerfMap=@{}
$netSentPerfMap=@{}
$netRecvPerfMap=@{}


foreach ($perfdata in $cpuPerf)
{
$cpuPerfMap.Add($perfdata.ID, $perfdata.PerformanceHistory)
}
foreach ($perfdata in $memPerf)
{
$memPerfMap.Add($perfdata.ID, $perfdata.PerformanceHistory)
}
foreach ($perfdata in $diskPerf)
{
$diskPerfMap.Add($perfdata.ID, $perfdata.PerformanceHistory)
}
foreach ($perfdata in $netSentPerf)
{
$netSentPerfMap.Add($perfdata.ID, $perfdata.PerformanceHistory)
}
foreach ($perfdata in $netRecvPerf)
{
$netRecvPerfMap.Add($perfdata.ID, $perfdata.PerformanceHistory)
}
# collect VM Capacity information as well
$vms = @(Get-SCVirtualMachine -VMMServer $vmm);

#output everything per vm
foreach ($vm in $vms)
{
$vm.Name + "(" + $vm.ID + ")"
if ($cpuPerfMap.ContainsKey($vm.ID)) {$cpuPerfMap[$vm.ID];} else { 0;}
if ($memPerfMap.ContainsKey($vm.ID)) {$memPerfMap[$vm.ID];} else { 0;}
if ($diskPerfMap.ContainsKey($vm.ID)) {$diskPerfMap[$vm.ID];} else { 0;}
if ($netSentPerfMap.ContainsKey($vm.ID)) {$netSentPerfMap[$vm.ID]; } else { 0;}
if ($netRecvPerfMap.ContainsKey($vm.ID)) {$netRecvPerfMap[$vm.ID]; } else { 0;}
$vm.Memory;
$vm.CPUCount;
$vm.TotalSize;
}
}
Finally
{
if ($vmm -ne $null)
{
$vmm.Disconnect();
}
}
};
if ($error.Count -ne 0)
{
$evt.WriteEntry($error, $errevent, $GetVMPerfFailureCode);
Remove-PSSession $session;
return;
}
else
{
if ($VMPerfList -ne $null -and $VMPerfList.Count -ne $null)
{
$count = $vmPerfList.Count - $vmPerfList.Count % $VMPropertyCount;
for ( $i = 0; $i -lt $count; $i += $VMPropertyCount)
{
ProducePerfPropertyBags -InstanceName $VMPerfList[$i] -CPUUtilization $VMPerfList[$i+1] -Memory $VMPerfList[$i+2] -DiskBytes $VMPerfList[$i+3] -NetworkBytesWrite $VMPerfList[$i+4] -NetworkBytesRead $VMPerfList[$i+5] -TotalRAM $VMPerfList[$i+6] -CPUCount $VMPerfList[$i+7] -TotalSizeOfVirtualDisks $VMPerfList[$i+8]
}
}
}

Remove-PSSession $session;


</Script></ScriptBody>
<Parameters>$Config/Parameters$</Parameters>
<TimeoutSeconds>$Config/TimeoutSeconds$</TimeoutSeconds>
<ObjectName>VM</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>