modules/Devolutions.CIEM.Checks/Public/Get-CIEMScanEfficiencySummary.ps1

function ConvertToCIEMScanEfficiencyRun {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [object]$Row
    )

    $ErrorActionPreference = 'Stop'

    $durationSeconds = [double]$Row.duration_seconds
    $totalResults = [int]$Row.total_results
    $resultsPerSecond = if ($durationSeconds -gt 0) {
        [math]::Round($totalResults / $durationSeconds, 2)
    }
    else {
        $null
    }

    [PSCustomObject]@{
        Id               = [string]$Row.id
        Status           = [string]$Row.status
        Providers        = @(([string]$Row.resource_providers -split ',') | Where-Object { $_ })
        StartedAt        = [string]$Row.started_at
        CompletedAt      = [string]$Row.completed_at
        DurationSeconds  = [math]::Round($durationSeconds, 2)
        TotalResults     = $totalResults
        FailedResults    = [int]$Row.failed_results
        PassedResults    = [int]$Row.passed_results
        SkippedResults   = [int]$Row.skipped_results
        ManualResults    = [int]$Row.manual_results
        ResultsPerSecond = $resultsPerSecond
    }
}

function Get-CIEMScanEfficiencySummary {
    <#
    .SYNOPSIS
        Returns scan duration and result-throughput instrumentation.
    .DESCRIPTION
        Computes scan-efficiency signals from persisted scan run timings and result
        counts. This command is read-only and does not modify scan execution.
    .PARAMETER Last
        Number of most recent terminal scan runs to include.
    #>

    [CmdletBinding()]
    [OutputType([PSCustomObject])]
    param(
        [Parameter()]
        [ValidateRange(1, 100)]
        [int]$Last = 10
    )

    $ErrorActionPreference = 'Stop'

    $latestDiscoveryRunRows = @(Invoke-CIEMQuery -Query @"
SELECT discovery_run_id
FROM azure_discovery_phase_metrics
GROUP BY discovery_run_id
ORDER BY discovery_run_id DESC
LIMIT 1
"@
)
    $latestDiscoveryRunId = $null
    $latestDiscoveryPhaseMetrics = @()
    $latestDiscoveryDurationSeconds = $null
    if ($latestDiscoveryRunRows.Count -eq 1) {
        $latestDiscoveryRunId = [int]$latestDiscoveryRunRows[0].discovery_run_id
        $latestDiscoveryPhaseMetrics = @(Get-CIEMAzureDiscoveryPhaseMetric -DiscoveryRunId $latestDiscoveryRunId)
        $latestDiscoveryDurationSeconds = [math]::Round((($latestDiscoveryPhaseMetrics | Measure-Object -Property ElapsedSeconds -Sum).Sum), 2)
    }

    $rows = @(Invoke-CIEMQuery -Query @"
SELECT id, status, resource_providers, started_at, completed_at, duration_seconds,
       total_results, failed_results, passed_results, skipped_results, manual_results
FROM scan_runs
WHERE completed_at IS NOT NULL
  AND duration_seconds IS NOT NULL
ORDER BY started_at DESC
LIMIT @last
"@
 -Parameters @{ last = $Last })

    if ($rows.Count -eq 0) {
        return [PSCustomObject]@{
            Status                  = 'NoScanData'
            RunCount                = 0
            LatestRunId             = $null
            LatestDurationSeconds   = $null
            AverageDurationSeconds  = $null
            SlowestRunId            = $null
            SlowestDurationSeconds  = $null
            LatestResultsPerSecond  = $null
            AverageResultsPerSecond = $null
        TotalResults            = 0
        FailedResults           = 0
        PassedResults           = 0
        SkippedResults          = 0
        ManualResults           = 0
        LatestDiscoveryRunId          = $latestDiscoveryRunId
        LatestDiscoveryDurationSeconds = $latestDiscoveryDurationSeconds
        LatestDiscoveryPhaseMetrics   = $latestDiscoveryPhaseMetrics
        Runs                    = @()
        }
    }

    $runs = @(foreach ($row in $rows) {
        ConvertToCIEMScanEfficiencyRun -Row $row
    })

    $durationValues = @($runs | ForEach-Object { [double]$_.DurationSeconds })
    $throughputValues = @($runs | Where-Object { $null -ne $_.ResultsPerSecond } | ForEach-Object { [double]$_.ResultsPerSecond })
    $slowestRun = @($runs | Sort-Object -Property DurationSeconds -Descending | Select-Object -First 1)[0]
    $latestRun = $runs[0]

    [PSCustomObject]@{
        Status                  = 'Tracked'
        RunCount                = $runs.Count
        LatestRunId             = [string]$latestRun.Id
        LatestDurationSeconds   = [double]$latestRun.DurationSeconds
        AverageDurationSeconds  = [math]::Round(($durationValues | Measure-Object -Average).Average, 2)
        SlowestRunId            = [string]$slowestRun.Id
        SlowestDurationSeconds  = [double]$slowestRun.DurationSeconds
        LatestResultsPerSecond  = $latestRun.ResultsPerSecond
        AverageResultsPerSecond = if ($throughputValues.Count -gt 0) {
            [math]::Round(($throughputValues | Measure-Object -Average).Average, 2)
        }
        else {
            $null
        }
        TotalResults            = [int](($runs | Measure-Object -Property TotalResults -Sum).Sum)
        FailedResults           = [int](($runs | Measure-Object -Property FailedResults -Sum).Sum)
        PassedResults           = [int](($runs | Measure-Object -Property PassedResults -Sum).Sum)
        SkippedResults          = [int](($runs | Measure-Object -Property SkippedResults -Sum).Sum)
        ManualResults           = [int](($runs | Measure-Object -Property ManualResults -Sum).Sum)
        LatestDiscoveryRunId          = $latestDiscoveryRunId
        LatestDiscoveryDurationSeconds = $latestDiscoveryDurationSeconds
        LatestDiscoveryPhaseMetrics   = $latestDiscoveryPhaseMetrics
        Runs                    = $runs
    }
}