Private/Get-CitrixFailures.ps1

function Get-CitrixFailures {
    
    <#
    .SYNOPSIS
    Retrieves the total number of connection failures for a single Citrix Virtual Apps and Desktops Delivery
    Controller.
    
    .DESCRIPTION
    This cmdlet returns a custom object with Delivery Group IDs and connection failure counts of all Delivery
    Groups of the specified Delivery Controller for the specified period of time. Data granularity depends on the
    specified period of time.
    
    .LINK
    https://github.com/karjona/citrix-odata
    
    .PARAMETER DeliveryController
    Specifies a single Citrix Virtual Apps and Desktops Delivery Controller to collect data from.
    
    .PARAMETER Credential
    Specifies a user account that has permission to send the request. A minimum of read-only administrator
    permissions on Citrix Virtual Apps and Desktops are required to collect this data.
    
    Enter a PSCredential object, such as one generated by the Get-Credential cmdlet.
    
    .PARAMETER StartDate
    Specifies the start date for the data collection in yyyy-MM-ddTHH:mm:ss format.
    
    .PARAMETER EndDate
    Specifies the end date for the data collection in yyyy-MM-ddTHH:mm:ss format.
    
    .COMPONENT
    citrix-odata
    #>

    
    
    [CmdletBinding()]
    [OutputType('PSCustomObject')]
    
    param(
    [Parameter(Mandatory=$true)]
    [String]
    $DeliveryController,
    
    [Parameter()]
    [PSCredential]
    $Credential,
    
    [Parameter(Mandatory=$true)]
    [DateTime]
    $StartDate,
    
    [Parameter(Mandatory=$true)]
    [DateTime]
    $EndDate
    )
    
    process {
        try {
            $Timespan = New-TimeSpan -Start $StartDate -End $EndDate
            if ($Timespan.TotalSeconds -le 3600) {
                $Granularity = '1'      # Less than an hour, request per-minute granularity
            } elseif ($Timespan.TotalSeconds -le 2592000) {
                $Granularity = '60'     # Less than 30 days, request per-hour granularity
            } else {
                $Granularity = '1440'   # More than a month, request per-day granularity
            }
            
            $Query = (
            "`$select=DesktopGroupId,FailureCount&" +
            "`$filter=(SummaryDate gt DateTime'$(Get-Date -Date $StartDate -Format "yyyy-MM-ddTHH:mm:ss")') and " +
            "(SummaryDate lt DateTime'$(Get-Date -Date $EndDate -Format "yyyy-MM-ddTHH:mm:ss")') and " +
            "(FailureCategory eq 1) and (Granularity eq $Granularity)"
            )
            
            $InvokeCitrixMonitorServiceQueryParams = @{
                DeliveryController = $DeliveryController
                Endpoint = 'FailureLogSummaries'
                Query = $Query
                ErrorAction = 'Stop'
            }
            if ($Credential) {
                $InvokeCitrixMonitorServiceQueryParams.Add("Credential", $Credential)
            }
            
            Write-Progress -Id 1 -Activity "Retrieving failures for $DeliveryController"
            $Failures = Invoke-CitrixMonitorServiceQuery @InvokeCitrixMonitorServiceQueryParams
        } catch {
            $ConnectionError = $_
            throw $ConnectionError
        } finally {
            Write-Progress -Id 1 -Activity "Retrieving failures for $DeliveryController" -Completed
        }
        $Failures
    }
}