1
0

feat: 新增两个 OpenSpec 变更提案 — CMD Checker 增强与前端指标增强

This commit is contained in:
2026-05-14 01:39:26 +08:00
parent 6e485cc991
commit 0fa2c0c811
18 changed files with 952 additions and 0 deletions

View File

@@ -0,0 +1,80 @@
## MODIFIED Requirements
### Requirement: 聚合查询支持
数据存储 SHALL 支持按时间段聚合查询,用于计算可用率、平均耗时、延迟范围等统计指标。所有聚合查询 SHALL 支持时间窗口参数。
#### Scenario: 计算目标可用率(带时间窗口)
- **WHEN** 查询某目标在指定时间范围内的可用率
- **THEN** 系统 SHALL 返回该时间范围内 matched=1 的记录数占总记录数的百分比
#### Scenario: 计算目标平均耗时
- **WHEN** 查询某目标在指定时间范围内的平均耗时
- **THEN** 系统 SHALL 返回 duration_ms 的平均值(仅计算 matched=1 的记录)
#### Scenario: 按小时聚合趋势数据(含延迟范围)
- **WHEN** 查询某目标在指定时间范围内的趋势数据
- **THEN** 系统 SHALL 返回按小时分组的聚合数据,包括每小时的 avgDurationMs、minDurationMs成功检查的最小延迟、maxDurationMs成功检查的最大延迟、availability、totalChecks、upChecks
#### Scenario: UP/DOWN 判定
- **THEN** 系统 SHALL 基于 latestCheck.matched 判定目标 UP 或 DOWNmatched=true 为 UPmatched=false 为 DOWN
### Requirement: 目标统计查询支持时间窗口
`getAllTargetStats``getTargetStats` SHALL 接受可选的时间窗口参数,限制聚合的数据范围。
#### Scenario: 带时间窗口的批量统计
- **WHEN** 调用 `getAllTargetStats(from, to)`
- **THEN** 系统 SHALL 仅聚合 timestamp 在 from 到 to 范围内的 check_results 记录
#### Scenario: 不传时间窗口
- **WHEN** 调用 `getAllTargetStats()` 不传时间参数
- **THEN** 系统 SHALL 默认使用过去 24 小时作为时间窗口
#### Scenario: 带时间窗口的单目标统计
- **WHEN** 调用 `getTargetStats(targetId, from, to)`
- **THEN** 系统 SHALL 仅聚合指定时间范围内的记录
### Requirement: 趋势数据时间范围查询
系统 SHALL 支持按任意时间范围查询趋势聚合数据,返回包含延迟范围和正常检查数的完整聚合。
#### Scenario: 按时间范围查询趋势(含延迟范围)
- **WHEN** 查询指定 target 在 from 到 to 时间范围内的趋势数据
- **THEN** 系统 SHALL 返回按小时分组的聚合数据,每个数据点包含 hour、avgDurationMs、minDurationMs、maxDurationMs、availability、totalChecks、upChecks
## ADDED Requirements
### Requirement: 异常事件计数查询
ProbeStore SHALL 提供 `getIncidents24h()` 方法,统计过去 24 小时内所有目标的异常事件数。
#### Scenario: 计算异常事件数
- **WHEN** 调用 `getIncidents24h()`
- **THEN** 系统 SHALL 统计过去 24 小时内所有目标中 matched 从 1 变为 0 的状态翻转次数
#### Scenario: 窗口起始即为故障
- **WHEN** 某目标在 24 小时窗口内第一条记录为 matched=0 且窗口前无记录
- **THEN** 该故障 SHALL 计为 1 次事件
#### Scenario: 连续异常只计一次
- **WHEN** 某目标连续 10 次 matched=0
- **THEN** 该连续异常段 SHALL 仅计为 1 次事件
### Requirement: 目标延迟百分位查询
ProbeStore SHALL 提供 `getTargetDurations(targetId, from, to)` 方法,返回时间窗口内所有成功检查的 duration_ms 数组。
#### Scenario: 获取延迟数据
- **WHEN** 调用 `getTargetDurations(targetId, from, to)`
- **THEN** 系统 SHALL 返回该目标在时间范围内所有 matched=1 的 duration_ms 值数组,按升序排列
#### Scenario: 无成功检查
- **WHEN** 时间窗口内无 matched=1 的记录
- **THEN** 系统 SHALL 返回空数组
### Requirement: 目标故障段查询
ProbeStore SHALL 提供 `getCheckSequence(targetId, from, to)` 方法,返回时间窗口内的检查序列用于故障分析。
#### Scenario: 获取检查序列
- **WHEN** 调用 `getCheckSequence(targetId, from, to)`
- **THEN** 系统 SHALL 返回该目标在时间范围内所有检查记录的 `{ timestamp: string, matched: number }` 数组,按 timestamp 升序排列
#### Scenario: 无检查记录
- **WHEN** 时间窗口内无记录
- **THEN** 系统 SHALL 返回空数组