docs: rewrite README and AGENTS.md etc..
This commit is contained in:
1 parent
cc64df3e70
commit
a9bf849697
22 files changed
+514
-665
No files matched your search
+12
-12
@@ -16,11 +16,11 @@
|
||||
指标窗口(1m) → 5m → 1h API:metrics{} + scores{}
|
||||
```
|
||||
|
||||
三层都采用**注册制**,由代码中的注册表驱动;API 的 `/catalog/metrics`、`/catalog/models` 也直接由注册表生成。
|
||||
三层都采用注册制,由代码中的注册表驱动;API 的 `/catalog/metrics`、`/catalog/models` 也直接由注册表生成。
|
||||
|
||||
## 2. 累加器(固定的少数几种)
|
||||
|
||||
所有指标的中间状态只能是下面几种累加器之一。**合并规则只写一次**,存储、降采样、按时间范围聚合都通用处理:
|
||||
所有指标的中间状态只能是下面几种累加器之一。合并规则只写一次,存储、降采样、按时间范围聚合都通用处理:
|
||||
|
||||
| 累加器 | 状态 | 合并 | 可导出的值 |
|
||||
| --- | --- | --- | --- |
|
||||
@@ -79,14 +79,14 @@ public static class LinkMetrics
|
||||
```
|
||||
|
||||
- `from` 写成 `kind.stream`,`*` 表示所有具有该 stream 的 Kind;某个窗口里没有对应的输入时,该指标在这个窗口就不存在。
|
||||
- **TCP 长尾**:均值和 p95 看不到偶发的重传尖峰(一次丢包后的 RTT 聚在 RTO 附近),所以 `tcp.rtt` 还导出 `p999`、`max` 和长尾比 `tail`(p99 / p50,从同一个直方图导出,窗口合并后仍然精确);`tcp.slow` 是慢回显的占比——阈值 `max(1.8 × 基线, 基线 + max(15 ms, 0.35 × 基线))`,基线是**同一个 10 秒块**里 RTT 的中位数(所以每个观测只依赖自己所在的块,窗口合并仍然精确;块里少于 20 个样本不产生观测)。把它和 `tcp.retrans`(内核计数,Agent 一侧反映下行)、`tcp.stall` 对照,可以区分"重传造成的尖峰"和"队头阻塞"。
|
||||
- TCP 长尾:均值和 p95 看不到偶发的重传尖峰(一次丢包后的 RTT 聚在 RTO 附近),所以 `tcp.rtt` 还导出 `p999`、`max` 和长尾比 `tail`(p99 / p50,从同一个直方图导出,窗口合并后仍然精确);`tcp.slow` 是慢回显的占比——阈值 `max(1.8 × 基线, 基线 + max(15 ms, 0.35 × 基线))`,基线是同一个 10 秒块里 RTT 的中位数(所以每个观测只依赖自己所在的块,窗口合并仍然精确;块里少于 20 个样本不产生观测)。把它和 `tcp.retrans`(内核计数,Agent 一侧反映下行)、`tcp.stall` 对照,可以区分"重传造成的尖峰"和"队头阻塞"。
|
||||
- 导出值的名字为 `指标id.统计量`,例如 `rtt.p95`、`loss.up`、`tcp.stall.per_min`。
|
||||
|
||||
**新增一个统计 = 新增一行 `MetricDef`**,如果需要新的算子,再加一个算子类。存储、降采样、API 输出、目录说明都不需要改。新指标上线后,会自动对保留期内(30 天)的原始数据回填(见第 7 节)。
|
||||
新增一个统计只需要新增一行 `MetricDef`,需要新算子时再加一个算子类。存储、降采样、API 输出、目录说明都不需要改。新指标上线后,会自动对保留期内(30 天)的原始数据回填(见第 7 节)。
|
||||
|
||||
## 5. 模型(服务体验评分)
|
||||
|
||||
模型是一组指标的评分函数,**在查询时计算**,不存储。改动评分公式后,立即对全部历史生效。
|
||||
模型是一组指标的评分函数,在查询时计算,不存储。改动评分公式后,立即对全部历史生效。
|
||||
|
||||
```csharp
|
||||
public sealed class McModel : IServiceModel
|
||||
@@ -117,7 +117,7 @@ chunk 入库 ─┬─> 流式路径:按 1s 桶计算累加器 → 热层环
|
||||
|
||||
两条路径调用同一份 `MetricDef` 和算子代码,所以实时值与历史值使用的是同一套口径。迟到的块(例如 Agent 重连后补传)会同时更新热层(如果仍在 1 小时内)、`metric_10s`,并重新进入持久路径。
|
||||
|
||||
**指标分组(preset)** 与指标一样采用注册制:`Presets.Udp = [LinkMetrics.LossUp, …]`,由 `/api/public/catalog/presets` 下发。前端按分组展示,新增指标只需要把它加进分组。查询规则见 [query.md](query.md)。
|
||||
指标分组(preset)同样是注册制:`MetricRegistry.Presets` 中的 `PresetDef(id, label, metricIds)`,由 `/api/public/catalog/presets` 下发。前端按分组展示,新增指标只需要把它加进分组。查询规则见 [query.md](query.md)。
|
||||
|
||||
## 7. 版本与重算
|
||||
|
||||
@@ -136,12 +136,12 @@ chunk 入库 ─┬─> 流式路径:按 1s 桶计算累加器 → 热层环
|
||||
|
||||
```text
|
||||
backend/src/MoShiro.Backend.Analysis/ 依赖:MoShiro.Protocol、Fleet.Core(纯计算,没有 I/O)
|
||||
├─ Accumulators/ Counter Ratio Sum Min Max Histogram RunLength Series + AccumulatorCodec
|
||||
├─ Ops/ Rtt Loss OwdVar LossRuns Reorder Gap KernelDelta Rate PhaseMs Outcome ChangePoint
|
||||
├─ Metrics/ LinkMetrics TcpMetrics UdpTrainMetrics ConnectMetrics …(只包含声明)
|
||||
├─ Models/ BaseModel McModel Hy2Model RealityModel
|
||||
├─ Engine/ ChunkView(列视图) WindowEvaluator TestEvaluator MetricRegistry ModelRegistry
|
||||
├─ Accumulators/ Accumulator(Counter、Ratio、Sum、Min、Max、RunLength、Series)、HistogramAcc、AccumulatorCodec
|
||||
├─ Ops/ Ops(通用算子)、EchoOps、SessionOps
|
||||
├─ Metrics/ LinkMetrics、TcpMetrics、SessionMetrics(只包含声明)、MetricRegistry(指标与分组的注册表)
|
||||
├─ Models/ ServiceModel(基类)、Models(base、mc、hy2、reality)
|
||||
├─ Engine/ ChunkView(列视图)、MetricDef、WindowEvaluator、TestEvaluator、ChangePoint
|
||||
└─ Clock/ ClockDriftFit(估计两端的时钟偏移和漂移)
|
||||
```
|
||||
|
||||
分析库没有 I/O,可以直接用于离线 CLI `tools/moshiro-analyze`,对下载的原始块做实验。
|
||||
分析库没有 I/O,可以脱离 Backend 单独引用。
|
||||
Reference in new issue
Block a user