1
0
Files
DiAL/openspec/changes/enhance-frontend-metrics/specs/probe-data-store/spec.md

81 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 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 返回空数组