如何在Grafana(PostgreSQL数据源)统计未安装指定包的主机数量?
解决PostgreSQL数据源Grafana统计未安装指定包的服务器数量问题
核心思路
要统计未安装abc包的服务器,关键是排除所有至少有一条abc包已安装记录的服务器——哪怕某服务器有abc包的未安装版本记录,但只要存在已安装项,就不算未安装。
假设表结构
先明确常见的包管理表结构(如果你的表字段不同,对应调整即可):
- 表名:
server_packages - 关键字段:
server_name(服务器名称)、package_name(包名)、install_status(安装状态,如installed/missing)
正确SQL语句
情况1:只有包记录表,无单独服务器表
SELECT COUNT(DISTINCT sp.server_name) AS missing_abc_count FROM server_packages sp WHERE sp.server_name NOT IN ( -- 先找出所有已安装abc包的服务器 SELECT DISTINCT server_name FROM server_packages WHERE package_name = 'abc' AND install_status = 'installed' )
情况2:有单独的服务器列表(如servers表)
这种方式效率更高,直接从服务器表关联查询:
SELECT COUNT(s.server_name) AS missing_abc_count FROM servers s LEFT JOIN server_packages sp ON s.server_name = sp.server_name AND sp.package_name = 'abc' AND sp.install_status = 'installed' -- 关联后无匹配记录,说明该服务器未安装abc包 WHERE sp.server_name IS NULL
常见错误原因
你之前的SQL大概率犯了以下某类错误:
- 直接用
WHERE package_name != 'abc'统计:会把已安装abc的服务器的其他包记录也纳入统计,导致结果虚高 - 未对服务器名称去重:同一服务器的多条非
abc包记录会被重复计数 - 没过滤
install_status:把abc包的未安装版本记录当成了“未安装该包”,忽略了服务器已存在已安装的abc项
Grafana配置
把上述SQL作为数据源查询,然后用Stat面板展示返回的missing_abc_count字段即可。
内容的提问来源于stack exchange,提问作者pavithra
相关产品推荐
相关产品推荐

