MySQL 查询
场景一:配置MySQL单条件告警规则
值字段
在查询条件 SQL 语句中,选择你想要的列名作为查询结果的值字段。如下图所示,我将 count(*) 起个别名 count ,将别名 count 作为值字段取 A 这个查询条件的结果。

标签字段
使用 GROUP BY 字段作为标签字段,告警将以此字段进行分组告警。
场景二:将过滤字段放在 where 进行过滤
如下面的查询语句:计算 severity 等级为 1、2、3的活跃告警数量。
SELECT COUNT(*) AS count FROM n9e_v6.alert_cur_event WHERE severity IN (1,2,3);

最终产生告警时,只会展现 count 值。

场景三:将过滤字段放在 where 进行过滤并分组告警
查询条件设置为以 severity 分组,并将 severity 设定为标签字段
SELECT severity as severity,COUNT(*) AS count FROM n9e_v6.alert_cur_event WHERE severity IN (1,2,3) GROUP BY severity;

通过报警时间与数据预览对比发现,使用 severity 分组后,告警会根据标签字段进行分组告警。


场景四:多查询条件表达式模式
配置多条查询条件 sql ,并将两个查询条件的结果进行阈值告警。


场景五:根据时间分表的查询
在实际业务中,为了提高查询性能和便于数据管理,经常会对数据表按时间进行分表。Nightingale 支持在 SQL 语句中使用 Go 模板语法,可以动态生成表名来查询时间分表。
5.1 按日分表查询
假设日志表按天分表,表名格式为 logs_20260119、logs_20260120 等。可以使用 Timestamp 函数动态生成今天的表名:
SELECT COUNT(*) AS count FROM logs_{{Timestamp "20060102"}} WHERE level = 'error';
{{Timestamp "20060102"}}会被渲染为当前日期,格式为yyyyMMdd- 例如今天是 2026年1月19日,SQL 会被渲染为:
SELECT COUNT(*) AS count FROM logs_20260119 WHERE level = 'error';
5.2 按月分表查询
如果表按月分表,表名格式为 orders_202601、orders_202602 等:
SELECT SUM(amount) AS total_amount FROM orders_{{Timestamp "200601"}} WHERE status = 'completed';
{{Timestamp "200601"}}会被渲染为当前年月,格式为yyyyMM- 例如今天是 2026年1月,SQL 会被渲染为:
SELECT SUM(amount) AS total_amount FROM orders_202601 WHERE status = 'completed';
5.3 按年分表查询
对于按年分表的场景,表名格式为 archive_2026、archive_2025 等:
SELECT COUNT(*) AS record_count FROM archive_{{Timestamp "2006"}} GROUP BY category;
{{Timestamp "2006"}}会被渲染为当前年份- 例如今天是 2026年,SQL 会被渲染为:
SELECT COUNT(*) AS record_count FROM archive_2026 GROUP BY category;
注意事项
-
时间格式说明:Go 语言的时间格式化使用特殊的参考时间
2006-01-02 15:04:05,不同于其他语言的格式化方式2006- 年份(4位)01- 月份(2位)02- 日期(2位)15- 小时(24小时制)04- 分钟05- 秒
-
表不存在的情况:如果分表不存在(例如当月第一天查询上月的表),查询会失败并产生告警,需要在 SQL 中做好容错处理