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

54 lines
3.2 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: 总览统计 API
系统 SHALL 提供 `GET /api/summary` 端点,返回所有目标的总体统计信息,包含异常事件计数。
#### Scenario: 获取总览统计
- **WHEN** 客户端请求 `GET /api/summary`
- **THEN** 系统 SHALL 返回 JSON 包含 total总目标数、up正常数、down异常数、lastCheckTime最近一次检查时间、incidents24h过去 24 小时内的异常事件数,按状态翻转计数)
#### Scenario: 异常事件计数逻辑
- **WHEN** 计算 incidents24h
- **THEN** 系统 SHALL 统计过去 24 小时内所有目标中 matched 从 1 变为 0 的状态翻转次数;时间窗口起始即为 matched=0 且无前序记录的情况 SHALL 计为 1 次事件
### Requirement: 目标列表 API
系统 SHALL 提供 `GET /api/targets` 端点,返回所有 typed target 及其最新状态、分组信息和结构化采样数据,可用率基于 window 查询参数指定的时间窗口计算。
#### Scenario: 获取目标列表
- **WHEN** 客户端请求 `GET /api/targets?window=24h`
- **THEN** 系统 SHALL 解析 window 参数(支持格式如 "24h"、"7d"),将其转换为时间范围,返回 JSON 数组,每个元素的 stats.availability 和 stats.totalChecks SHALL 基于该时间窗口的数据计算
#### Scenario: window 参数缺失
- **WHEN** 客户端请求 `GET /api/targets` 未提供 window 参数
- **THEN** 系统 SHALL 默认使用 24h 时间窗口
#### Scenario: 目标无历史记录
- **WHEN** 某目标尚未执行过任何拨测
- **THEN** 其 latestCheck 为 nullrecentSamples 为空数组stats.availability 为 0
### Requirement: 趋势 API 支持时间范围
系统 SHALL 提供 `GET /api/targets/:id/trend` 端点,返回包含延迟范围和正常检查数的趋势数据。
#### Scenario: 指定时间范围查询趋势
- **WHEN** 客户端请求 `GET /api/targets/1/trend?from=ISO&to=ISO`
- **THEN** 系统 SHALL 返回指定时间范围内按小时分组的聚合数据,每个数据点包含 hour、avgDurationMs、minDurationMs、maxDurationMs、availability、totalChecks、upChecks
#### Scenario: from 或 to 参数缺失
- **WHEN** 客户端请求 `GET /api/targets/1/trend` 未提供 from 或 to 参数
- **THEN** 系统 SHALL 返回 400 状态码和错误信息
### Requirement: 新增共享类型
系统 SHALL 在 `src/shared/api.ts` 中定义扩展后的 `SummaryResponse``TrendPoint``TargetStats` 类型。
#### Scenario: SummaryResponse 类型
- **WHEN** 前后端共享 `SummaryResponse` 类型
- **THEN** 该类型 SHALL 包含 `total: number``up: number``down: number``lastCheckTime: string | null``incidents24h: number` 字段
#### Scenario: TrendPoint 类型
- **WHEN** 前后端共享 `TrendPoint` 类型
- **THEN** 该类型 SHALL 包含 `hour: string``avgDurationMs: number | null``minDurationMs: number | null``maxDurationMs: number | null``availability: number``totalChecks: number``upChecks: number` 字段
#### Scenario: TargetStats 类型
- **WHEN** 前后端共享 `TargetStats` 类型
- **THEN** 该类型 SHALL 包含 `availability: number``totalChecks: number` 字段(语义变更为基于时间窗口计算)