VMware Aria Operations Manager Plugin for Cloud Director - API Example

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:

image-20241003-060114.png

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

 

image-20241003-061754.png

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
image-20241003-063936.png