如何在Prometheus中按实例筛选最新补丁记录并统计实例数
问题描述
需要统计最近31天打过补丁的Windows服务器实例数,原查询为:
count(((time() - windows_update_patch_state_time) / 86400) > 0 < 31)
此前自定义exporter仅上报每个实例的最后一个补丁,查询可正常统计;但现在exporter会上报31天内所有补丁,导致单实例有多条记录,原本216个实例却统计出512条结果。
示例导出数据:
windows_update_patch_state_time{instance="instance1", kb="KB890830", title="Windows Malicious Software Removal Tool x64 - v5.135 (KB890830)"} 1755125323 windows_update_patch_state_time{instance="instance2", kb="KB5063877", title="2025-08 Cumulative Update for Windows Server 2019 for x64-based Systems (KB5063877)"} 1755124898 windows_update_patch_state_time{instance="instance2", kb="KB890830", title="Windows Malicious Software Removal Tool x64 - v5.135 (KB890830)"} 1755127104 windows_update_patch_state_time{instance="instance2", kb="KB5063757", title="Security update for SQL Server 2019 RTM CU (KB5063757)"} 1755125788 windows_update_patch_state_time{instance="instance2", kb="KB5063877", title="2025-08 Cumulative Update for Windows Server 2019 for x64-based Systems (KB5063877)"} 1755126947
需求:每个实例仅保留最新补丁记录,再统计符合条件的实例数量。
可行查询方案
使用以下PromQL即可实现需求:
count( max by (instance) (windows_update_patch_state_time) > (time() - 31 * 86400) )
逻辑说明
max by (instance) (windows_update_patch_state_time):按instance维度聚合,取每个实例的最大补丁时间戳,也就是该实例最近一次打补丁的时间,自动过滤掉同一实例的旧补丁记录。> (time() - 31 * 86400):判断该最新补丁时间是否在31天以内(31*86400是31天对应的秒数),等价于原查询中时间差在0到31天的条件(补丁时间必然早于当前时间,所以无需额外判断>0)。count(...):统计所有符合条件的实例数量,确保每个实例只被计数一次。
内容的提问来源于stack exchange,提问作者Saf
相关产品推荐
相关产品推荐

