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

8.0 KiB
Raw Blame History

P6:进程指标、采集隔离与告警规则

日期:2026-09-18。范围为运行观测第一批,交付HTTP/WS、连接池、后台批次、进程指标和可离线验证的告警规则。P6仍在进行,任务/流程持久积压和阶段延迟没有被本批替代。

实现和边界

  • 指标目录与注册器只接受代码中固定的名称、类型及标签集合。没有通用动态注册接口;非法更新丢弃并计数,未知指标不创建族,同名不同类型不会触发空指针或混写。
  • HTTP包装器保留原始状态、流式写入、Hijack及panic传播。成功WS升级在握手完成时计一次HTTP,连接存续单独计数;普通HTTP延迟不包含长连接生命期。103等临时响应不阻止最终响应。
  • 运行采样读取本进程池状态,不在采集路径执行SQL;批次开始/返回时间只观测原调用,不改变事务、重试或状态语义。计数器初始零值和最后成功时间支持“尚未成功”和“随后停滞”的判断。
  • 进程入口使用独立指标监听,默认关闭;启用后业务端口仍无/metrics,采集端口不提供业务API。服务启动、绑定失败和SIGTERM退出明确处理两种监听。
  • 接口及运维手册说明所有名称、单位、标签、采样间隔、超时、限流和剩余范围。告警规则是可修改的起始阈值,未对接或发送实际外部通知。

模型仍为36个、直接持久化字段312个、迁移版本25;未改模型/迁移、没有外键或级联。没有新增Go模块依赖、SDK耦合或运行必需服务。官方promtool仅作为一次性离线验证器。

针对性证据

指标竞态与约束回归覆盖16个并发写入者及同时采集;每条直方图的桶/count/sum保持一致。3000个动态名称和3000个动态标签均被拒绝;每种HTTP方法/路由/状态组合都写入后,原序列仍继续累计。类型冲突、计数器倒退、非有限数字和错误文本泄露均有直接断言。

真实TLS WebSocket回归通过现有coder/websocket实际升级,保持连接未关闭时确认HTTP计数完成、HTTP在途为0、WS在途为1;关闭后WS归0且HTTP不重计。另有真实HTTP 103→201及Flush完整响应检查。

进程专项使用一次性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;规则测试通过test rules,验证目标失联、启动宽限、组件停滞、健康不报警、错误/等待/非法采样触发及恢复后的解除。

# 不要求平台在运行,可导出有限指标组合供独立校验。
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

格式契约以官方文本说明为依据,框架自身不要求部署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秒。上表为该分配优化之前的全量结果,不将它写成优化后的重复全量执行。

可复现中间件微基准:

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版本发布继续按持续计划执行。