概述 — 本页面的作用
基础设施 ▸ 告警(/infra/alert)是 告警组(策略)控制台。运维人员将 四个领域(系统 / Web / 数据库 / 安全) 的条件添加到同一条策略(infr_alert_policy)中,在界面上调整每个阈值 系数(factor);一旦发生违规,该组的 接收人(infr_alert_recipient)会自动收到短信/邮件通知。
它取代了旧的“容量与告警”页面(/infra/capacity),该地址现在会重定向到此处。
主要特点:
- 一条策略就是一个监控包:严重级别、重复告警抑制(冷却)、领域、条件、通道和接收人全部集中在一张卡片上。可按团队或班次拆分建立多条策略(例如“基础设施夜班值守”“安全运营”)。
- 评估与派发相分离:
AlertEvaluator负责评估条件,AlertDispatcher负责开启告警并发送。控制台的 [立即检查] 按钮和计划任务命令infr:eval-alerts共用这两者。 - 去重、冷却、批量、自动关闭:重复违规会合并为一条告警,冷却期内抑制重复发送,一条策略的通知会合并为一条消息(防止短信轰炸),违规消除后告警自动关闭。
- 只读实时数据:系统数据来自
server_status,数据库数据来自infr_db_metric,安全数据来自legacy_glory上的检测表,Web 数据来自实时 HTTP 探测。Web 证书到期检查会全局扫描infr_web_cert。
本页面只管理 策略、告警和投递历史。单台服务器的图表请见 服务器;Web 可用性请见 服务 ▸ Web;数据库负载请见 服务 ▸ 数据库。阈值默认值在 运维策略 中定义。
何时使用
- 希望在服务器的 平均负载或磁盘剩余空间 越过危险线时立即得到通知。
- 希望在着陆页 URL 不可用(状态码不符合预期/无响应) 或 响应缓慢 时通知值班人员。
- 希望持续监视已注册 Web 服务的 TLS 自动续期失败(证书即将到期)。
- 希望在已注册数据库的 等待队列积压或每小时慢查询数激增 时收到告警。
- 希望把违规信号广播给团队:IDS 告警激增、AI 异常封禁激增、新增封禁 IP 激增。
界面布局
策略卡片网格
每条策略渲染为一张卡片,概括其 启用开关、严重级别徽章、已启用的领域和接收人数量,并提供以下操作:
| 操作 | 说明 | 权限 |
|---|---|---|
| 启用/暂停开关 | is_active — 计划任务是否评估该策略 |
级别≥2 |
| 编辑 | 领域、条件、通道、接收人的模态框 | 级别≥2 |
| 立即检查 | 立刻评估并派发本策略(run) |
级别≥2 |
| 测试 | 立即向接收人发送测试邮件/短信(test) |
级别≥2 |
| 删除 | 删除策略及其接收人 | 级别≥2 |
| 拖拽排序 | 显示/评估顺序(seq, reorder) |
级别≥2 |
编辑模态框(领域、条件、通道、接收人)
- 基本信息:名称、严重级别(info/warn/crit)、重复告警抑制(分钟)、启用、备注。
- 告警领域:启用 系统 / Web / 数据库 / 安全(系统默认启用)。
- 条件:对每个已启用的领域,设置 开/关 + 阈值系数(参见下方条件目录)。
- 通道:短信和邮件。实际投递需要在 邮件适配器/短信适配器 中配置服务商;未配置服务商时卡片会给出警告。
- 接收人(可重复项):姓名、邮箱、电话 +
via_mail/via_sms勾选。实际生效的通道是 策略通道 ∩ 接收人 via_* 的交集。
最近告警信息流
按 last_seen 倒序显示 infr_alert,最多 60 行(30 秒轮询)。每行显示观测值、阈值、聚合的 count 以及发送成功数/总数(来自 infr_alert_delivery),并提供 [确认] 和 [关闭] 状态流转。
使用方法
1) 创建策略
- [新建告警组] → 输入名称、严重级别、冷却时间。
- 启用希望监视的 领域。
- 为每个领域启用 条件 并调整阈值系数。默认值由 运维策略 的
alertDefaults()预填。 - 选择 通道(短信/邮件)并添加 接收人。
- 保存。
2) 条件目录
系统(server_status,seq 窗口)
| 条件 | 开关 | 系数 | 默认值 | 产生的指标 |
|---|---|---|---|---|
| 平均负载超过 | sys_load_on |
sys_load_max |
20 | load_avg(>20,按服务器) |
| 磁盘剩余低于 | sys_disk_on |
sys_disk_free_mb |
500 | disk_free(<500MB) |
- 目标默认是 全部服务器(
targets.system.all=true);也可以缩小到选定的 alias(最多 200 个)。 - 快照只读取最新的 seq 窗口(
distinct seq desc limit 3)以避免慢查询(继承自 HealthService)。离线/无数据的服务器不参与判定 — 服务器必须在最近 2 个周期内有loadavg才算在线。 - 磁盘剩余取
df-,df-data,df-home中 最紧张的 分区(DfParse::availableGb)。
Web(实时 HTTP 探测 · infr_web_cert)
| 条件 | 开关 | 系数 | 默认值 | 产生的指标 |
|---|---|---|---|---|
| 服务不可用(状态码 ≠ 预期) | web_code_on |
web_expect_code |
200 | http_status |
| 延迟超过 | web_latency_on |
web_latency_ms |
5000 | latency |
| 证书即将到期 | web_cert_on |
web_cert_hours |
48 | cert_expiry |
- 目标 URL 来自
targets.web.urls[](带标签,每条策略最多 30 个)。每个评估周期都会通过Http::connectTimeout(4)->withoutVerifying()->get()直接请求它们。状态码与预期不符,或者出现 连接失败/超时,都会被视为服务不可用(在启用状态码条件时)。 - 证书到期只有一个开关,但扫描是全局的:它与策略的目标 URL 无关,会遍历 每个已注册 Web 服务的每个域名 对应的
infr_web_cert记录,并为每个在阈值(web_cert_hours,默认 48 小时)内到期的域名产生一次违规 — 每次评估最多 50 条。证书由 WebProbeService 以 6 小时轮转刷新。这样可以在到期让所有人措手不及之前,先发现自动续期失败。
只要启用“证书即将到期”,就会监视所有站点的证书。它不是按站点生效的 — 而是覆盖全部域名的全局扫描。
数据库(infr_db_metric 最新样本)
| 条件 | 开关 | 系数 | 默认值 | 产生的指标 |
|---|---|---|---|---|
| 等待队列上升 | db_waiting_on |
db_waiting_max |
5 | db_waiting(>=5) |
| 每小时慢查询 | db_slow_on |
db_slow_per_hour |
60 | db_slow(slow_qps×3600 >= 60) |
- 目标为
targets.database.collectors[](access=database 的采集器键)。如果没有选择任何目标,则不会评估任何内容。 - 它读取
DbCollectorService::latest($collector),但只判定状态为ok且 不超过 10 分钟 的样本(避免陈旧数据造成误报)。请在 DB 采集器 中注册与采集。
安全(legacy_glory 检测表 · 复合)
评估窗口为 sec_window_min(默认 10 分钟)。任意一个信号超过其阈值即触发违规。
| 条件 | 开关 | 系数 | 默认值 | 数据源 |
|---|---|---|---|---|
| IDS 严重级别 + 数量 | sec_ids_on |
sec_ids_severity, sec_ids_count |
2, 20 | suricata_alert_ct(严重级别≥S,窗口内数量≥N) |
| AI 异常封禁激增 | sec_kitsune_on |
sec_kitsune_count |
5 | kitsune_detail_log(is_blocked=1,数量≥N) |
| 新增封禁 IP 激增 | sec_blacklist_on |
sec_blacklist_count |
10 | blacklist_info(窗口内新的 created_at,数量≥N) |
3) 立即检查/测试
- [立即检查](
run):对这一条策略立刻执行evaluate()→handle(),返回违规/发送摘要(breaches :b · sent :s)以及刷新后的信息流。用它可以不等计划任务就确认某个条件确实会触发。 - [测试](
test):立即向启用的接收人发送测试邮件/短信,确认通道可用(与是否有违规无关 — 这是一次服务商健康检查)。
4) 自动评估(计划任务)
启用的策略每分钟自动评估并派发。
Schedule::command('infr:eval-alerts --quiet-if-ok')
->everyMinute()
->withoutOverlapping(2)
->onOneServer()
->when($is_leader);
手动运行:
# 评估所有启用的策略(单次执行,执行完即退出 — 不是守护进程)
php artisan infr:eval-alerts
# 只评估某一条策略
php artisan infr:eval-alerts --policy=12
# 无违规时不输出(计划任务默认)
php artisan infr:eval-alerts --quiet-if-ok
infr:eval-alerts是一条 执行完即退出的单次命令(遍历策略后返回)。绝不要把它改成无限循环的守护进程 — 从计划任务中启动永不退出的守护进程会耗尽共享数据库连接(参见 pulse:check 连接泄漏的教训)。计划任务每分钟安全地启动一个新实例。
数据来源
写入表(新增 infr_)
| 表 | 迁移 | 作用 |
|---|---|---|
infr_alert_policy |
000700 | 告警组(策略)。scopes/targets/conditions/channels JSON + 严重级别、cooldown_min、seq |
infr_alert_recipient |
000701 | 每条策略的接收人(内联)。email/phone + via_mail/via_sms/is_active/seq |
infr_alert |
000702 | 告警实例(触发日志/处置队列)。去重键 (policy_id, metric, entity_key, status='open'),notified_at 冷却 |
infr_alert_delivery |
000703 | 投递历史。channel/address/ok/provider_code/message_id/error/latency_ms |
读取来源(遗留 + 新增,只读)
- 系统:
server_status(legacy连接,part=loadavg/df-*)。 - Web:实时 HTTP GET(目标 URL)+
infr_web_cert(证书到期)。 - 数据库:
infr_db_metric(由 access=database 的采集器填充)。 - 安全:
legacy_glory上的suricata_alert_ct,kitsune_detail_log,blacklist_info。
去重/冷却/自动关闭流程
AlertEvaluator::evaluate($policy)→ 按每个启用领域返回违规候选数组。各领域的异常相互隔离(一个领域失败不会阻塞其余领域)。AlertDispatcher::handle($policy, $breaches):- 每条违规按
(policy_id, metric, entity_key, status=open)查找 → 找到则更新并count++;否则插入新记录(first_seen、count=1、notified_at=null)。 - 可通知 = 新记录 或
notified_at为 null 或notified_at <= now - cooldown_min。 - 自动关闭:本策略中未出现在本轮违规里的未关闭告警 →
status='closed'。 - 批量发送:可通知的告警会按接收人、按通道合并为 一条消息(正文最多 8 行,超出部分显示“+N more”;短信截断至 140 字符)。发送后,将各目标的
notified_at=now。 - 每个(接收人,通道)组合写入一行
infr_alert_delivery。
- 每条违规按
访问权限
| 操作 | 最低级别 | 审计 |
|---|---|---|
| 查看控制台/列表/信息流(index/list/feed) | 1(读) | — |
| 保存/删除/排序策略(save/delete/reorder) | 2(写) | alert_policy.create / .update / .delete |
| 告警确认/关闭 | 2 | alert.ack / alert.closed |
| 立即检查(run) | 2 | 发送时记录 alert.fire |
| 测试发送(test) | 2 | alert.test |
| 计划任务自动发送 | (系统) | alert.fire |
级别刻度:demo=1 · staff=5 · admin=10。读取需要级别≥1;写入与派发需要级别≥2。所有破坏性/派发操作都会记录到 infr_audit_log(参见 审计日志)。投递通道的服务商由管理员配置(级别≥10)。
故障排查与常见问题
Q. 我启用了条件,但收不到告警。
- 确认策略处于 启用 状态,并且计划任务(
schedule:work/生产环境的进程守护)正在运行。 - 没有通道服务商 — 查看卡片上的警告,在 邮件适配器/短信适配器 中配置默认服务商。
- 确认接收人的
via_mail/via_sms与策略通道的 交集 非空,并且邮箱/电话已填写。 - 在 冷却期 内会抑制重复发送(
cooldown_min,默认 30 分钟)。可以用 [立即检查] 立刻验证,但已通知过的告警只有在冷却期过后才会再次发送。
Q. 我的数据库/系统条件一直不触发。
- 系统:目标服务器必须 在线(最近 2 个 seq 周期内有 loadavg)才会被判定。离线/无数据会被跳过。
- 数据库:
infr_db_metric的最新样本必须 状态为 ok 且不超过 10 分钟。请在 DB 采集器 中确认采集器正在运行。
Q. 证书到期只监视某个特定站点吗?
- 不是。
web_cert_on是 全局扫描 — 它与策略的目标 URL 无关,会遍历每个已注册 Web 服务的每个域名的infr_web_cert。
Q. 同一个违规会不断堆积吗?
- 不会。它会按
(policy_id, metric, entity_key)聚合到同一条未关闭的告警上(count++)。违规消除后,下一次评估会自动将其置为closed。
Q. Web 探测会拖慢评估吗?
- 每条策略的 URL 上限为 30 个,连接超时为 4 秒,并带有基于延迟的短超时。系统快照只读取 seq 窗口以避免慢查询。
相关内容
- 运维策略 — 定义阈值默认值(
alertDefaults()) - 邮件适配器 · 短信适配器 — 投递通道服务商
- 服务 ▸ Web — 证书/可用性数据源(
infr_web_cert) - DB 采集器 — 数据库条件数据源(
infr_db_metric) - 服务器 · 健康状态 — 系统条件数据源(
server_status) - 威胁 · 封禁列表 — 安全条件数据源
