Files
orbit/docs/reports/phase-6-observability.md

84 lines
8.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.
# P6:进程指标、采集隔离与告警规则
日期:2026-09-18。范围为运行观测第一批,交付HTTP/WS、连接池、后台批次、进程指标和可离线验证的告警规则。本文记录第一批完成时的迁移版本25;后续000026有界业务状态采样见[专项报告](phase-6-business-observability.md)。P6仍在进行,完整生产观测没有被任一批次替代。
## 实现和边界
- [指标目录与注册器](../../internal/observability/metrics.go)只接受[代码中固定的名称、类型及标签集合](../../internal/observability/catalog.go)。没有通用动态注册接口;非法更新丢弃并计数,未知指标不创建族,同名不同类型不会触发空指针或混写。
- [HTTP包装器](../../internal/observability/http.go)保留原始状态、流式写入、Hijack及panic传播。成功WS升级在握手完成时计一次HTTP,连接存续单独计数;普通HTTP延迟不包含长连接生命期。103等临时响应不阻止最终响应。
- [运行采样](../../internal/observability/runtime.go)读取本进程池状态,不在采集路径执行SQL;批次开始/返回时间只观测原调用,不改变事务、重试或状态语义。计数器初始零值和最后成功时间支持“尚未成功”和“随后停滞”的判断。
- [进程入口](../../cmd/orbit/main.go)使用独立指标监听,默认关闭;启用后业务端口仍无`/metrics`,采集端口不提供业务API。服务启动、绑定失败和SIGTERM退出明确处理两种监听。
- [接口及运维手册](../api/observability.md)说明所有名称、单位、标签、采样间隔、超时、限流和剩余范围。[告警规则](../../deploy/monitoring/orbit.rules.yml)是可修改的起始阈值,未对接或发送实际外部通知。
模型仍为36个、直接持久化字段312个、迁移版本25;未改模型/迁移、没有外键或级联。没有新增Go模块依赖、SDK耦合或运行必需服务。官方promtool仅作为一次性离线验证器。
## 针对性证据
[指标竞态与约束回归](../../internal/observability/metrics_test.go)覆盖16个并发写入者及同时采集;每条直方图的桶/count/sum保持一致。3000个动态名称和3000个动态标签均被拒绝;每种HTTP方法/路由/状态组合都写入后,原序列仍继续累计。类型冲突、计数器倒退、非有限数字和错误文本泄露均有直接断言。
[真实TLS WebSocket回归](../../internal/observability/http_test.go)通过现有coder/websocket实际升级,保持连接未关闭时确认HTTP计数完成、HTTP在途为0、WS在途为1;关闭后WS归0且HTTP不重计。另有真实HTTP 103→201及Flush完整响应检查。
[进程专项](../../cmd/orbit/metrics_integration_test.go)使用一次性MySQL和编译为race模式的Orbit二进制:分别启用/关闭指标,验证readiness、业务请求、独立采集、DB池及自然运行的后台批次、请求数据不泄露,最后SIGTERM并确认监听全部关闭。分配优化后的定向入口退出0,5.696秒;这是测试耗时,不是延迟指标。
最终`make fmt test vet build`退出0。未配置外部测试环境时的普通go test会跳过MySQL/进程场景,不能用这些跳过项代替专项与标准集成执行。
## 独立格式与规则验证
第一批全量有限HTTP组合的文本夹具为926666字节,使用本地已有官方promtool 3.5.0(linux/arm64,revision 8be3a9560fbdd18a94dedec4b747c35178177202)执行`check metrics`,退出0且无格式/命名告警。固定验证镜像摘要为`prom/prometheus@sha256:63805ebb8d2b3920190daf1cb14a60871b16fd38bed42b857a3182bc621f4996`,运行时关闭网络;此版本仅描述实际验证器,不是生产部署版本建议。当前新增业务状态目录的夹具和校验见专项报告。
五条告警规则通过`check rules`;[规则测试](../../deploy/monitoring/orbit.rules.test.yml)通过`test rules`,验证目标失联、启动宽限、组件停滞、健康不报警、错误/等待/非法采样触发及恢复后的解除。
```sh
# 不要求平台在运行,可导出有限指标组合供独立校验。
ORBIT_TEST_METRICS_OUTPUT=/tmp/orbit-metrics.txt go test -count=1 -run '^TestExportExpositionFixture$' ./internal/observability
promtool check metrics < /tmp/orbit-metrics.txt
promtool check rules deploy/monitoring/orbit.rules.yml
promtool test rules deploy/monitoring/orbit.rules.test.yml
```
格式契约以[官方文本说明](https://prometheus.io/docs/instrumenting/exposition_formats/)为依据,框架自身不要求部署Prometheus。
## 全量回归与开销记录
标准`make integration`对应的`GO=… DOCKER=… sh scripts/test-mysql.sh`执行完毕,退出0。标准脚本显式为测试子进程分配独立随机指标端口,让真实SDK/WSS及进程恢复链路在指标启用时执行;进程专项另验证默认关闭场景。环境为Go 1.27.1、darwin/arm64、Docker MySQL 8.4.10。
| 范围 | 本次终态及耗时 |
| --- | --- |
| 存储、升级、事务竞争和COMMIT切点 | PASS,280.152秒 |
| 指标独立监听开/关与退出 | PASS,4.620秒 |
| 流程运行器真实节点恢复 | PASS,48.262秒 |
| SDK任务/Worker、调度、队列、批量、查询、订阅/消费、恢复和流程接口 | 各组PASS;23个SDK示例均运行成功 |
| 独立业务Inbox / Outbox模块及demo | PASS,36.005 / 34.409秒;demo成功 |
| Worker / 事件消费进程故障组 | PASS,127.765秒;包含A04未送达派发、自然租约到期、ACK丢确认和四种重试全停恢复 |
| 公共SDK流程暂停全停恢复 | PASS,13.789秒;两旧节点全部退出后由两新节点接续 |
无外键升级专项再次确认:v7的70条历史外键全部移除,323项原索引组成不变,原任务保留,启动检查拒绝外键漂移。当前schema版本25;业务Inbox和Outbox库也保持零外键。早期迁移文件保留原校验和,通过000008前向移除,禁止将历史DDL误解为当前运行结构。
全量执行结束后的微基准发现标签转义器重复分配,随后唯一生产代码调整是复用一个并发安全的`strings.Replacer`,转义规则不变。该调整后重新通过`make fmt test vet build`,并重新导出完整指标夹具校验格式;真实race二进制的监听/采集/退出专项复验通过,退出0、5.696秒。上表为该分配优化之前的全量结果,不将它写成优化后的重复全量执行。
可复现中间件微基准:
```sh
go test -run '^$' -bench '^BenchmarkHTTPMiddleware$' -benchmem -benchtime=1s -count=3 -cpu=1,8 ./internal/observability
```
Apple M2 Max、12核、32 GiB;全量集成停止后单独运行,退出0。空204处理器复用请求和响应对象,使用`RunParallel`,下表为三次测量范围。
| 指标启用 | GOMAXPROCS | ns/op | B/op | allocs/op |
| --- | --- | --- | --- | --- |
| 否 | 1 | 1.997–2.122 | 0 | 0 |
| 否 | 8 | 0.2581–0.2747 | 0 | 0 |
| 是 | 1 | 1090–1126 | 704 | 19 |
| 是 | 8 | 1404–1482 | 704 | 19 |
优化前启用时为41272 B/op、61 allocs/op;共享转义器消除了每次构建查找表的分配。并行ns/op是总工作量的摊销值,不是单请求延迟;启用后的锁竞争仍需结合真实负载检查。这只是中间件本机开销,不包含网络、MySQL、并发抓取或业务处理,不能换算成受理吞吐或百万企业容量。
文档检查通过:1204个本地链接、68段JSON示例,未发现失效链接、非法JSON或接入方项目标识;`git diff --check`通过。
## 后续原范围
1. 受理/授权/完成的持久吞吐、阶段延迟、重试/核查/恢复量、流程Inbox至推进延迟;区分提交成功、回执丢失、重报和事件重放,不能把HTTP成功数直接当作业务量。
2. 持久待处理、到期积压与发送队列。使用有上限/超时的后台采样及明确的新鲜度/失败状态,不能让每次抓取扫描全库;状态指标和多节点重复采集的聚合口径须先明确。
3. 慢消费者、重连风暴、业务负载下观测开销、真实采集/通知演练,以及数据库锁/磁盘/复制指标和跨故障域验证。
4. 凭据轮换、保留/归档、备份恢复、容量六类负载和P7版本发布继续按[持续计划](../08-development-plan.md)执行。