Private/get-prometheusdata.ps1

function Get-PrometheusHeaders {
    param (
        [string]$Mode,
        [System.Management.Automation.PSCredential]$Credential,
        [string]$BearerTokenEnv
    )

    $headers = @{}

    switch ($Mode.ToLower()) {
        "basic" {
            if (-not $Credential) {
                throw "Credential is required for basic authentication."
            }
            $username = $Credential.UserName
            $password = $Credential.GetNetworkCredential().Password
            $pair = "$($username):$($password)"
            $headers["Authorization"] = "Basic " + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes($pair))
        }
        "bearer" {
            if (-not $BearerTokenEnv) { throw "Bearer token env var name required." }
            $token = $Env:BearerTokenEnv
            if (-not $token) { throw "Token not found in env var: $BearerTokenEnv" }
            $headers["Authorization"] = "Bearer $token"
        }
        "azure" {
            Write-Host "🔐 Authenticating with Azure..."
            if ($env:AZURE_CLIENT_ID -and $env:AZURE_CLIENT_SECRET -and $env:AZURE_TENANT_ID) {
                $body = @{
                    grant_type    = "client_credentials"
                    client_id     = $env:AZURE_CLIENT_ID
                    client_secret = $env:AZURE_CLIENT_SECRET
                    resource      = "https://prometheus.monitor.azure.com/"
                }
                $tokenResponse = Invoke-RestMethod -Method POST -Uri "https://login.microsoftonline.com/$($env:AZURE_TENANT_ID)/oauth2/token" -Body $body
                $headers["Authorization"] = "Bearer $($tokenResponse.access_token)"
            }
            else {
                if (-not (Get-Command az -ErrorAction SilentlyContinue)) {
                    throw "Azure CLI not found and SPN not set."
                }
                $token = az account get-access-token --resource https://prometheus.monitor.azure.com --query accessToken -o tsv
                if (-not $token) { throw "Failed to obtain Azure token." }
                $headers["Authorization"] = "Bearer $token"
            }
        }
        "local" {
            # No auth headers needed
        }
        default {
            throw "Unsupported auth mode: $Mode"
        }
    }

    return $headers
}

function Get-PrometheusData {
    param (
        [Parameter(Mandatory)]
        [string]$Query,

        [Parameter(Mandatory)]
        [string]$Url,

        [hashtable]$Headers   = @{},
        [switch]   $UseRange,
        [string]  $StartTime,
        [string]  $EndTime,
        [string]  $Step       = "5m",

        [int]
        $TimeoutSec = 30
    )

    try {
        $encodedQuery = [uri]::EscapeDataString($Query)
        $uri = if ($UseRange -and $StartTime -and $EndTime) {
            "$Url/api/v1/query_range?query=$encodedQuery&start=$StartTime&end=$EndTime&step=$Step"
        } else {
            "$Url/api/v1/query?query=$encodedQuery"
        }

        $response = Invoke-RestMethod -Uri $uri -Headers $Headers -TimeoutSec $TimeoutSec
        if ($response.status -ne "success") {
            throw "Query failed: $($response.error ?? 'Unknown error')"
        }

        return [PSCustomObject]@{
            Query   = $Query
            Url     = $Url
            Results = $response.data.result
        }
    }
    catch {
        Write-Host "❌ Prometheus query failed: $_" -ForegroundColor Red
        return [PSCustomObject]@{
            Query   = $Query
            Url     = $Url
            Results = @()
        }
    }
}