目录
2.2 查询Label="alertname"的value值
1. 前言
前面通过玩转prometheus系列,接入生产环境中的监控告警后,遇到一个需求,将alertmanager告警数据入mysql后,要提取汇总同个表中中告警较多的告警类型和主机,表结构如下
Field Type Comment
ID int(11) NOT NULL
AlertID int(11) NOT NULL
Label varchar(100) NOT NULL
Value varchar(1000) NOT NULL
说明:
- alertid 同一个id对应多个Label和value
- 需求:查询同一个alertid下Label="instance"和Label="alertname"的value值,表示统计告警类型对应的实例主机
2. 解决思路
先分别单独查询Label="instance"和Label="alertname"的value值
2.1 查询Label="instance"的value值
SELECT `AlertID`, label, `value` FROM `alertlabel`
WHERE label='instance'
GROUP BY `AlertID`
2.2 查询Label="alertname"的value值
SELECT `AlertID`, label, `value` FROM `alertlabel`
WHERE label='alertname'
GROUP BY `AlertID`
2.3 解决方向
将同一张表两个不同查询的值连接在一起,想到了concat()函数、union操作符及join表查询
concat()函数用于将两个或多个字符串连接在一起,不符合需求
union操作符 用于连接两个以上select语句的结果组合到一个结果集合中,从功能描述中比较符合需求,但是查询返回的数据不大符合需求,如图
SELECT `AlertID`, label, `value` FROM `alertlabel`
WHERE label='instance'
GROUP BY `AlertID`
UNION
SELECT `AlertID`, label, `value` FROM `alertlabel`
WHERE label='alertname'
GROUP BY `AlertID`
join 用于在两个或多个表中查询数据,貌似是最符合的,测试也确实是达到需求
3. 解决方案
通过使用join表查询,将同一张表重命名为a表和b表,并指定条件label='instance' 和label='alertname'
SELECT DISTINCT a.`value` ,b.`value` FROM `alertlabel` a JOIN `alertlabel` b ON a.alertid = b.alertid AND a.label='instance' AND b.label='alertname';
查询结果如下
实现了将两个查询结果关联并输出到结果中