MySQL 查询
从实际使用场景出发,介绍夜莺 MySQL 数据源告警:用 SQL 直接查业务库做告警判定,以及值字段、标签字段、GROUP BY 分组告警的配置要点。
概述
MySQL 数据源告警直接用 SQL 查业务库或运维库做判定——不必先把业务数据 export 成指标,省掉采集层。适合业务实时监控(订单成功率、退款率)、数据完整性告警(表 N 分钟未更新)、异常状态扫描(按状态/等级筛选)等场景。
理解 MySQL 告警的关键,是理解 SQL 的表结构结果怎么映射成告警引擎能判定的时序数据——靠「值字段」和「标签字段」两个配置:
| 字段 | 必填 | 说明 |
|---|---|---|
| 数据源类型 / 数据源 | 是 | 选 MySQL 类型,并选中已接入的 MySQL 数据源 |
| SQL | 是 | 查询语句,支持模板变量(如 {{time_now}}、{{time_range}}) |
| 值字段 | 是 | SQL 结果的哪一列作为数值,用 $A.<列名> 在告警条件里引用 |
| 标签字段 | 否 | SQL 结果的哪些列作为告警事件的标签,通常是 GROUP BY 的分组列 |
| 告警条件 | 是 | 基于值字段写告警表达式,如 $A.count > 10 |
| 执行频率 | 是 | 多久跑一次 SQL,业务库建议 ≥ 1 分钟 |
值字段是数值、标签字段是字符串——这个区分决定了每列在告警表达式里能做什么运算,详见 告警表达式语法 的核心概念。
下面按实际使用场景介绍。
场景一:单条件告警——统计一个数值判阈值
最简单的模式:SQL 用聚合函数算出一个数,超过阈值就告警。比如「最近 5 分钟失败订单数 > 10」:
SELECT count(*) AS failed_count
FROM orders
WHERE status = 'failed'
AND created_at > NOW() - INTERVAL 5 MINUTE;
- 值字段选
failed_count; - 告警条件写
$A.failed_count > 10; - 不配标签字段,事件不带业务分组标签。
写完 SQL 点「数据预览」,确认返回的列名和值符合预期,再配阈值。
场景二:GROUP BY 分组告警——每个分组独立判定
想让每个业务维度(每个状态、每台机器、每个接口)单独告警,用 GROUP BY 分组,并把分组列设为标签字段。比如按订单状态分别统计:
SELECT status AS status, count(*) AS count
FROM orders
WHERE created_at > NOW() - INTERVAL 5 MINUTE
GROUP BY status;
- 值字段选
count; - 标签字段选
status; - 告警条件
$A.count > 100。
此时 SQL 返回几行,就有几条"伪时序"(每个 status 一条),告警引擎逐行独立判定——status=failed 和 status=timeout 会各自触发独立的告警事件,事件标签里带对应的 status。
场景三:多查询混合判定
同时对比多条 SQL 的结果,比如「取消金额占总金额 > 5%」。添加 $A、$B 两条查询,用表达式做混合运算:
-- $A:成功订单金额
SELECT SUM(order_amount) AS total FROM orders WHERE status = 'Payment Successful';
-- $B:取消订单金额
SELECT SUM(order_amount) AS canceled FROM orders WHERE status = 'Order Canceled';
告警条件:
$B.canceled / ($A.total + $B.canceled) * 100 > 5
更多 SQL 业务告警的表达式写法(算术、字符串匹配、时间戳新鲜度等),见 MySQL 告警举例。
常见问题
Q1:SQL 返回多行会怎样?
A:每行作为一条独立"伪时序",逐行判定告警。返回 10 行就最多产生 10 条告警事件。用 GROUP BY + 标签字段控制分组粒度。
Q2:值字段和标签字段怎么选?
A:要做数值比较的列(计数、金额、耗时)选值字段,用 $A.<列名> 引用;要作为告警分组维度或事件标签的列(状态、机器名、接口)选标签字段。同一列若既要比数值又要当标签,可在 SQL 里 SELECT 两次用不同别名。
Q3:SQL 里能用时间变量吗?
A:可以,支持模板变量 {{time_now}}(当前时间戳)、{{time_range}}(查询时间范围)等,用来动态限定查询窗口。
Q4:业务库压力大怎么办?
A:用只读副本而非主库;SQL 加 LIMIT 限制返回行数;执行频率从默认调到 1–5 分钟;复杂查询提前 explain;用专用只读账号隔离权限。