1
0

refactor: 清理 checker 遗留边界

This commit is contained in:
2026-05-13 12:53:03 +08:00
parent 7b20b59b79
commit aade0bbff7
6 changed files with 85 additions and 196 deletions

View File

@@ -167,7 +167,9 @@ export function handleXxx(params, store: ProbeStore, method: string, mode: Runti
### 1.7 开发新 Checker
Checker 是本项目的核心扩展单元。得益于插件式注册架构,完成一个新 checker 后,**配置校验、引擎调度、数据存储、API 层会自动适配**,无需修改这些中间层代码
Checker 是本项目的核心扩展单元。得益于插件式注册架构,完成一个新 checker 并注册后,**配置契约组装、引擎调度、数据存储、API 层会自动走 registry 委托链路**,无需这些中间层添加新的 type 分支
当前 checker 执行链路已经注册化,但新增 checker 仍需更新中央类型定义、默认注册入口、前端展示常量、配置示例、用户/开发文档和测试。下文清单以这些必要更新为准。
以下以新增 `tcp` 类型 checker 为例,说明完整的开发步骤。
@@ -499,7 +501,7 @@ export function registerCheckers(registry = checkerRegistry): void {
}
```
注册后,以下管线会自动适配,**无需修改**
注册后,以下管线会通过 registry 自动委托,**无需新增 type 分支**
| 模块 | 自动行为 |
| ----------------------------- | ------------------------------------------------------------------------ |
@@ -509,6 +511,8 @@ export function registerCheckers(registry = checkerRegistry): void {
| `engine.ts` | 按 `target.type` 从 registry 取对应 checker 执行 `execute()` |
| `store.ts` | 按 `target.type` 从 registry 取对应 checker 执行 `serialize()` |
注意:自动适配指上述中间层不需要新增 `switch/case` 或类型分支;开发者仍需按后续步骤更新类型、注册、前端展示、示例、文档和测试。
#### 1.7.7 步骤六:更新前端展示
| 文件 | 修改内容 |
@@ -586,8 +590,8 @@ export function registerCheckers(registry = checkerRegistry): void {
- **调度**`ProbeEngine``es-toolkit/groupBy` 按 interval 分组,每组独立 `setInterval` 定时触发
- **并发控制**`es-toolkit/Semaphore` 限制全局最大并发数(`maxConcurrentChecks``acquire()` 阻塞等待
- **Runner 选择**`engine.runCheck()` `target.type` 分发到 `runHttpCheck``runCommandCheck`
- **超时控制**HTTP 用 `AbortController`Command 用 `setTimeout` + `proc.kill()`
- **Runner 选择**`engine.runCheck()` 通过 `checkerRegistry.get(target.type)` 获取 checker并调用 `checker.execute(target, { signal })`
- **超时控制**`ProbeEngine` 为每次检查创建 `AbortController` 并按 `target.timeoutMs` 触发 abortchecker 必须使用 `CheckerContext.signal` 感知超时HTTP 将 signal 传给 `fetch()`Command 在 signal abort 时 `proc.kill()`
- **结果写入**:检查结果通过 `store.insertCheckResult()` 写入 SQLiteengine 通过 `targetNameToId` 缓存 name→id 映射
- **生命周期**`start()`/`stop()` 管理定时器,`stop()` 清理所有 `setInterval`
@@ -598,7 +602,7 @@ export function registerCheckers(registry = checkerRegistry): void {
**HTTP 校验流程**
```
runHttpCheck → 收集观测(statusCode/headers)
HttpChecker.execute → 收集观测(statusCode/headers)
→ status → headers → (early duration) → body(按需) → (final duration)
→ 首个失败即停止,返回 CheckFailure
```
@@ -608,8 +612,8 @@ HTTP checker 的 `durationMs` 覆盖完整执行(含重定向、响应体读
**Command 校验流程**
```
runCommandCheck → 收集观测(exitCode/stdout/stderr/durationMs)
→ checkCommandExpect → exitCode → duration → stdout → stderr
CommandChecker.execute → 收集观测(exitCode/stdout/stderr/durationMs)
→ exitCode → duration → stdout → stderr
→ 首个失败即停止
```