VMware Aria Operations Manager Plugin for Cloud Director - API Example
To access the Operations Manager UI via Cloud Director please refer to VMware Aria Operations Manager Plugin for Cloud Director - User Guide .
Overview
There isn’t a pre-built library available for retrieving metrics. However Zettagrid engineers have developed several solutions for you to use, utilising reverse engineering techniques.
All the examples provided are based on PowerShell, but you’re free to use any scripting language of your choice.
Here are the steps and logic you can follow to gather metrics:
Retrieve the necessary headers for API
Here’s a function designed to retrieve the necessary headers for API communication:
function Get-OmVcdHeaders(){
<#
.SYNOPSIS
Receive auth header for Cloud Director and Operation Manager plugin
#>
param (
[parameter(Mandatory = $true)]$user,
[parameter(Mandatory = $true)]$password,
[parameter(Mandatory = $true)]$vcd_fqdn,
[parameter(Mandatory = $true)]$org,
[parameter(Mandatory = $true)]$FakeDcId
)
$url = "https://$($vcd_fqdn)/api/"
$Params = @{
ContentType = "application/json"
}
#region preparing vCD API creds
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f ($user+'@'+$org),$password)))
#endregion preparing vCD API creds
#region get API version
$HeadersV = @{
Accept = 'application/*+json'
"Content-Type" = 'application/json'
}
$Response = Invoke-RestMethod -Uri ($Url+'versions') -Method Get -Headers:$HeadersV -SkipCertificateCheck:$true
$MaxApiVersion = ($Response.versionInfo.version | Sort-Object -Descending)[0]
#endregion get API version
#region obtain Bearer, vcloud_jwt and JSESSIONID
$Headers = @{
Authorization = "Basic $base64AuthInfo"
Accept = "application/*;version=$($MaxApiVersion)"
"Content-Type" = 'application/json'
}
$UrlAuth = ($url -replace '\/api')+'cloudapi/1.0.0/sessions'
$Response = Invoke-WebRequest -Uri $UrlAuth -Headers $Headers -Method POST -SkipCertificateCheck:$true
$BearerToken = $Response.Headers.Item('X-VMWARE-VCLOUD-TOKEN-TYPE')[0] + " " + $Response.Headers.Item('X-VMWARE-VCLOUD-ACCESS-TOKEN')[0]
$vcloud_jwt = ( $Response.Headers.Item('Set-Cookie')[0] -split ';')[0] -replace 'vcloud_jwt='
$vcloud_session_id = ( $Response.Headers.Item('Set-Cookie')[1] -split ';')[0] -replace 'vcloud_session_id='
$orgID = ($Response.Content | ConvertFrom-Json).org.id
$heartbeat = "https://$($vcd_fqdn)/ext-ui/tenant/$($org)/ariaops/ui/heartbeat.action"
$Refer = "https://$($vcd_fqdn)/tenant/$($org)/plugins/Vk13YXJl/operations"
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
$session.Cookies.Add((New-Object System.Net.Cookie("vcloud_jwt", $vcloud_jwt, "/", $vcd_fqdn)))
$session.Cookies.Add((New-Object System.Net.Cookie("vcloud_session_id", $vcloud_session_id, "/", $vcd_fqdn)))
$AiraToken = Invoke-WebRequest -UseBasicParsing -Uri $heartbeat `
-WebSession $session `
-Headers @{
"Accept"="*/*"
"Accept-Encoding"="gzip, deflate, br, zstd"
"Referer"=$Refer
"Sec-Fetch-Dest"="empty"
"Sec-Fetch-Mode"="cors"
"Sec-Fetch-Site"="same-origin"
}
$JSESSIONID = $AiraToken.BaseResponse.Headers.GetValues('Set-Cookie')[0]
$JSESSIONID = ($JSESSIONID -split ';')[0] -replace 'JSESSIONID='
#region refresh JSESSIONID
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
$session.Cookies.Add((New-Object System.Net.Cookie("vcloud_jwt", $vcloud_jwt, "/", $vcd_fqdn)))
$session.Cookies.Add((New-Object System.Net.Cookie("vcloud_session_id", $vcloud_session_id, "/", $vcd_fqdn)))
$session.Cookies.Add((New-Object System.Net.Cookie("JSESSIONID", $JSESSIONID, "/ext-ui/tenant/$($org)/ariaops/ui/", $vcd_fqdn)))
$body = @{
"vcdt" = ""
"vcdOrg" = $org
"vcdOrgId" = $orgID
"isDark" = "false"
"originURL" = $vcd_fqdn
}
$ErrorActionPreference='SilentlyContinue'
$Fresh_JSESSIONID = Invoke-WebRequest -MaximumRedirection:0 -SkipHeaderValidation -SkipHttpErrorCheck:$true `
-Uri "https://$($vcd_fqdn)/ext-ui/tenant/$($org)/ariaops/ui/"`
-WebSession $session `
-Body $body `
-Headers @{
"Accept"="text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"
"Accept-Encoding"="gzip, deflate, br, zstd"
"Referer"=$Refer
"Sec-Fetch-Dest"="iframe"
"Sec-Fetch-Mode"="navigate"
"Sec-Fetch-Site"="same-origin"
"Sec-Fetch-User"="?1"
"Upgrade-Insecure-Requests"="1"
}
$ErrorActionPreference='Continue'
$JSESSIONID = $Fresh_JSESSIONID.BaseResponse.Headers.GetValues('Set-Cookie')[0]
$JSESSIONID = ($JSESSIONID -split ';')[0] -replace 'JSESSIONID='
#endregion refresh JSESSIONID
#region receive secureToken
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
$session.Cookies.Add((New-Object System.Net.Cookie("rstd", "1", "/", $vcd_fqdn)))
$session.Cookies.Add((New-Object System.Net.Cookie("JSESSIONID", $JSESSIONID, "/", $vcd_fqdn)))
$session.Cookies.Add((New-Object System.Net.Cookie("vcloud_jwt", $vcloud_jwt, "/", $vcd_fqdn)))
$session.Cookies.Add((New-Object System.Net.Cookie("vcloud_session_id", $vcloud_session_id, "/", $vcd_fqdn)))
$TimezoneID=(Get-TimeZone).BaseUtcOffset.TotalMinutes
$secureToken = Invoke-WebRequest -UseBasicParsing -Uri "https://$($vcd_fqdn)/ext-ui/tenant/$($org)/ariaops/ui/commonJS.action?_dc=$($FakeDcId)&mainAction=getApplicationGlobalData&timezone=$($TimezoneID)" `
-WebSession $session `
-Headers @{
"Accept"="*/*"
"Accept-Encoding"="gzip, deflate, br, zstd"
"Referer"="https://$($vcd_fqdn)/ext-ui/tenant/$($org)/ariaops/ui/tenantViewer.action"
"Sec-Fetch-Dest"="empty"
"Sec-Fetch-Mode"="cors"
"Sec-Fetch-Site"="same-origin"
"X-Requested-With"="XMLHttpRequest"
}
$secureToken = ($secureToken.Content | ConvertFrom-Json -AsHashtable)['secureToken']
#endregion receive secureToken
$Headers = [pscustomobject] @{
BearerToken = $BearerToken
vcloud_jwt = $vcloud_jwt
vcloud_session_id = $vcloud_session_id
JSESSIONID = $JSESSIONID
secureToken = $secureToken
}
#endregion obtain Bearer, vcloud_jwt and JSESSIONID
return $Headers
}
Retrieving virtual machine IDs
Retrieving the virtual machine IDs used by the Operations Manager Plugin
function Get-OmVcdVmResourcesId {
<#
.SYNOPSIS
Receive Aira Plugin ID for Cloud Director VMs
#>
param (
[parameter(Mandatory = $true)]$Internalheaders,
[parameter(Mandatory = $true)]$vcd_fqdn,
[parameter(Mandatory = $true)]$org,
[parameter(Mandatory = $true)]$FakeDcId
)
#region receive VmResourcesId
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
$session.Cookies.Add((New-Object System.Net.Cookie("JSESSIONID", $Internalheaders.JSESSIONID, "/", $vcd_fqdn)))
$session.Cookies.Add((New-Object System.Net.Cookie("vcloud_jwt", $Internalheaders.vcloud_jwt, "/", $vcd_fqdn)))
$session.Cookies.Add((New-Object System.Net.Cookie("vcloud_session_id", $Internalheaders.vcloud_session_id, "/", $vcd_fqdn)))
$headers = @{
"Accept" = "*/*"
"Connection" = "keep-alive"
"Origin" = $vcd_fqdn
"Referer" = "https://$($vcd_fqdn)/ext-ui/tenant/$($org)/ariaops/ui/tenantViewer.action"
"Sec-Fetch-Dest" = "empty"
"Sec-Fetch-Mode" = "cors"
"Sec-Fetch-Site" = "same-origin"
"X-Requested-With" = "XMLHttpRequest"
}
$body = @{
"searchCriteria" = "{`"sortAsc`":false,`"start`":0,`"sortField`":null,`"limit`":50,`"fetchCount`":true,`"searchVMCriterias`":[]}"
"page" = "1"
"start" = "0"
"limit" = "50"
"currentComponentInfo" = "TODO"
"secureToken" = $Internalheaders.secureToken
}
$response = Invoke-RestMethod -Uri "https://$($vcd_fqdn)/ext-ui/tenant/$($org)/ariaops/ui/bridge/getChargebackVMs?_dc=$($FakeDcId)" `
-Method Post `
-WebSession $session `
-Headers $headers `
-ContentType "application/x-www-form-urlencoded; charset=UTF-8" `
-Body $body
#endregion receive VmResourcesId
$Result = $response.dtoList.resource | select id,name
return $Result
}
Retrieve Metrics
Retrieve metrics values for VM
function Get-OmVcdMetric {
<#
.SYNOPSIS
Receive Aira Plugin Metric for Cloud Director VM
#>
param (
[parameter(Mandatory = $true)]$Internalheaders,
[parameter(Mandatory = $true)]$vcd_fqdn,
[parameter(Mandatory = $true)]$org,
[parameter(Mandatory = $true)]$FakeDcId,
[parameter(Mandatory = $true)]$metricKey,
[parameter(Mandatory = $true)]$Id,
[parameter(Mandatory = $true)]
[ValidateSet("last24Hour", "last6Hour", "lastHour","today")] $Range
)
#region receive Metrics
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
$session.Cookies.Add((New-Object System.Net.Cookie("JSESSIONID", $Internalheaders.JSESSIONID, "/", $vcd_fqdn)))
$session.Cookies.Add((New-Object System.Net.Cookie("vcloud_jwt", $Internalheaders.vcloud_jwt, "/", $vcd_fqdn)))
$session.Cookies.Add((New-Object System.Net.Cookie("vcloud_session_id", $Internalheaders.vcloud_session_id, "/", $vcd_fqdn)))
$headers = @{
"Accept" = "*/*"
"Connection" = "keep-alive"
"Origin" = $vcd_fqdn
"Referer" = "https://$($vcd_fqdn)/ext-ui/tenant/$($org)/ariaops/ui/tenantViewer.action"
"Sec-Fetch-Dest" = "empty"
"Sec-Fetch-Mode" = "cors"
"Sec-Fetch-Site" = "same-origin"
"X-Requested-With" = "XMLHttpRequest"
}
$hashTable = @{
mainAction = "getMetricValues"
isStacked = "false"
smoothingFactor = "2"
resourceId = $Id
metricKey = $metricKey
dateRange = ('{"dateRange":"'+$Range+'"}')
periodIndex = "0"
currentComponentInfo = "TODO"
secureToken = $Internalheaders.secureToken
}
# Convert hashtable to URL-encoded query string
$queryString = ($hashTable.GetEnumerator() | ForEach-Object {
# Encode both key and value using .NET HttpUtility
Add-Type -AssemblyName System.Web
$key = [System.Web.HttpUtility]::UrlEncode($_.Key)
$value = [System.Web.HttpUtility]::UrlEncode($_.Value)
# Format as key=value
"$key=$value"
}) -join '&'
$Result = Invoke-WebRequest -UseBasicParsing -Uri "https://$($vcd_fqdn)/ext-ui/tenant/$($org)/ariaops/ui/metricChart.action" `
-Method "POST" `
-WebSession $session `
-Headers $headers `
-ContentType "application/x-www-form-urlencoded; charset=UTF-8" `
-body $queryString
#endregion receive Metrics
$metric = $Result.Content | ConvertFrom-Json
$metricview = [pscustomobject] @{
metricKey = $metric.metric.metricKey
resourceName = $metric.metric.resourceName
datapoints = @()
}
foreach($datapoint in $metric.metricChart.datapoints){
$value = [pscustomobject]@{
date = [DateTime]::UnixEpoch.AddMilliseconds($datapoint[0])
value = [math]::Round($datapoint[1],1)
}
$metricview.datapoints += $value
}
return $metricview
}
Examples
To find the metricKey, head to the Zettagrid Knowledge Base (KB) page - Operation Manager plugin for Cloud Director user guide
CPU Usage for last 6 hours for VM with name ubuntu-private
$vcd_fqdn = "mycloud.per.zettagrid.com"
$org = 'Org_cloud111'
$user = 'user'
$password = 'xxxx'
$FakeDcId = Get-Random -Minimum 100000 -Maximum 1000000
$InternalHeader = Get-OmVcdHeaders -vcd_fqdn:$vcd_fqdn -user:$user -password:$password -org:$org -FakeDcId:$FakeDcId
$VmResourcesId = Get-OmVcdVmResourcesId -vcd_fqdn:$vcd_fqdn -InternalHeader:$InternalHeader -org:$org -FakeDcId:$FakeDcId
$VmID = $VmResourcesId | ?{$_.name -like "ubuntu-private*"}
$Metrics = Get-OmVcdMetric -vcd_fqdn:$vcd_fqdn -InternalHeader:$InternalHeader -FakeDcId:$FakeDcId -org:$org -range:last6Hour -id:$VmID.id -metricKey:"cpu|usage_average"
Variable Metrics is the object with metricKey and values:
Packets per second for last hour for VM DJ-DC-001
interface with key 4000
To map the interface inside the VM and the interface key ID use MAC address. Get MAC address from OS level or VM config and metric MAC address
from Operation Manager plugin UI
$vcd_fqdn = "mycloud.ade.zettagrid.com"
$org = 'Org_cloud111'
$user = 'user'
$password = 'xxxx'
$FakeDcId = Get-Random -Minimum 100000 -Maximum 1000000
$InternalHeader = Get-OmVcdHeaders -vcd_fqdn:$vcd_fqdn -user:$user -password:$password -org:$org -FakeDcId:$FakeDcId
$VmResourcesId = Get-OmVcdVmResourcesId -vcd_fqdn:$vcd_fqdn -InternalHeader:$InternalHeader -org:$org -FakeDcId:$FakeDcId
$VmID = $VmResourcesId | ?{$_.name -like "DJ-DC-001*"}
$Metrics = Get-OmVcdMetric -vcd_fqdn:$vcd_fqdn -InternalHeader:$InternalHeader -FakeDcId:$FakeDcId -org:$org -range:lastHour -id:$VmID.id -metricKey:"net:4000|packetsPerSec"
$Metrics.datapoints
Write IOPS for last 24 hours for VM DJ-DC-001
diskSCSI:0:0
$vcd_fqdn = "mycloud.ade.zettagrid.com"
$org = 'Org_111'
$user = 'user'
$password = 'xxxx'
$FakeDcId = Get-Random -Minimum 100000 -Maximum 1000000
$InternalHeader = Get-OmVcdHeaders -vcd_fqdn:$vcd_fqdn -user:$user -password:$password -org:$org -FakeDcId:$FakeDcId
$VmResourcesId = Get-OmVcdVmResourcesId -vcd_fqdn:$vcd_fqdn -InternalHeader:$InternalHeader -org:$org -FakeDcId:$FakeDcId
$VmID = $VmResourcesId | ?{$_.name -like "DJ-DC-001*"}
$Metrics = Get-OmVcdMetric -vcd_fqdn:$vcd_fqdn -InternalHeader:$InternalHeader -FakeDcId:$FakeDcId -org:$org -range:last24Hour -id:$VmID.id -metricKey:"virtualDisk:scsi0:0|numberWriteAveraged_average"
$Metrics.datapoints