Public/Get-JuribaEventLogs.ps1

function Get-JuribaEventLogs {
    <#
        .SYNOPSIS
        Retrieves event logs for a specific service run.

        .DESCRIPTION
        Queries the Juriba API to retrieve event logs from a specific run for a particular service.

        .PARAMETER Instance

        Optional. Juriba instance to be provided if not authenticating using Connect-Juriba. For example, https://myinstance.dashworks.app:8443

        .PARAMETER APIKey

        Optional. API key to be provided if not authenticating using Connect-Juriba.

        .PARAMETER RunID

        The ID of the run you'd like to retrieve logs from.

        .PARAMETER Filter
        
        (Optional) A filter string to narrow down the results.

        .EXAMPLE

        PS> $ETLEvents = Get-JuribaEventLogs -Instance $Instance -APIKey $APIKey -RunID $LatestETLRun.runId -ErrorAction Stop
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $false)]
        [string]$Instance,

        [Parameter(Mandatory = $false)]
        [string]$APIKey,

        [Parameter(Mandatory = $true)]
        [int]$RunID,

        [Parameter(Mandatory = $false)]
        [string]$Filter = ""
    )

    if ((Get-Variable 'dwConnection' -Scope 'Global' -ErrorAction 'Ignore') -and !$APIKey -and !$Instance) {
        $APIKey = ConvertFrom-SecureString -SecureString $dwConnection.secureAPIKey -AsPlainText
        $Instance = $dwConnection.instance
    }

    # Default filter if not provided.
    if (-not $Filter -or -not $Filter.Trim()) {
        $Filter = "and(eq(runId,%27$RunID%27),or(eq(levelId,%2750%27),eq(levelId,%2725%27),eq(levelId,%270%27),eq(levelId,%2775%27)))"
    }

    $baseUri = "$Instance/apiv2/event-logs"
    $headers = @{ "X-API-KEY" = $APIKey }
    $allResults = @()
    $startTime = Get-Date
    $page = 1

    try{
        do {
            if (((Get-Date) - $startTime).TotalMinutes -ge 15) {
                Write-Warning "Pagination timed out after 15 minutes."
                break
            }
            
            $queryParams = @{}
            if ($Filter -and $Filter.Trim()) { $queryParams["filter"] = $Filter }
            if ($page) { $queryParams["page"] = $page }
    
            $qsParts = @()
            foreach ($key in $queryParams.Keys) {
                $qsParts += "$key=$($queryParams[$key])"
            }
            $queryString = $qsParts -join "&"
            if ($queryString) { $uri = "$($baseUri)?$queryString" } else { $uri = $baseUri }
    
            Write-Verbose "Calling: $uri"
            $response = Invoke-RestMethod -Uri $uri -Headers $headers -Method GET -ErrorAction Stop
    
            if ($response) {
                $allResults += $response
            }
    
            $page++
        } while ($response -and ($response | Measure-Object).Count -gt 0)
    } catch {
        Write-Error "Error calling API endpoint: $_"
    }
    
    return $allResults
}