VM latency sensitivity setting in vROps
So I was approached by one of my fellow vROps buddies @ ITQ. His customer is in need to get some advanced VM settings in vROps. So Kim asked me if I had any experience with that. Not with that particularly, but I’ve some experience in getting 3rd party data into vROps. With that I should be able to help out my fellow buddy.
So after some trial and error, here is a working (hehe) Powershell script that will lookup a VMs latency sensitivity setting and will send that to vROps as a nice custom property. For the Powershell script to work a internet connection is needed to download a module or you need to install the module manually. Here is a link to the module needed:
https://github.com/fgrehl/Virten.net.VimAutomation
Also don’t forget to check this blog:
There you will find cool content not only from Kim but also from other VMware rockstars!
<#
Author: Kabir Ali - info@kablog.nl
Scriptname: VM Latency Sensitivity (VMLS)
Version: 1.0 (Tested)
Date: Feb 2 2021
Why: Kim Bottu asked for it
Remark: Test setup
vROPs Version: 8.2.0 (16949153)
vCenter 6.7 U3
Example: .\VMLS.ps1 -vCenter "vCenter.local.domain" -vCenterUser "vCenterUser" -vCenterPass "vCenterPass" -vROPsServer "vROps.local.domain" -vROPsUser "vROPsUsername" -vROPsPass "vROPsPass"
#>
Param (
[Parameter(Mandatory = $true)][string]$vCenter,
[Parameter(Mandatory = $true)][string]$vCenterUser,
[Parameter(Mandatory = $true)][string]$vCenterPass,
[Parameter(Mandatory = $true)][string]$vROPsServer,
[Parameter(Mandatory = $true)][string]$vROPsUser,
[Parameter(Mandatory = $true)][string]$vROPsPass
)
# Functions are required
function ConvertTo-UnixTimestamp {
$epoch = Get-Date -Year 1970 -Month 1 -Day 1 -Hour 0 -Minute 0 -Second 0
$input | % {
$milliSeconds = [math]::truncate($_.ToUniversalTime().Subtract($epoch).TotalMilliSeconds)
Write-Output $milliSeconds
}
}
function Get-TimeStamp {
return "[{0:MM/dd/yy} {0:HH:mm:ss}]" -f (Get-Date)
}
### Define Defaults ###
# See Parameters
### vCenter Connection ###
# Lets connect to the vCenter
try {
Connect-VIServer -Server $vCenter -User $vCenterUser -Password $vCenterPass
}
Catch {
Write-Output "Failed to connect to the vCenter: $vCenter ... Exiting..."
Exit
}
### vROPs API Connection ###
#Building vROPS API string & invoking REST API
$vROPsURL = "https://" + $vROPsServer + "/suite-api/api/"
$vROPsAuthURL = "https://" + $vROPsServer + "/suite-api/api/auth/token/acquire"
$Type = "application/json"
# Creating JSON for Auth Body
$AuthJSON =
"{
""username"": ""$vROPSUser"",
""password"": ""$vROPsPass""
}"
# Authenticating with API
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Try {
$vROPSSessionResponse = Invoke-RestMethod -Method POST -Uri $vROPsAuthURL -Body $AuthJSON -ContentType $Type
}
Catch {
$_.Exception.ToString()
$error[0] | Format-List -Force
Write-Output "Failed connecting to vROPs: $vROPsServer ... Exiting..."
Exit
}
# Extracting the session ID from the response
$vROPSSessionHeader = @{"Authorization"="vRealizeOpsToken "+$vROPSSessionResponse.'auth-token'.token
"Accept"="application/json"}
# Install custom module
Try {
Install-Module -Name Virten.net.VimAutomation
}
Catch {
$_.Exception.ToString()
$error[0] | Format-List -Force
Write-Output "Failed to install Virten module ... Exiting..."
#Exit
}
### Generic Code ###
# Get VMs from vCenter
$vCenterVMs = Get-VM
# Generate output
write-host "Found a total of " $vCenterVMs.count "in vCenter: " $vCenter -ForegroundColor Green
# For every VM found in vCenter look up the data in vROps
foreach ($vCenterVM in $vCenterVMs) {
# Just to be sure templates are excluded from the results or any other VMs that might misreport the latency setting
$LatencySensitivity = $null
# Get the latency settings from the VM
$LatencySensitivity = (get-vm -name $vCenterVM.name | Get-VMLatencySensitivity).LatencySensitivity
# If the latency setting is found, continue
if ($LatencySensitivity -ne $null) {
# Generate output
write-host "VM:" $vCenterVM "has the following latency setting:" $LatencySensitivity -ForegroundColor Green
# Build vROps URL based on VM name from vCenter
$ResourcesURL = $vROpsURL+"resources?resourceKind=virtualmachine&name=" +$vCenterVM
# Get data from vROps
$vROpsVM = (Invoke-RestMethod -Method GET -Uri $ResourcesURL -Headers $vROpsSessionHeader -ContentType $Type).resourceList
# Get timestamp to update vROps with
$EpochTimeNow = (Get-Date | ConvertTo-UnixTimestamp)
# Create the JSON reply to update vROps
$JSONData='{
"property-content" : [ {
"statKey" : "Custom Properties|VM Latency Sensitivity",
"timestamps" : ['+$EpochTimeNow+'],
"values" : ["'+$LatencySensitivity+'"],
"others" : [ ],
"otherAttributes" : { }
} ]
}'
# Try to add/update the custom metric
Try {
$TagJSONResponse = Invoke-RestMethod -Method POST -Body $JSONData -Uri ($vROpsURL+'resources/'+$vROpsVM.identifier+'/properties') -TimeoutSec 100 -Headers $vROpsSessionHeader -ContentType $Type
$TagDetailedInfo = $TagJSONResponse.value
write-host "Update successful on" $vCenterVM -ForegroundColor Green
write-host "--- --- --- ---" -ForegroundColor Yellow
}
Catch {
$_.Exception.ToString()
$error[0] | Format-List -Force
write-host "Update unsuccessful on" $vCenterVM -ForegroundColor Red
}
}
}
# Close sessions and done
write-host "All done" -ForegroundColor Green
Invoke-RestMethod -Method POST -Uri https://$vROpsServer/suite-api/api/auth/token/release -Headers $vROpsSessionHeader -ContentType $Type
Disconnect-VIServer -Server * -Confirm:$false
Thanks for reading and I hope this helps!
