Surprisingly it can be difficult to track exactly how long a VM has taken to deploy. So, I dug into the events part of powercli and came up with a way to calculate deployment times.
Basically the script is looking for the VMDeingDeployedEvent start time and then the VMDeployedEvent start time. We then take the difference of the 2 and print that out. It also matches up these 2 events based on a “chainid” that makes sure they match up.
If you have a large environment you might have to do many events to go back even a week. In my current environment that is of decent size about 500,000 events went back about a month.
The output is Name, Date, Minutes, Seconds for deploy and shows the oldest to newest, but you can sort it however you like.
Here is the script:
<#
.SYNOPSIS
<A brief description of the script>
.DESCRIPTION
<A detailed description of the script>
.PARAMETER <paramName>
<Description of script parameter>
.EXAMPLE
<An example of using the script>
#>
$samples = Read-Host "Enter Number of Samples to go back"
$events = Get-VIEvent -maxsamples $samples | where {$_.Gettype().Name -eq "VmBeingDeployedEvent" -or $_.gettype().name -eq "VmDeployedEvent"}
$VMDeployReport = @()
$events | where {$_.Gettype().Name -eq "VmBeingDeployedEvent"} | % {
$row = "" | Select Name, Date, Minutes, Seconds
$chainidkey = $_.chainid
$VmName = ($_.FullFormattedMessage).split('')[1]
$deployed = $events | where {$_.gettype().name -eq "VmDeployedEvent" -and $_.Chainid -eq $chainidkey}
$StartTime = $_.createdtime
#$date = $deployed.CreatedTime.ToString().split('')[0]
$endtime = $deployed.createdtime
$time = New-TimeSpan -start $starttime -end $endtime
$row.Name = $VmName
$row.date = $EndTime
$row.Minutes = $time.Minutes
$row.Seconds = $time.Seconds
$VMDeployReport += $row
}
$VMDeployReport