Update VMware.Skyline.InsightsApi.psm1
Apologies for the delay on getting this commit to address the final open item in the PR. This change removes the "hit a 429 and retry" logic as it was not effective. Replaced it with a global variable that stores the time of the last query. If a query has happened within the last 501ms we wait before sending. I've issued a few thousand queries with this logic added and have not yet hit the 429 error. The logic to find and report on 429's in a more friendly way still exists, just in case. Additionally I've implemented a counter to track number of queries that is reset by Connect-SkylineInsights, to track how many queries are executed. This was more of a debugging tool, but felt the overhead was low enough to leave it in for future troubleshooting. Signed-off-by: Brian Wuchner <brian.wuchner@gmail.com>
This commit is contained in:
@@ -79,6 +79,8 @@ Function Connect-SkylineInsights {
|
|||||||
'Refresh_Token'=$webRequest.refresh_token; 'SkylineAPI'="https://$skylineApi/public/api/data"; PSTypeName='SkylineConnection' }
|
'Refresh_Token'=$webRequest.refresh_token; 'SkylineAPI'="https://$skylineApi/public/api/data"; PSTypeName='SkylineConnection' }
|
||||||
|
|
||||||
# Return the connection object
|
# Return the connection object
|
||||||
|
$global:SkylineInsightsApiQueryCount = 0
|
||||||
|
$global:SkylineInsightsApiQueryLastTime = $null
|
||||||
$global:DefaultSkylineConnection
|
$global:DefaultSkylineConnection
|
||||||
} catch {
|
} catch {
|
||||||
Write-Error ("Failure connecting to $skylineAPI. Posted $loginBody " + $_)
|
Write-Error ("Failure connecting to $skylineAPI. Posted $loginBody " + $_)
|
||||||
@@ -130,7 +132,8 @@ Function Invoke-SkylineInsightsApi {
|
|||||||
PS C:\> Invoke-SkylineInsightsApi -queryBody '{formatted-query-string-converted-to-json}'
|
PS C:\> Invoke-SkylineInsightsApi -queryBody '{formatted-query-string-converted-to-json}'
|
||||||
#>
|
#>
|
||||||
param(
|
param(
|
||||||
[Parameter(Mandatory=$true)][string]$queryBody
|
[Parameter(Mandatory=$true)][string]$queryBody,
|
||||||
|
[Parameter(DontShow=$true)][int]$sleepTimerMs=501
|
||||||
)
|
)
|
||||||
|
|
||||||
if ( !$global:DefaultSkylineConnection ) {
|
if ( !$global:DefaultSkylineConnection ) {
|
||||||
@@ -140,7 +143,16 @@ Function Invoke-SkylineInsightsApi {
|
|||||||
|
|
||||||
write-debug "Querybody: $queryBody"
|
write-debug "Querybody: $queryBody"
|
||||||
try {
|
try {
|
||||||
|
if ($global:SkylineInsightsApiQueryLastTime) {
|
||||||
|
$timeSinceLastQuery = (New-TimeSpan $global:SkylineInsightsApiQueryLastTime (Get-Date)).TotalMilliseconds
|
||||||
|
if ($timeSinceLastQuery -lt $sleepTimerMs) {
|
||||||
|
Write-Debug "Waiting $($sleepTimerMs-$timeSinceLastQuery)ms to prevent HTTP 429 TOO_MANY_REQUESTS error"
|
||||||
|
Start-Sleep -Milliseconds ($sleepTimerMs-$timeSinceLastQuery)
|
||||||
|
}
|
||||||
|
}
|
||||||
$restCall = invoke-restmethod -method post -Uri $($global:DefaultSkylineConnection.SkylineAPI) -Headers @{Authorization = "Bearer $($global:DefaultSkylineConnection.ConnectionDetail.access_token)"} -body $queryBody -ContentType "application/json"
|
$restCall = invoke-restmethod -method post -Uri $($global:DefaultSkylineConnection.SkylineAPI) -Headers @{Authorization = "Bearer $($global:DefaultSkylineConnection.ConnectionDetail.access_token)"} -body $queryBody -ContentType "application/json"
|
||||||
|
$global:SkylineInsightsApiQueryCount++
|
||||||
|
$global:SkylineInsightsApiQueryLastTime = Get-Date
|
||||||
if ($restCall.errors) {
|
if ($restCall.errors) {
|
||||||
Write-Error $restCall.errors.Message
|
Write-Error $restCall.errors.Message
|
||||||
}
|
}
|
||||||
@@ -151,15 +163,14 @@ Function Invoke-SkylineInsightsApi {
|
|||||||
# are nested try/catch blocks the powershell equilivent of vbscript On Error Resume Next?
|
# are nested try/catch blocks the powershell equilivent of vbscript On Error Resume Next?
|
||||||
$errorStatusAsJson = ($incomingError | ConvertFrom-Json).status
|
$errorStatusAsJson = ($incomingError | ConvertFrom-Json).status
|
||||||
if ($errorStatusAsJson -eq '429 TOO_MANY_REQUESTS') {
|
if ($errorStatusAsJson -eq '429 TOO_MANY_REQUESTS') {
|
||||||
write-debug 'Hit 429 / rate limite warning, will sleep for 1 second.'
|
write-error 'Encountered HTTP 429 TOO_MANY_REQUESTS error, consider increasing sleepTimerMs value.'
|
||||||
start-sleep -Milliseconds 1005
|
start-sleep -Milliseconds (2*$sleepTimerMs)
|
||||||
$retryQuery = Invoke-SkylineInsightsApi $queryBody
|
break
|
||||||
return $retryQuery
|
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
# this was the error from trying to cast the incoming error to Json
|
# this was the error from trying to cast the incoming error to Json
|
||||||
}
|
}
|
||||||
if (!$errorStatusAsJson) { write-error $_ }
|
if (!$errorStatusAsJson) { write-error $incomingError }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -316,11 +327,10 @@ Function Get-SkylineAffectedObject {
|
|||||||
|
|
||||||
process {
|
process {
|
||||||
foreach ( $thisProduct in $products ) {
|
foreach ( $thisProduct in $products ) {
|
||||||
$thisQueryBody = $queryBody -Replace 'findingId: "",', "findingId: `"$findingId`","
|
|
||||||
$thisQueryBody = $thisQueryBody -Replace 'product: "",', "product: `"$thisProduct`","
|
|
||||||
$thisIteration = 0
|
$thisIteration = 0
|
||||||
|
$results = @() # reset results variable between products
|
||||||
do {
|
do {
|
||||||
|
$thisQueryBody = $queryBody -Replace 'product: "",', "product: `"$thisProduct`","
|
||||||
$thisQueryBody = $thisQueryBody -Replace 'start: 0', "start: $thisIteration"
|
$thisQueryBody = $thisQueryBody -Replace 'start: 0', "start: $thisIteration"
|
||||||
Write-Debug $thisQueryBody
|
Write-Debug $thisQueryBody
|
||||||
$thisResult = Invoke-SkylineInsightsApi -queryBody (@{'query' = $thisQueryBody} | ConvertTo-Json -Compress)
|
$thisResult = Invoke-SkylineInsightsApi -queryBody (@{'query' = $thisQueryBody} | ConvertTo-Json -Compress)
|
||||||
|
|||||||
Reference in New Issue
Block a user