public/Invoke-RSDataQuery.ps1

function Invoke-RSDataQuery {
    [cmdletbinding()]
    Param(

        [Parameter(Mandatory = $false)]
        [String]
        $Group = "/Topology",
        
        #currently, Metrics is the only valid API type
        [Parameter(Mandatory = $false)]
        [ValidateSet('Metrics')]
        [String]
        $QueryResult = "Metrics",

        [Parameter(Mandatory = $false)]
        [ValidateSet('Host', 'Subnet', IgnoreCase = $false)]
        [String]
        $QueryTarget = "Host",

        [Parameter(Mandatory = $false)]
        [String]
        $QueryFilter,
        
        [Parameter(Mandatory = $false)]
        [Switch]
        $XML,

        [Parameter(Mandatory = $false)]
        [Int]
        $TimeoutSec = 60*2

    )

    begin {
    }

    process {

        $queryXml = New-Object XML
        $e = $queryXml.CreateElement("DataQuery")
        $queryXml.AppendChild($e) | Out-Null
        $e = $queryXml.CreateElement("Search")
        $queryXml.SelectSingleNode("/DataQuery").AppendChild($e) | Out-Null
        $e = $queryxml.CreateElement("Target")
        $queryXml.SelectSingleNode("/DataQuery/Search").AppendChild($e) | Out-Null

        $queryXml.DataQuery.Search.Target = $QueryTarget
        
        if ($QueryFilter) {
            $e = $queryxml.CreateElement("Text")
            $queryXml.SelectSingleNode("/DataQuery/Search").AppendChild($e) | Out-Null
            $queryXml.DataQuery.Search.Text = $QueryFilter
        } 
        
        $e = $queryxml.CreateElement("Result")
        $e.InnerText = $queryResult
        $queryXml.SelectSingleNode("/DataQuery").AppendChild($e) | Out-Null
       
        #fetch the details of the requested group
        $groupDetails = Get-RSGroup $Group
        
        $e = $queryxml.CreateElement("Group")
        $queryXml.SelectSingleNode("/DataQuery").AppendChild($e) | Out-Null

        $e = $queryXml.CreateElement("Name")
        $e.InnerText = $groupDetails.GroupName
        #$e.InnerText = "Topology"
        $queryXml.SelectSingleNode("/DataQuery/Group").AppendChild($e) | Out-Null

        #set source clause specific options
        $e = $queryXml.CreateElement("Path")
        #$e.InnerText = "/Topology"
        $e.InnerText = $groupDetails.GroupPath
        $queryXml.SelectSingleNode("/DataQuery/Group").AppendChild($e) | Out-Null
        

        #set the body of the HTTP put
        $respBody = $($queryXml.InnerXML.ToString().Replace("><",">`r`n<"))
        
        Write-Verbose "Query put body is: $respBody"
        
        $uri = "https://$script:server/data"
        Write-Verbose "URI is $uri"

        #finally, try to execute the query
        try {

            #$resultXml = Invoke-RestMethod -uri $uri -body $respBody -Credential $script:Credentials -Method Put -ContentType 'application/xml' -TimeoutSec $timeoutSec -DisableKeepAlive
            $resultXML = Send-RSRequest -uri $uri -Method Put -body $respBody

        }
        catch {
            Write-Warning "Put body was `r`n$respBody"
            throw $_.Exception.Message
        }

        Write-Verbose "DataQuery exectution time: $($resultXML.DataQueryResults.Duration)"

        if ($XML) {
            $resultXml
        } else {
            #parse the results
            Get-RSMetricsGroup $resultXml.DataQueryResults.Results.Group
        }
    }
}