跳转至

在线管理慢检测与扫描器掉线策略

管理员在 Web 的 运行时配置 中调整两类独立策略:

  • 健康监控:Web API、PostgreSQL、ES 查询和 ES 写入的默认规则与具体操作覆盖。
  • 扫描器在线与告警:在线判定时间、掉线告警时间、检查间隔、维护结束宽限期以及通信延迟标识。

保存前显示差异预览;保存成功后当前实例立即更新,其他后端实例通常在 5 秒内同步监控策略。在线状态的 SQL 查询直接读取数据库中的已保存策略。配置无需重启,重启后继续使用数据库版本。

操作规则

表格显示服务、中文操作名称及稳定标识、警告阈值、严重阈值、冷却时间、继承来源和启用状态。可以按服务、继承/覆盖/关闭状态筛选,或搜索中文名称和操作标识。

具体操作覆盖优先于服务默认规则。点击 设置覆盖 将当前生效的整条规则复制为草稿;点击 恢复继承 删除该操作的覆盖,恢复当前服务默认值。删除覆盖不会恢复出厂值。所有草稿均在确认保存后生效。

警告阈值采用 耗时 >= 阈值。达到严重阈值时只生成严重告警,严重阈值留空表示不启用耗时严重级别。升级旧配置时,Web API 和 PostgreSQL 保留原有的仅警告行为,ES 保留原有的查询/写入双阈值。

健康监控总开关控制整套健康告警。服务或操作的慢检测开关仅影响耗时判定,关闭 ES 慢检测不会关闭 ES 失败告警;5xx 告警由单独开关控制。操作覆盖可开启一个默认关闭慢检测的服务中的具体操作。

同一告警键在冷却期内合并重复通知;从警告升级到严重时立即通知。冷却不影响请求日志的耗时采集。告警历史与邮件详情包含命中规则、阈值、冷却时间和配置版本;历史记录不会因新配置而改变。

Web API 标识是 请求方法 + 匹配路由模板,如 GET /api/task/{task_id},不同任务 ID 使用同一规则。目录由后端提供,管理员无需手填路径。新增 HTTP 路由时应同时更新 src/monitor/routes.rs;目录覆盖测试会检测遗漏。

ES 操作包括资产搜索、扫描结果查询、执行汇总、冲突检查、投影搜索、端点/域名筛选、标签更新及批量写入。维护类 ES 操作延续原有排除行为。

PostgreSQL 根据 pg_stat_statements 的查询标识进行覆盖,以相邻采样窗口增量中的平均执行耗时判定。它不是单次 SQL 执行计时,也尚未提供业务操作中文映射。目录需要启用该扩展及提供读取权限;不可用时显示提示,保留现有规则及可恢复历史中使用过的查询标识。SQL 文本不会出现在操作目录中。采样范围延续现有的高总耗时、高峰值查询集合。

扫描器策略

默认在线判定和掉线告警时间均为 90 秒,检查间隔 30 秒,维护结束宽限期 90 秒。掉线告警时间不能小于在线判定时间。默认心跳周期为 30 秒,在线判定时间至少为 60 秒;使用更长的自定义心跳周期时应相应提高阈值。

在线判定统一用于扫描器列表/详情、仪表盘及自动任务的可用扫描器查询。掉线通知从最后心跳时间计算,实际投递时间还受到检查周期和邮件发送耗时影响。任务租约、心跳发送周期和协议探测执行超时独立管理。

维护期间及维护结束宽限期内暂停掉线检测。禁用、删除、未开始心跳监控的扫描器不会触发掉线事件。同一持续掉线只创建一个事件,调整阈值不会重复创建;恢复心跳后取消尚未投递的掉线通知,恢复通知沿用已有的投递和去重机制。重复提醒未启用。

掉线和恢复邮件开关继续在系统设置的通知偏好中管理。通信延迟阈值用于列表和详情的颜色标识,过期样本显示为灰色。

保存、冲突与恢复

仅管理员可以读取操作目录、策略配置及配置历史,或保存配置。接口继续使用现有认证及 CSRF 保护。保存携带 expectedRevision,并在同一数据库事务中更新配置和历史;并发更新时返回 409。

前端保留冲突时的本地草稿,可以对照最新版本重新预览全部差异。检查差异时应确认草稿没有意外覆盖其他管理员的修改。最近 30 个历史版本可载入草稿;保存恢复后的配置会创建新版本,不会降低版本号。

本功能复用已有 runtime_configuration 与 runtime_configuration_revision 表。健康监控使用 monitor 配置域,新增 service_defaults 和 operation_rules;扫描器策略使用独立的 scanner_health 配置域,在启动时自动初始化,无需新增数据库表。

性能统计

请求性能页面同时显示按当前监控规则计算的慢请求率,以及固定 1 秒阈值的参考慢请求率。当前窗口和比较窗口使用同一份当前策略,已关闭慢检测的操作不计入策略慢请求;缺少路由模板的历史样本使用 Web API 默认规则。历史告警仍使用发生时的规则。

验证

后端执行 cargo fmt --check、cargo clippy --all-targets --locked 和 cargo test --locked。

新增数据库集成测试需要显式指定独立、可丢弃的 PostgreSQL 实例:

HEALTH_TEST_DATABASE_URL='host=127.0.0.1 port=5432 user=test dbname=test' cargo test --locked health_policy -- --ignored

测试使用随机独立 schema,验证并发保存、版本历史、实例刷新、在线判定、掉线去重、恢复取消通知及按操作规则计算的请求率。

前端执行 pnpm test:monitor 和 pnpm build,并检查继承/覆盖、保存预览、历史恢复、版本冲突、加载失败重试及移动端表格滚动。