en un clic
n9e-create-alert-rule
// 在夜莺(n9e)平台上创建告警规则。支持 Prometheus/Loki/ES/MySQL/TDengine/ClickHouse/Doris/Host 等所有数据源类型。
// 在夜莺(n9e)平台上创建告警规则。支持 Prometheus/Loki/ES/MySQL/TDengine/ClickHouse/Doris/Host 等所有数据源类型。
[HINT] Téléchargez le répertoire complet incluant SKILL.md et tous les fichiers associés
| name | n9e-create-alert-rule |
| description | 在夜莺(n9e)平台上创建告警规则。支持 Prometheus/Loki/ES/MySQL/TDengine/ClickHouse/Doris/Host 等所有数据源类型。 |
| max_iterations | 20 |
| builtin_tools | ["create_alert_rule","list_busi_groups","list_datasources","list_metrics","list_notify_rules","list_files","read_file","list_databases","list_tables","describe_table"] |
使用 create_alert_rule 工具创建告警规则。支持 Prometheus / Loki / Elasticsearch / OpenSearch / TDengine / ClickHouse / MySQL / PostgreSQL / Doris / VictoriaLogs / Host 全部数据源类型。
工具提供两种调用模式:
prom_ql + threshold + operator,工具自动构建 v2 rule_configcate + rule_config_json,rule_config_json 的结构先通过 read_file 读取 datasources/<cate>.md 获取模板,再填充实际值最常用的场景。只需填 PromQL、阈值、操作符。工具内部会把阈值拼进 prom_ql 生成 v1 格式的规则(OSS n9e 的 FE v2 编辑器被 IS_PLUS 门控,只能用 v1)。
{
"group_id": 1,
"name": "CPU 使用率过高",
"datasource_id": 1,
"prom_ql": "avg by (ident) (100 - cpu_usage_idle{cpu=\"cpu-total\"})",
"operator": ">",
"threshold": 80,
"severity": 2,
"note": "CPU 使用率超过 80% 持续 1 分钟",
"for_duration": 60
}
对 Loki / ES / MySQL / TDengine / ClickHouse / Doris / VictoriaLogs / Host 等类型,需传 cate 和 rule_config_json。
关键步骤:先读该数据源类型的参考文档,获取 rule_config 结构模板:
read_file(base="n9e-create-alert-rule", path="datasources/<cate>.md")
然后把文档中的 rule_config 对象转成 JSON 字符串传给 rule_config_json 参数。示例(MySQL 告警):
{
"group_id": 1,
"name": "MySQL 失败订单过多",
"cate": "mysql",
"datasource_id": 4,
"severity": 2,
"rule_config_json": "{\"queries\":[{\"ref\":\"A\",\"sql\":\"SELECT count(*) AS value FROM orders WHERE created_at >= NOW() - INTERVAL 5 MINUTE AND status='failed'\",\"keys\":{\"valueKey\":\"value\",\"labelKey\":\"\"},\"interval\":60}],\"triggers\":[{\"mode\":0,\"expressions\":[{\"ref\":\"A\",\"comparisonOperator\":\">\",\"value\":10,\"logicalOperator\":\"&&\"}],\"severity\":2,\"recover_config\":{\"judge_type\":1}}]}"
}
⚠️ 重要通用规则(所有非 Prometheus 类型都适用):
interval 字段必须是总秒数,不要写 interval_unit。前端保存时会把 value × unit → seconds,读取时再从秒数反推显示单位。
"interval": 60"interval": 300"interval": 3600"interval": 5, "interval_unit": "min" —— FE 会按 5 秒显示。interval_unit 或小于 60 的裸 interval,会自动换算成秒,但最好直接写对。⚠️ OSS n9e 的 SQL 类数据源(MySQL/PGSQL/CK/Doris)重要限制:
keys.valueKey 必填 —— SELECT 语句中数值列的别名,通常是 "value"。缺失会报 valueKey is required。$from/$to/$__timeFilter 不会被替换 —— OSS 的 macros.Macro 是 no-op。必须用数据源原生时间函数,例如 MySQL 用 NOW() - INTERVAL 5 MINUTE、PG 用 NOW() - INTERVAL '5 minutes'、CK 用 now() - INTERVAL 5 MINUTE。$from/$to/$interval 可用。| 字段 | 必填 | 说明 |
|---|---|---|
group_id | ✅ | 业务组 ID(从 list_busi_groups 获取) |
name | ✅ | 规则名称(同业务组内不能重名) |
cate | ❌ | 数据源类型(默认 prometheus)。可选:prometheus / loki / elasticsearch / opensearch / tdengine / ck / mysql / pgsql / doris / victorialogs / host |
prod | ❌ | 产品类型。不传时按 cate 自动推导 |
datasource_id | 条件必填 | 数据源 ID。cate=host 时不需要,其他都必填 |
rule_config_json | 条件必填 | 完整的 rule_config JSON 字符串。cate=prometheus 时可以不传(走简化路径);其他类型必填 |
prom_ql | 条件必填 | PromQL 查询(仅 cate=prometheus 简化路径用)。只写查询不写阈值 |
threshold | 条件必填 | 触发阈值(仅简化路径用) |
operator | ❌ | 默认 >。可选 > >= < <= == != |
severity | ❌ | 默认 2。1=Critical, 2=Warning, 3=Info |
note | ❌ | 告警通知正文 |
eval_interval | ❌ | 评估周期(秒),默认 30 |
for_duration | ❌ | 持续时长(秒),默认 60 |
append_tags | ❌ | 附加标签,多个用空格分隔 |
runbook_url | ❌ | 应急处理手册 URL |
notify_rule_ids | ❌ | 关联通知规则 ID 列表 JSON,如 "[1,2]" |
根据用户的告警需求判断应该用哪个 cate:
| 用户诉求关键词 | cate | 触发条件 |
|---|---|---|
| "主机 CPU/内存/磁盘"、"Prometheus 指标" | prometheus | 指标阈值 |
| "机器失联"、"节点离线" | host | 心跳超时 |
| "应用错误日志"、"Loki 日志" | loki | 日志条数 |
| "ES 日志"、"Elasticsearch 聚合" | elasticsearch | 日志聚合 |
| "OpenSearch 日志" | opensearch | 日志聚合(同 ES) |
| "MySQL 查询结果异常" | mysql | SQL 查询值 |
| "PostgreSQL 查询结果异常" | pgsql | SQL 查询值 |
| "ClickHouse 指标/日志" | ck | SQL 查询值 |
| "Doris 日志" | doris | SQL 查询值 |
| "TDengine 时序数据" | tdengine | SQL 查询值 |
| "VictoriaLogs 日志" | victorialogs | LogsQL 查询 |
默认值:prometheus。
list_busi_groups 获取业务组列表cate != "host":调用 list_datasources 找到对应类型的数据源 IDis_default: true 的业务组
b. 只有一个业务组时直接用
c. 多个候选都不是默认组时,列出选项让用户确认test、demo、tmp)对于 cate != "prometheus" 的类型,必须先读该类型的参考文档获取 rule_config 结构:
read_file(base="n9e-create-alert-rule", path="datasources/<cate>.md")
例如:
datasources/mysql.mddatasources/loki.mddatasources/host.md参考文档里有完整的字段说明、可选值表格、完整示例。按示例里的 rule_config 对象照搬字段名,只替换具体值。
cate ∈ {mysql, pgsql, ck, doris, tdengine} 时这一步必须做,不可跳过。
TDengine 也支持:虽然 TDengine 是时序数据库,但它的 REST API 支持
SHOW DATABASES/information_schema.ins_tables/information_schema.ins_columns。list_databases/list_tables/describe_table对 TDengine 完全可用。
绝对不要凭用户提示词里的字面描述猜数据库/表/字段名。用户说"查 my_logs 库的 access_log 表" 很可能只是举例,实际数据源里根本没这个库或这个表。
必须按顺序探测:
list_databases(datasource_id=<X>) —— 看真实的数据库列表
list_tables(datasource_id=<X>, database=<挑中的库>) —— 看真实的表列表
describe_table(datasource_id=<X>, database=<库>, table=<表>) —— 拿真实字段
log_time、status、created_at 之类
常见字段名(它们未必真的存在于这张表)ts、event_time、log_time、create_time、
timestamp 等等,必须用 describe_table 返回的字段名决定只有在拿到真实 schema 后,才能进入第四步拼 SQL。
datasource_id 可省略,
从会话上下文继承datasource_id,
否则工具会报 datasource_id required 错误根据用户描述构建 不带阈值 的 PromQL:
| 用户需求 | 推荐 PromQL |
|---|---|
| 主机 CPU 使用率 | avg by (ident) (100 - cpu_usage_idle{cpu="cpu-total"}) |
| 主机内存使用率 | mem_used_percent |
| 主机磁盘使用率 | disk_used_percent |
| 主机系统负载 | system_load1 |
| 主机网络入向流量 | rate(net_bytes_recv[5m]) |
| MySQL QPS | rate(mysql_global_status_queries[5m]) |
| MySQL 连接数使用率 | mysql_global_status_threads_connected / mysql_global_variables_max_connections * 100 |
| Redis 内存使用率 | redis_used_memory / redis_maxmemory * 100 |
如不确定指标是否存在,调用 list_metrics 探测。
按照第三步读到的参考文档,组装 rule_config 对象。关键字段:
value 作为告警判断值keys.valueKey: "value"(缺失 → valueKey is required 错误)$from/$to,要用数据源原生时间函数:
NOW() - INTERVAL 5 MINUTENOW() - INTERVAL '5 minutes'now() - INTERVAL 5 MINUTENOW() - INTERVAL 5 MINUTE$from/$to/$interval 可以用,用 keys.metricKey 而不是 keys.valueKeyrecover_config.judge_type 用 0recover_config.judge_type 用 1queries 是 {key, op, values} 结构;triggers 是 {type, severity, duration} 结构;不需要 datasource_idcreate_alert_rule(
group_id=1, name="CPU 过高", datasource_id=1,
prom_ql="avg by (ident) (100 - cpu_usage_idle{cpu=\"cpu-total\"})",
threshold=80, operator=">", severity=2
)
create_alert_rule(
group_id=1, name="MySQL 错误过多",
cate="mysql", datasource_id=4, severity=2,
rule_config_json="<把第三步读到的 rule_config 序列化成 JSON 字符串>"
)
注意事项:
threshold,不要写进 prom_qlfor_duration=60,比 eval_interval=30 大才合理for_duration 设为 0create_alert_rule 返回 already exists 错误,不要调用 list_alert_rules 去查重名,直接给名字加后缀(如 -v2、-AI 或时间戳)重试rule_config_json 必须是 JSON 字符串(不是对象),记得对引号做转义list_databases+list_tables+describe_table 核实过,
告警规则大概率无法运行(Unknown database / Unknown column 等运行时错误)如果用户要求绑定通知规则:
list_notify_rules 获取通知规则列表create_alert_rule 时传入 notify_rule_ids,如 "[1,2]"如果用户没明确要求,不要主动关联通知规则,避免误发告警。
保持简短。只需一句话确认告警规则已创建,例如:
✅ 已为您创建告警规则「主机 CPU 使用率过高」,详情请查看下方卡片。
不要在 Final Answer 里复述规则 ID、业务组、数据源、PromQL、阈值、告警级别等字段——前端会以结构化卡片展示这些信息,重复输出只会让用户看到两份。如果需要补充说明(例如"已按您的要求关联了 XX 通知规则"或"建议稍后手动检查一下标签"),可以再加一两句,但不要把卡片里已有的字段逐条列出来。
| severity | 中文 | 适用场景 |
|---|---|---|
| 1 | Critical(一级) | 服务不可用、核心组件宕机、数据丢失 |
| 2 | Warning(二级) | 资源使用率高、性能退化、配额接近上限 |
| 3 | Info(三级) | 信息性告警、容量规划提示 |
默认用 2(Warning)。除非用户明确说"严重"或"紧急"才用 1。
{
"group_id": 1,
"name": "主机 CPU 使用率过高",
"datasource_id": 1,
"prom_ql": "avg by (ident) (100 - cpu_usage_idle{cpu=\"cpu-total\"})",
"operator": ">",
"threshold": 80,
"severity": 2,
"for_duration": 300,
"note": "主机 {{ $labels.ident }} CPU 使用率持续 5 分钟超过 80%"
}
{
"group_id": 1,
"name": "主机内存使用率过高",
"datasource_id": 1,
"prom_ql": "mem_used_percent",
"operator": ">",
"threshold": 90,
"severity": 1,
"for_duration": 180
}
{
"group_id": 1,
"name": "主机磁盘使用率过高",
"datasource_id": 1,
"prom_ql": "disk_used_percent",
"operator": ">",
"threshold": 85,
"severity": 2,
"for_duration": 600,
"append_tags": "alert_type=capacity"
}