1
0
Files
DiAL/openspec/specs/probe-config/spec.md
lanyuanxiaoyao b8810f1182 feat: 重构为多类型 checker 通用框架,支持 HTTP 与命令检查
- 引入 typed target 判别联合,支持 http 与 command 两种 checker
- expect 重构为有序规则数组,按配置顺序快速失败并生成结构化 failure
- 新增 command runner,支持 exec + args 本地命令执行
- 引入全局并发限制 maxConcurrentChecks 和 size 解析 (KB/MB/GB)
- HTTP/command 各自独立 expect pipeline,应用领域默认成功语义
- SQLite schema、API、Dashboard 全链路调整为 checker 通用契约
- 补充完整测试覆盖(192 tests),更新 README 与示例配置
2026-05-10 22:25:21 +08:00

6.4 KiB
Raw Blame History

Purpose

定义 HTTP 拨测工具的 YAML 配置文件格式、解析校验规则和 CLI 启动流程。

Requirements

Requirement: YAML 配置文件格式

系统 SHALL 支持通过 YAML 配置文件定义全部运行参数,包括 server 配置、runtime 配置、checker 默认值和 typed target 列表。target MUST 使用 type 字段声明 checker 类型HTTP 领域字段 MUST 放在 http 分组command 领域字段 MUST 放在 command 分组。

Scenario: 完整配置文件解析

  • WHEN 系统启动并读取包含 server、runtime、defaults、targets 的 YAML 配置文件
  • THEN 系统 SHALL 正确解析所有字段并用于初始化服务、调度引擎和对应 checker runner

Scenario: 最简 HTTP 配置文件解析

  • WHEN 系统读取只包含一个 type: http target 和 http.url 的 YAML 配置文件(省略 server、runtime、defaults 和 expect
  • THEN 系统 SHALL 使用内置默认值填充未指定的字段host=127.0.0.1, port=3000, dir=./data, interval=30s, timeout=10s, runtime.maxConcurrentChecks=20, http.method=GET, http.maxBodyBytes=100MB

Scenario: 最简 command 配置文件解析

  • WHEN 系统读取只包含一个 type: command target 和 command.exec 的 YAML 配置文件
  • THEN 系统 SHALL 使用内置默认值填充未指定的字段interval=30s, timeout=10s, command.cwd 为配置文件所在目录, command.maxOutputBytes=100MB

Scenario: per-target 配置覆盖全局默认值

  • WHEN 某个 target 指定 interval、timeout 或对应领域分组中的默认字段
  • THEN 该 target SHALL 使用其自身的值,不受 defaults 中对应字段影响

Requirement: CLI 参数

系统 SHALL 通过单一命令行参数接受 YAML 配置文件路径。

Scenario: 指定配置文件启动

  • WHEN 用户执行 ./gateway-checker ./probes.yaml
  • THEN 系统 SHALL 读取并解析指定路径的 YAML 文件作为配置

Scenario: 未提供配置文件路径

  • WHEN 用户启动程序时未提供任何命令行参数
  • THEN 系统 SHALL 以错误退出并提示需要指定配置文件路径

Scenario: 配置文件不存在

  • WHEN 用户指定的配置文件路径不存在
  • THEN 系统 SHALL 以错误退出并提示文件不存在

Requirement: 配置校验

系统 SHALL 在启动时对 YAML 配置进行完整校验,校验失败时以非零状态退出并输出清晰的错误信息。

Scenario: target 缺少必填字段

  • WHEN YAML 中某个 target 缺少 name 或 type 字段
  • THEN 系统 SHALL 以错误退出,提示哪个 target 缺少哪个字段

Scenario: HTTP target 缺少 url

  • WHEN YAML 中某个 target 配置 type: http 但缺少 http.url
  • THEN 系统 SHALL 以错误退出,提示该 target 缺少 http.url 字段

Scenario: command target 缺少 exec

  • WHEN YAML 中某个 target 配置 type: command 但缺少 command.exec
  • THEN 系统 SHALL 以错误退出,提示该 target 缺少 command.exec 字段

Scenario: target type 非法

  • WHEN YAML 中某个 target 的 type 不是 httpcommand
  • THEN 系统 SHALL 以错误退出,提示不支持的 target type

Scenario: target name 重复

  • WHEN YAML 中存在两个 name 相同的 target
  • THEN 系统 SHALL 以错误退出,提示重复的 name

Scenario: interval 格式非法

  • WHEN interval 或 timeout 值不是有效的时长格式(如 30s5m500ms
  • THEN 系统 SHALL 以错误退出并提示格式错误

Scenario: maxConcurrentChecks 非法

  • WHEN runtime.maxConcurrentChecks 不是正整数
  • THEN 系统 SHALL 以错误退出并提示 runtime.maxConcurrentChecks 格式错误

Scenario: size 格式非法

  • WHEN maxBodyBytes 或 maxOutputBytes 值不是有效的 size 格式
  • THEN 系统 SHALL 以错误退出并提示支持 B、KB、MB、GB 格式

Requirement: size 配置解析

系统 SHALL 支持使用单位字符串配置读取上限,单位包括 BKBMBGB

Scenario: 解析 MB

  • WHEN YAML 中配置 maxBodyBytes: "100MB"
  • THEN 系统 SHALL 将其解析为 104857600 bytes

Scenario: 解析 KB

  • WHEN YAML 中配置 maxOutputBytes: "512KB"
  • THEN 系统 SHALL 将其解析为 524288 bytes

Requirement: runtime 并发配置

系统 SHALL 支持 runtime.maxConcurrentChecks 配置全局最大并发检查数。

Scenario: 使用默认并发限制

  • WHEN YAML 中未配置 runtime.maxConcurrentChecks
  • THEN 系统 SHALL 使用默认值 20

Scenario: 配置并发限制

  • WHEN YAML 中配置 runtime.maxConcurrentChecks: 5
  • THEN 系统 SHALL 将全局最大并发检查数设置为 5

Requirement: YAML 配置使用 Bun 内置解析

系统 SHALL 使用 Bun 内置的 Bun.YAML.parse() 解析配置文件,不引入外部 YAML 解析库。

Scenario: 解析 YAML 内容

  • WHEN 系统读取 YAML 文件内容
  • THEN 系统 SHALL 调用 Bun.YAML.parse() 将内容解析为配置对象

Requirement: expect 配置增强

系统 SHALL 支持 typed target 的领域专用 expect 配置,包括 HTTP 的 statusheadersbody 和 command 的 exitCodestdoutstderr。内容类 expect MUST 使用数组表达配置顺序。

Scenario: 解析 HTTP expect 配置

  • WHEN YAML 配置文件中 HTTP target 的 expect 包含 status、headers、body 规则数组及内部方法
  • THEN 系统 SHALL 正确解析并存储为 HTTP target 的 expect 字段

Scenario: 解析 command expect 配置

  • WHEN YAML 配置文件中 command target 的 expect 包含 exitCode、stdout 和 stderr 规则数组
  • THEN 系统 SHALL 正确解析并存储为 command target 的 expect 字段

Scenario: 解析 body 有序规则数组

  • WHEN YAML 中 HTTP target 配置 expect.body 为 contains、json、regex 三个数组项
  • THEN 系统 SHALL 保留数组顺序,供执行阶段按配置顺序快速失败

Scenario: 不配置 HTTP status

  • WHEN HTTP target 未配置 expect.status
  • THEN 系统 SHALL 在执行 expect 时使用默认 status: [200] 语义

Scenario: 不配置 command exitCode

  • WHEN command target 未配置 expect.exitCode
  • THEN 系统 SHALL 在执行 expect 时使用默认 exitCode: [0] 语义

Scenario: 不配置 expect

  • WHEN target 未配置任何 expect 规则
  • THEN 系统 SHALL 正常处理expect 字段为 undefined