Trigger
Trigger 允许用户基于 SQL 语句定义触发规则,GreptimeDB 根据这些触发规则进行周期性 计算,当满足条件后对外发出通知。
关键特性
- SQL 原生:用 SQL 定义触发规则,复用 GreptimeDB 内置函数,无需额外学习成本
- 多阶段状态管理:内置 pending / firing / inactive 状态机,防止抖动和重复 通知
- 丰富的上下文:自定义 labels 和 annotations,并自动注入查询结果字段,便于精 准定位根因
- 生态友好:告警负载完全兼容 Prometheus Alertmanager,可直接使用其分组、抑制、 静默和路由功能
快速入门示例
本节通过端到端示例展示如何监控系统负载(load1),当负载超过阈值时触发告警。
在本示例中你将:
- 创建指标表:建立
load1表存储主机负载指标 - 定义 Trigger:通过 SQL 设定触发条件,配置 labels、annotations 及通知方式
- 模拟数据写入:依次注入正常与异常的负载数据,激活告警逻辑
- 观察状态变化:实时查看告警实例从 pending → firing → inactive 的完整生命周期
1. 创建数据表
使用 MySQL 客户端连接 GreptimeDB,并创建 load1 表:
CREATE TABLE `load1` (
host STRING,
load1 FLOAT32,
ts TIMESTAMP TIME INDEX
) WITH ('append_mode'='true');
2. 创建 Trigger
使用 MySQL 客户端连接 GreptimeDB,并创建 load1_monitor Trigger:
CREATE TRIGGER IF NOT EXISTS `load1_monitor`
ON (
SELECT
host AS label_host,
avg(load1) AS avg_load1,
max(ts) AS ts
FROM public.load1
WHERE ts >= NOW() - '1 minutes'::INTERVAL
GROUP BY host
HAVING avg(load1) > 10
) EVERY '1 minutes'::INTERVAL
FOR '3 minutes'::INTERVAL
KEEP FIRING FOR '3 minutes'::INTERVAL
LABELS (severity=warning)
ANNOTATIONS (comment='Your computer is smoking, should take a break.')
NOTIFY(
WEBHOOK alert_manager URL 'http://localhost:9093' WITH (timeout='1m')
);
该 Trigger 每分钟运行一次,计算过去 60 秒内每台主机的平均负载,并为每个满足
avg(load1) > 10 的主机生成告警实例。
关键参数说明:
- FOR:指定条件需要持续多 久才会进入 firing 状态
- KEEP FIRING FOR:指定条件不再满足后,告警实例在 firing 状态保持多久
详见 Trigger 语法。
3. 查看 Trigger 状态
列出所有 Trigger
SHOW TRIGGERS;
输出:
+---------------+
| Triggers |
+---------------+
| load1_monitor |
+---------------+
查看创建语句
SHOW CREATE TRIGGER `load1_monitor`\G
输出:
*************************** 1. row ***************************
Trigger: load1_monitor
Create Trigger: CREATE TRIGGER IF NOT EXISTS `load1_monitor`
ON (SELECT host AS label_host, avg(load1) AS avg_load1 ...) EVERY '1 minutes'::INTERVAL
FOR '3 minutes'::INTERVAL
KEEP FIRING FOR '3 minutes'::INTERVAL
LABELS (severity = 'warning')
ANNOTATIONS (comment = 'Your computer is smoking, should take a break.')
NOTIFY(
WEBHOOK `alert_manager` URL `http://localhost:9093` WITH (timeout = '1m'),
)
查看 Trigger 详情
SELECT * FROM information_schema.triggers\G
输出:
*************************** 1. row ***************************
trigger_name: load1_monitor
trigger_id: 1024
raw_sql: (SELECT host AS label_host, avg(load1) AS avg_load1, ...)
interval: 60
labels: {"severity":"warning"}
annotations: {"comment":"Your computer is smoking, should take a break."}
for: 180
keep_firing_for: 180
channels: [{"channel_type":{"Webhook":{"opts":{"timeout":"1m"}, ...}]
flownode_id: 0
关于更多字段说明,参见 Triggers。
查看 告警实例
SELECT * FROM information_schema.alerts;
如果尚未写入数据,将返回空结果。
关于更多字段说明,参见 Alerts。