修 22 所取数程序在厂侧空闲时不报通道清单、日志说不清原因的问题

现场实跑:厂商库最近 10 分钟没有库在写入(没有测试在跑),活跃库探测返回空,
而我改结构时把回退条件收窄成"只在查询报错时回退",于是既没列最近的库、
也就没有上报任何通道拓扑,日志只有一句"共推 0 行",看不出为什么。

- 探测结果为空时同样回退到"按建库时间取最近 60 个库":没有测试在跑时也要
让操作员看到通道清单(水位之后的记录通常为空,等于不推数据)。
- 日志补上判断依据:探测到几个库、走的是哪条路径、本轮扫过几张通道表、
几个通道没有新行、推了几行。
1个文件已修改
20 ■■■■■ 已修改文件
scripts/j22-collector.ps1 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
scripts/j22-collector.ps1
@@ -131,11 +131,17 @@
having max(last_user_update) > dateadd(minute, -$LookbackMinutes, getdate())
"@ $null
        foreach ($row in $rows) { [void]$databases.Add([string]$row[0]) }
        return $databases
        if ($databases.Count -gt 0) {
            Write-Log ("  最近 $LookbackMinutes 分钟内有写入的库:" + $databases.Count + " 个")
            return $databases
        }
        # 没有库在写不等于没有东西可报:通道清单(拓扑)仍要让操作员看到,
        # 所以照样列最近的库;它们的水位之后的记录通常为空,等于不推数据。
        Write-Log "  最近 $LookbackMinutes 分钟内没有库在写入(现在没有测试在跑?),改为列出最近的库"
    }
    catch {
        $failure = $_.Exception.Message
        Write-Log ('  活跃库探测失败,退回按建库时间取库列表: ' + $failure)
        Write-Log ('  活跃库探测失败,改为列出最近的库: ' + $failure)
    }
    try {
@@ -143,6 +149,7 @@
select top 60 name from sys.databases where name like 'DB[_]%' order by create_date desc
"@ $null
        foreach ($row in $rows) { [void]$databases.Add([string]$row[0]) }
        Write-Log ("  已列出最近的库:" + $databases.Count + " 个")
        return $databases
    }
    catch {
@@ -205,11 +212,14 @@
    $positions = Get-ReadPositions
    $seenChannels = New-Object System.Collections.ArrayList
    $sentRows = 0
    $tablesSeen = 0
    $emptyChannels = 0
    foreach ($database in (Find-ActiveDatabases $connection)) {
        foreach ($table in (Find-ChannelTables $connection $database)) {
            if ($table -notmatch '^Ws(\d+)_IV_0$') { continue }
            $channel = [int]$Matches[1]
            $tablesSeen++
            if (-not $seenChannels.Contains($channel)) { [void]$seenChannels.Add($channel) }
            $key = "$database/$table"
@@ -257,7 +267,7 @@
            }
            catch { Write-Log ("  读取失败 [$key]: " + $_.Exception.Message); continue }
            if ($rows.Count -eq 0) { continue }
            if ($rows.Count -eq 0) { $emptyChannels++; continue }
            # 排序与截断在这里做:服务端不做排序
            $rows = @($rows | Sort-Object { [long]$_.record_time } | Select-Object -First $MaxRowsPerChannel)
@@ -271,9 +281,11 @@
    }
    # 拓扑:这台机器当前有数据表的通道。端点忽略重复声明,所以每轮都发没有副作用;
    # 它同时是候选"最近数据时间"的来源之外的通道清单(最近数据时间取采样行)。
    # 它同时是候选的通道清单(最近数据时间取采样行,不取上报时间)。
    [void](Send-Topology $seenChannels)
    Save-ReadPositions $positions
    Write-Log ("  本轮扫过 {0} 张通道表 / {1} 个通道;其中 {2} 个通道没有新行,推送 {3} 行" -f `
        $tablesSeen, $seenChannels.Count, $emptyChannels, $sentRows)
    return $sentRows
}