#--name Guest CPU ready statistics #--multi --hideoutput --full #--origin icomasoft --contribution Luc Dekens #region ScriptForm Designer #region Constructor [void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") [void][System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") #endregion #region Post-Constructor Custom Code function Get-Stat2( $entity = $(Throw "This is a required parameter."), $start, $finish, [string]$stat, [string]$instance = "", # Aggregate is the default [string]$interval, [int]$maxsamples){ $perfMgr = Get-View (Get-View ServiceInstance).content.perfManager # Create performance counter hashtable $pcTable = New-Object Hashtable foreach($pC in $perfMgr.PerfCounter){ if($pC.Level -ne 99){ $pctable.Add(($pC.GroupInfo.Key + "." + $pC.NameInfo.Key + "." + $pC.RollupType),$pC.Key) } } # Test if entity is valid if(!(("HostSystem", "VirtualMachine", "ComputeResource", "ResourcePool") -contains $entity.gettype().Name)) { Throw "-Entity parameters should be of type HostSystem , VirtualMachine, ComputeResource or ResourcePool" } # Test if start is valid if($start -ne $null -and $start -ne ""){ if($start.gettype().name -ne "DateTime") { Throw "-Start parameter should be a DateTime value" } } # Test if finish is valid if($finish -ne $null -and $finish -ne ""){ if($finish.gettype().name -ne "DateTime") { Throw "-Start parameter should be a DateTime value" } } # Test start-finish interval if($start -ne "" -and $finish -ne "" -and $start -ge $finish){ Throw "-Start time should 'older' than -Finish time." } # Test if stat is valid $statarray = $stat.Split(" ") $unitarray =@() foreach($st in $statarray){ if($pcTable[$st] -eq $null){ Throw "-Stat parameter $st is invalid." } $pcInfo = $perfMgr.QueryPerfCounter($pcTable[$st]) $unitarray += $pcInfo[0].UnitInfo.Key # Test if instance is valid $metricId = $perfMgr.QueryAvailablePerfMetric($entity.MoRef, $null, $null, $null) $found = $false $validInstances =@() foreach($metric in $metricId){ if($metric.CounterId -eq $pcTable[$st]){ if($metric.Instance -eq "") {$cInstance = '""'} else {$cInstance = $metric.Instance} $validInstances += $cInstance if($instance -eq $metric.Instance){$found = $true} } } if(!$found){ Throw "-Instance parameter invalid for requested stat: $st.`nValid values are: $validInstances" } } # Test for a valid $interval if($interval.ToString().Split(" ").count -gt 1){ Throw "Only 1 interval allowed." } switch($interval){ "RT" {$numinterval = 20} "HI1" {$numinterval = $perfMgr.HistoricalInterval[0].SamplingPeriod} "HI2" {$numinterval = $perfMgr.HistoricalInterval[1].SamplingPeriod} "HI3" {$numinterval = $perfMgr.HistoricalInterval[2].SamplingPeriod} "HI4" {$numinterval = $perfMgr.HistoricalInterval[3].SamplingPeriod} Default { Throw "-Interval parameter invalid. `nValid values are: $validInterval" } } # Test if $maxsamples is valid (only for real-time !) if($level -ne 5 -and $maxsamples -ne ""){ Throw "-Maxsamples parameter is only valid for real time (-Interval 20) statistics" } $PQSpec = New-Object VMware.Vim.PerfQuerySpec $PQSpec.entity = $entity.MoRef $PQSpec.Format = "normal" $PQSpec.IntervalId = $numinterval $PQSpec.MetricId = @() foreach($st in $statarray){ $PMId = New-Object VMware.Vim.PerfMetricId $PMId.counterId = $pcTable[$st] if($instance -ne $null){ $PMId.instance = $instance } $PQSpec.MetricId += $PMId } $PQSpec.StartTime = $start $PQSpec.EndTime = $finish $stats = $perfMgr.QueryPerf($PQSpec) # No data available (yet) if($stats[0].Value -eq $null) {return $null} # Extract data to custom object and return as array $data = @() for($i=0; $i -lt $stats[0].SampleInfo.Count; $i++){ for($j=0; $j -lt $statarray.Count; $j++){ $row = "" | Select CounterId, CounterName, Instance, Timestamp, Interval, Value, Unit $row.CounterId = $stats[0].Value[$j].Id.CounterId $row.CounterName = $statarray[$j] $row.Instance = $stats[0].Value[$j].Id.Instance $row.Timestamp = $stats[0].SampleInfo[$i].Timestamp $row.Interval = $stats[0].SampleInfo[$i].Interval $row.Value = $stats[0].Value[$j].Value[$i] $row.Unit = $unitarray[$j] $data += $row } } $data } #endregion #region Form Creation #Warning: It is recommended that changes inside this region be handled using the ScriptForm Designer. #When working with the ScriptForm designer this region and any changes within may be overwritten. #~~< frmMain >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $frmMain = New-Object System.Windows.Forms.Form $frmMain.ClientSize = New-Object System.Drawing.Size(433, 471) $frmMain.Text = "Guest CPU ready statistics" #~~< cblNCPU >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $cblNCPU = New-Object System.Windows.Forms.ComboBox $cblNCPU.DropDownStyle = [System.Windows.Forms.ComboBoxStyle]::DropDownList $cblNCPU.FormattingEnabled = $true $cblNCPU.Location = New-Object System.Drawing.Point(326, 43) $cblNCPU.Size = New-Object System.Drawing.Size(45, 21) $cblNCPU.TabIndex = 5 $cblNCPU.Text = "" #~~< Label4 >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $Label4 = New-Object System.Windows.Forms.Label $Label4.Location = New-Object System.Drawing.Point(15, 16) $Label4.Size = New-Object System.Drawing.Size(49, 21) $Label4.TabIndex = 4 $Label4.Text = "Used" $Label4.TextAlign = [System.Drawing.ContentAlignment]::MiddleLeft #~~< GroupBox1 >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $GroupBox1 = New-Object System.Windows.Forms.GroupBox $GroupBox1.Location = New-Object System.Drawing.Point(12, 87) $GroupBox1.Size = New-Object System.Drawing.Size(408, 85) $GroupBox1.TabIndex = 3 $GroupBox1.TabStop = $false $GroupBox1.Text = "Period average" #~~< Label6 >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $Label6 = New-Object System.Windows.Forms.Label $Label6.Location = New-Object System.Drawing.Point(20, 18) $Label6.Size = New-Object System.Drawing.Size(43, 21) $Label6.TabIndex = 13 $Label6.Text = "Used" $Label6.TextAlign = [System.Drawing.ContentAlignment]::MiddleLeft $Label6.add_Click({Label6Click($Label6)}) #~~< tbUsed >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $tbUsed = New-Object System.Windows.Forms.TextBox $tbUsed.CausesValidation = $false $tbUsed.Location = New-Object System.Drawing.Point(94, 19) $tbUsed.ReadOnly = $true $tbUsed.Size = New-Object System.Drawing.Size(46, 20) $tbUsed.TabIndex = 8 $tbUsed.TabStop = $false $tbUsed.Text = "" $tbUsed.TextAlign = [System.Windows.Forms.HorizontalAlignment]::Right $tbUsed.BackColor = [System.Drawing.SystemColors]::Window #~~< tbSystem >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $tbSystem = New-Object System.Windows.Forms.TextBox $tbSystem.CausesValidation = $false $tbSystem.Location = New-Object System.Drawing.Point(273, 50) $tbSystem.ReadOnly = $true $tbSystem.Size = New-Object System.Drawing.Size(46, 20) $tbSystem.TabIndex = 12 $tbSystem.TabStop = $false $tbSystem.Text = "" $tbSystem.TextAlign = [System.Windows.Forms.HorizontalAlignment]::Right $tbSystem.BackColor = [System.Drawing.SystemColors]::Window #~~< Label3 >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $Label3 = New-Object System.Windows.Forms.Label $Label3.Location = New-Object System.Drawing.Point(20, 49) $Label3.Size = New-Object System.Drawing.Size(43, 21) $Label3.TabIndex = 4 $Label3.Text = "Ready" $Label3.TextAlign = [System.Drawing.ContentAlignment]::MiddleLeft #~~< tbWait >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $tbWait = New-Object System.Windows.Forms.TextBox $tbWait.CausesValidation = $false $tbWait.Location = New-Object System.Drawing.Point(273, 18) $tbWait.ReadOnly = $true $tbWait.Size = New-Object System.Drawing.Size(46, 20) $tbWait.TabIndex = 10 $tbWait.TabStop = $false $tbWait.Text = "" $tbWait.TextAlign = [System.Windows.Forms.HorizontalAlignment]::Right $tbWait.BackColor = [System.Drawing.SystemColors]::Window #~~< Label2 >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $Label2 = New-Object System.Windows.Forms.Label $Label2.Location = New-Object System.Drawing.Point(192, 18) $Label2.Size = New-Object System.Drawing.Size(34, 21) $Label2.TabIndex = 9 $Label2.Text = "Wait" $Label2.TextAlign = [System.Drawing.ContentAlignment]::MiddleLeft #~~< tbReady >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $tbReady = New-Object System.Windows.Forms.TextBox $tbReady.CausesValidation = $false $tbReady.Location = New-Object System.Drawing.Point(94, 49) $tbReady.ReadOnly = $true $tbReady.Size = New-Object System.Drawing.Size(46, 20) $tbReady.TabIndex = 8 $tbReady.TabStop = $false $tbReady.Text = "" $tbReady.TextAlign = [System.Windows.Forms.HorizontalAlignment]::Right $tbReady.BackColor = [System.Drawing.SystemColors]::Window #~~< Label1 >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $Label1 = New-Object System.Windows.Forms.Label $Label1.Location = New-Object System.Drawing.Point(192, 49) $Label1.Size = New-Object System.Drawing.Size(50, 21) $Label1.TabIndex = 11 $Label1.Text = "System" $Label1.TextAlign = [System.Drawing.ContentAlignment]::MiddleLeft $GroupBox1.Controls.Add($Label6) $GroupBox1.Controls.Add($tbUsed) $GroupBox1.Controls.Add($tbSystem) $GroupBox1.Controls.Add($Label3) $GroupBox1.Controls.Add($tbWait) $GroupBox1.Controls.Add($Label2) $GroupBox1.Controls.Add($tbReady) $GroupBox1.Controls.Add($Label1) #~~< cblGuest >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $cblGuest = New-Object System.Windows.Forms.ComboBox $cblGuest.DropDownStyle = [System.Windows.Forms.ComboBoxStyle]::DropDownList $cblGuest.FormattingEnabled = $true $cblGuest.Location = New-Object System.Drawing.Point(82, 10) $cblGuest.Size = New-Object System.Drawing.Size(289, 21) $cblGuest.Sorted = $true $cblGuest.TabIndex = 1 $cblGuest.Text = "" #~~< lblGuest >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $lblGuest = New-Object System.Windows.Forms.Label $lblGuest.Location = New-Object System.Drawing.Point(12, 9) $lblGuest.Size = New-Object System.Drawing.Size(49, 21) $lblGuest.TabIndex = 0 $lblGuest.Text = "Guest" $lblGuest.TextAlign = [System.Drawing.ContentAlignment]::MiddleLeft #~~< cblPeriod >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $cblPeriod = New-Object System.Windows.Forms.ComboBox $cblPeriod.DropDownStyle = [System.Windows.Forms.ComboBoxStyle]::DropDownList $cblPeriod.FormattingEnabled = $true $cblPeriod.Location = New-Object System.Drawing.Point(82, 42) $cblPeriod.Size = New-Object System.Drawing.Size(97, 21) $cblPeriod.TabIndex = 2 $cblPeriod.Text = "" #~~< DGstats >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $DGstats = New-Object System.Windows.Forms.DataGridView $DGstats.AllowUserToAddRows = $false $DGstats.AllowUserToDeleteRows = $false $DGstats.AllowUserToResizeRows = $false $DGstats.AutoSizeColumnsMode = [System.Windows.Forms.DataGridViewAutoSizeColumnsMode]::AllCells $DGstats.AutoSizeRowsMode = [System.Windows.Forms.DataGridViewAutoSizeRowsMode]::AllCells $DGstats.ColumnHeadersHeightSizeMode = [System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode]::AutoSize $DGstats.EditMode = [System.Windows.Forms.DataGridViewEditMode]::EditProgrammatically $DGstats.Location = New-Object System.Drawing.Point(12, 178) $DGstats.MultiSelect = $false $DGstats.ReadOnly = $true $DGstats.RowHeadersWidthSizeMode = [System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode]::AutoSizeToDisplayedHeaders $DGstats.ShowCellErrors = $false $DGstats.ShowCellToolTips = $false $DGstats.ShowEditingIcon = $false $DGstats.ShowRowErrors = $false $DGstats.Size = New-Object System.Drawing.Size(408, 281) $DGstats.TabIndex = 0 $DGstats.Text = "" #~~< lblPeriod >~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ $lblPeriod = New-Object System.Windows.Forms.Label $lblPeriod.Location = New-Object System.Drawing.Point(12, 41) $lblPeriod.Size = New-Object System.Drawing.Size(49, 21) $lblPeriod.TabIndex = 0 $lblPeriod.Text = "Period" $lblPeriod.TextAlign = [System.Drawing.ContentAlignment]::MiddleLeft $frmMain.Controls.Add($cblNCPU) $frmMain.Controls.Add($Label4) $frmMain.Controls.Add($GroupBox1) $frmMain.Controls.Add($cblGuest) $frmMain.Controls.Add($lblGuest) $frmMain.Controls.Add($cblPeriod) $frmMain.Controls.Add($DGstats) $frmMain.Controls.Add($lblPeriod) #region$frmMain.Icon = ([System.Drawing.Icon](...) $frmMain.Icon = ([System.Drawing.Icon](New-Object System.Drawing.Icon((New-Object System.IO.MemoryStream(($$ = [System.Convert]::FromBase64String( "AAABAAEAICAAAAAAAABEBwAAFgAAACgAAAAgAAAAQAAAAAEACAAAAAAAAAAAAAAAAAAAAAAApwAA"+ "AAAAAAAAAAAA/xk1AP8cNwD/HDgA/x05AP8fOwD/ITwA/yZAAP8pQwD/KkQA/zZOAP83UAD/OVEA"+ "/zxUAP89VAD/PVUA/z5VAP8+VgD/QVgA/0JZAP9FXAD/R10A/0heAP9JXwD/S2EA/0xiAP9NYwD/"+ "T2QA/1JnAP9TaAD/U2kA/1RpAP9VagD/V2sA/1ltAP9dcQD/XnIA/19zAP9gcwD/YnUA/2N1AP9m"+ "eQD/Z3oA/2h6AP9pfAD/a30A/2t+AP9sfgD/boAA/2+AAP9wgQD/cIIA/3GCAP90hQD/dYYA/3aG"+ "AP92hwD/d4gA/3iJAP95iQD/eooA/3uLAP9+jQD/fo4A/4GQAP+EkwD/hZQA/4aVAP+HlQD/h5YA"+ "/4mXAP+JmAD/i5kA/42aAP+NmwD/j50A/5CeAP+SnwD/k6AA/5ShAP+VogD/mqYA/5ynAP+dqQD/"+ "naoA/5+rAP+gqwD/oKwA/6KtAP+jrgD/pK8A/6WwAP+nsQD/p7IA/6iyAP+pswD/qrQA/6u1AP+s"+ "tgD/rbcA/664AP+vuAD/r7kA/7C6AP+xugD/sbsA/7K7AP+yvAD/s7wA/7O9AP+1vgD/tr8A/7fA"+ "AP+4wAD/uMEA/7nBAP+5wgD/u8MA/7zEAP+9xQD/wMgA/8LJAP/DygD/xMsA/8TMAP/FzQD/xswA"+ "/8fOAP/IzwD/y9EA/83TAP/O1AD/0NUA/9LYAP/T2AD/1doA/9fbAP/X3AD/2d0A/9reAP/c4AD/"+ "3eEA/+DjAP/g5AD/4eUA/+LmAP/k5wD/5ukA/+nrAP/r7QD/7O8A/+7wAP/x8wD/8vQA//P0AP/1"+ "9gD/9fcA//b3AP/3+AD/+PkA//n5AP/5+gD/+/wA//z9AP/9/QD//v4A////AKampqampqampqam"+ "pqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqampqam"+ "pqSTh4SBfXh1b21pZGJge52mpqampqampqampqampqamm0waFxQSDgwLEBYeJCo4kqampqampqam"+ "pqampqampqaZMAEBAQEBAQMJDx0pOyWKpqampqampqampqampqamppkwAQEBAQEBAwkPHSk8KHKk"+ "pqampqampqampqampqammTABAQEBAQEDCQ8dKTw6R6GmpqampqampqampqampqaZMAEBAQIcNTcr"+ "FB0pPEYnnaampqampqampqampqamppkwAQEBBVyhoYggHSk8SSKRpqampqampqampqampqammTAB"+ "AQEFYaamoCkdKTxJM2umpqampqampqampqampqaZMAEBAQVhpqamSx0pPElLPaampqampqampqam"+ "pqamppkwAQEBBWGmpqZ4HSk8SVYin6ampqampqampqampqammTABAQEFYaamppQgKTxJVyyGpqam"+ "pqampqampqampqaZMAEBAQVhpqampS4pPElXRFimpqampqampqampqamppkwAQEBBWGmpqamTik8"+ "SVdVOaampqampqampqampqammTABAQEFYaampqZ2KTxJV14ylqampqampqampqampqaZMAEBAQVh"+ "pqamppEvPElXY0B6pqampqampqampqamppkwAQEBBWGmpqaml0U8SVdqTVOmpqampqampqampqam"+ "mTABAQEFYaampqabWzxJV25VRZ6mpqampqampqampqaZMAEBAQVhpqampqJ5PElXbmBCj6ampqam"+ "pqampqamppkwAQEBBWGmpqampolBSVducUV7pqampqampqampqammTABAQEFYaampqamk1FJV25+"+ "SF2lpqampqampqampqaZMAEBAQVhpqampqaaZUlXboBSUJimpqampqampqamppkwAQEBBDZhYmly"+ "eHxaSldugGxEjqampqampqampqammTABAQEBBgcIChYjMT5KV26AgTuDpqampqampqampqaZMAEB"+ "AQEBAQMJDx0pPElXboCLP2+jpqampqampqamppkwAQEBAQEBAwkPHSk8SVdugIxUUJympqampqam"+ "pqammTABAQEBAQEDCQ8dKTxJV26AjHs0l6ampqampqampqabTx0bGBUTEQ0TGSEmLTpDUFloax+Q"+ "pqampqampqampqSVjYmFgn95d3Rva2ZjZGdsbnBzX5Wmpqampqampqampqampqampqampqampqam"+ "pqampqampqampqampqampqampqampqampqampqampqampqampqampqampqYAAAAAAAAAAAAAAAAA"+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"+ "AA==")),0,$$.Length))))) #endregion $frmMain.add_Load({Form1Load($frmMain)}) $frmMain.add_Activated({Form1Activated($frmMain)}) #endregion #region Custom Code # Populate controls $cblGuest.BeginUpdate() $cblGuest.Items.Clear() $i = 0 foreach ($vm in $multi) { $cblGuest.Items.Add($vm.Name) if($i -eq 0){ $vm1NCPU = $vm.NumCpu $i++ } } $cblGuest.SelectedIndex = 0 $cblGuest.EndUpdate() $cblNCPU.BeginUpdate() $cblNCPU.Items.Clear() for ($i = 0; $i -lt $vm1NCPU; $i++) { $cblNCPU.Items.Add($i) } $cblNCPU.SelectedIndex = 0 $cblNCPU.EndUpdate() $cblPeriod.BeginUpdate() $cblPeriod.Items.Clear() $cblPeriod.Items.AddRange([System.Object[]] ( @("Day", "Week", "Month") )) $cblPeriod.SelectedIndex = 0 $cblPeriod.EndUpdate() # Create DataTable $table = New-Object system.Data.DataTable "Statistics" $col1 = New-Object system.Data.DataColumn "DateTime", ([string] ) $col2 = New-Object system.Data.DataColumn "Used", ([decimal] ) $col3 = New-Object system.Data.DataColumn "Wait", ([decimal] ) $col4 = New-Object system.Data.DataColumn "Ready", ([decimal] ) $col5 = New-Object system.Data.DataColumn "System", ([decimal] ) $table.columns.add($col1) $table.columns.add($col2) $table.columns.add($col3) $table.columns.add($col4) $table.columns.add($col5) # Link Datatable to DataGridView $DGstats.Datasource = $table.psObject.baseobject # Layout datagrid $DGstats.Columns["DateTime"].AutoSizeMode = [System.Windows.Forms.DataGridViewAutoSizeColumnMode]::AllCells $DGstats.Columns["DateTime"].Frozen = $true $DGstats.Columns["DateTime"].HeaderText = "Date/Time" $DGstats.Columns["DateTime"].ReadOnly = $true $DGstats.Columns["DateTime"].Resizable = [System.Windows.Forms.DataGridViewTriState]::False $DGstats.Columns["Used"].AutoSizeMode = [System.Windows.Forms.DataGridViewAutoSizeColumnMode]::Fill $DGstats.Columns["Used"].HeaderText = "Used %" $DGstats.Columns["Used"].ReadOnly = $true $DGstats.Columns["Used"].Resizable = [System.Windows.Forms.DataGridViewTriState]::False $DGstats.Columns["Used"].SortMode = [System.Windows.Forms.DataGridViewColumnSortMode]::NotSortable $DGstats.Columns["Wait"].AutoSizeMode = [System.Windows.Forms.DataGridViewAutoSizeColumnMode]::Fill $DGstats.Columns["Wait"].HeaderText = "Wait %" $DGstats.Columns["Wait"].ReadOnly = $true $DGstats.Columns["Wait"].Resizable = [System.Windows.Forms.DataGridViewTriState]::False $DGstats.Columns["Wait"].SortMode = [System.Windows.Forms.DataGridViewColumnSortMode]::NotSortable $DGstats.Columns["Ready"].AutoSizeMode = [System.Windows.Forms.DataGridViewAutoSizeColumnMode]::Fill $DGstats.Columns["Ready"].HeaderText = "Ready %" $DGstats.Columns["Ready"].ReadOnly = $true $DGstats.Columns["Ready"].Resizable = [System.Windows.Forms.DataGridViewTriState]::False $DGstats.Columns["Ready"].SortMode = [System.Windows.Forms.DataGridViewColumnSortMode]::NotSortable $DGstats.Columns["System"].AutoSizeMode = [System.Windows.Forms.DataGridViewAutoSizeColumnMode]::Fill $DGstats.Columns["System"].HeaderText = "System %" $DGstats.Columns["System"].ReadOnly = $true $DGstats.Columns["System"].Resizable = [System.Windows.Forms.DataGridViewTriState]::False $DGstats.Columns["System"].SortMode = [System.Windows.Forms.DataGridViewColumnSortMode]::NotSortable # Default cell style $DGstats.DefaultCellStyle.Alignment = [System.Windows.Forms.DataGridViewContentAlignment]::MiddleRight # Local functions function get-statistics { $guestName = $cblGuest.Text $period = $cblPeriod.Text $cpu = $cblNCPU.Text # If guest is "Disconnected" return after message # if((Get-VM $guestName).PowerState -eq "PoweredOff"){ # [Windows.Forms.MessageBox]::Show("Guest $esxName is disconnected","CPU guest stats",[Windows.Forms.MessageBoxButtons]::OK, [Windows.Forms.MessageBoxIcon]::Information) # return # } # Prepare Get-Stat2 parameters switch($cblPeriod.Text) { "Day" { $interval = "HI1" $dayBack = -1 } "Week" { $interval = "HI2" $dayBack = -7 } "Month" { $interval = "HI3" $dayBack = -31 } } $vm = Get-View -Id (Get-VM $guestName).Id # Call Get-Stat2 $stats = Get-Stat2 -entity $vm -start(Get-Date).AddDays($dayBack) ` -finish (Get-Date) ` -interval $interval ` -instance $cpu ` -stat cpu.ready.summation, cpu.wait.summation, cpu.system.summation, cpu.used.summation # Prepare datagridview $table.Clear() $Readytot = 0 $Waittot = 0 $Systemtot = 0 if($stats -ne $null){ $interv = $stats[0].interval for ($i = 0; $i -lt $stats.Count; $i=$i+4) { $row = $table.NewRow() $row.DateTime = $stats[$i].Timestamp.ToString() $row.Ready = "{0:F2}" -f ($stats[$i].Value / ($interv * 10)) $Readytot += $stats[$i].Value $row.Wait = "{0:F2}" -f ($stats[$i+1].Value / ($interv * 10)) $Waittot += $stats[$i+1].Value $row.System = "{0:F2}" -f ($stats[$i + 2].Value / ($interv * 10)) $Systemtot += $stats[$i + 2].Value $row.Used = "{0:F2}" -f ($stats[$i + 3].Value / ($interv * 10)) $Usedtot += $stats[$i + 3].Value $table.Rows.Add($row) } $tbReady.Text = "{0:F2}" -f ($Readytot/($stats.Count / 4 * $interv * 10)) $tbWait.Text = "{0:F2}" -f ($Waittot/($stats.Count / 4 * $interv * 10)) $tbSystem.Text = "{0:F2}" -f ($Systemtot / ($stats.Count / 4 * $interv * 10)) $tbUsed.Text = "{0:F2}" -f ($Usedtot / ($stats.Count / 4 * $interv * 10)) } else{ $tbReady.Text = "" $tbWait.Text = "" $tbSystem.Text = "" $tbUsed.Text = "" } } # Event handlers (add after control updates to avoid call at this stage) $cblGuest.add_SelectedValueChanged({ guest-SelectedValueChanged($cblGuest) }) $cblPeriod.add_SelectedValueChanged({ period-SelectedValueChanged($cblPeriod) }) $cblNCPU.add_SelectedValueChanged({ cpu-SelectedValueChanged($cblPeriod) }) #endregion #region Event Loop function Main{ [System.Windows.Forms.Application]::EnableVisualStyles() [System.Windows.Forms.Application]::Run($frmMain) } #endregion #endregion #region Event Handlers # function Form1Load( $object ){ } function guest-SelectedValueChanged( $object ){ $cblNCPU.BeginUpdate() $cblNCPU.Items.Clear() $vm1NCPU = (Get-VM $cblGuest.Text).NumCpu for ($i = 0; $i -lt $vm1NCPU; $i++) { $cblNCPU.Items.Add($i) } $cblNCPU.SelectedIndex = 0 $cblNCPU.EndUpdate() get-statistics } function period-SelectedValueChanged( $object ){ get-statistics } function cpu-SelectedValueChanged($object) { get-statistics } function Form1Activated( $object ){ get-statistics } function Label6Click( $object ){ } Main # This call must remain below all other event functions #endregion