Skip to content

feat: add structured errors observability and interceptors - #11

Merged
xiaoyumuxi merged 6 commits into
mainfrom
feat/p2-errors-observability-interceptors
Sep 14, 2026
Merged

xiaoyumuxi merged 6 commits into
mainfrom
feat/p2-errors-observability-interceptors

Conversation

@xiaoyumuxi

@xiaoyumuxi xiaoyumuxi commented Sep 14, 2026 •

Copy link
Copy Markdown
Owner

目标

完成当前 P2 的核心工程化能力:结构化错误模型、框架内置可观测性指标、客户端/服务端拦截器链。暂不把熔断/限流塞进这一轮,避免范围失控。

1. 结构化 RPC 错误模型

扩展 rpc_meta.proto:

  • 新增 RpcStatusCode
    • SUCCESS
    • SERVICE_NOT_FOUND
    • METHOD_NOT_FOUND
    • INVALID_ARGUMENT
    • SERVER_BUSY
    • BUSINESS_ERROR
    • INTERNAL_ERROR
    • TIMEOUT
    • UNAVAILABLE
    • CLIENT_CLOSED
  • RpcResponse 新增 status_code / error_type
  • RpcRequest 新增 metadata map

兼容策略:继续保留 message="Success" / 错误文本,旧 Python/Go protobuf 客户端会忽略新增字段;Java 客户端开始将结构化错误转换成 RpcException。

服务端会区分服务不存在、方法不存在、非法参数、业务异常、线程池繁忙和内部异常,不再只返回 Error: xxx 字符串。

2. 可观测性指标

新增轻量 RpcMetrics,不引入额外监控依赖:

  • client/server 独立统计
  • total requests
  • success / failure
  • timeout
  • active requests
  • average latency
  • max latency

通过 RpcMetrics.getInstance().snapshot(...) 可直接读取快照,后续可很容易适配 Micrometer / Prometheus。

3. Interceptor 链

新增:

  • RpcInterceptor
  • RpcInvocationContext
  • RpcInterceptorRegistry
  • RpcSide

能力:

  • order() 排序
  • client/server 双端 before / after / onError
  • before 可以返回新的 RpcRequest,用于 metadata / trace-id 注入
  • after/onError 回调异常不会覆盖真实 RPC 结果
  • after/onError 按反向顺序执行,符合常见 interceptor 栈语义

4. Transport / Client 语义整理

  • requestId 在 RpcClient 层提前生成,使 client interceptor 可以拿到完整上下文
  • Netty transport 只负责网络传输,不再解释业务错误
  • timeout / unavailable / client closed 使用 RpcException + RpcStatusCode
  • RpcClient 统一解释 RpcResponse,保证未来其它 transport 共用同一错误模型
  • 仍兼容未设置 status_code 但 message=Success 的旧响应

5. 每次 CI 发布 RPC 性能快照

新增 RpcPerformanceSnapshotTest,每次 PR / main CI 都会执行:

  • 100 次 warmup
  • 200 次顺序请求,观察单请求延迟
  • 1000 次请求、16 并发,观察吞吐和并发延迟
  • 固定使用 Local Registry + Netty + Kryo,保证不同 CI run 尽量可比较

每次运行生成并上传 rpc-performance-snapshot artifact(保留 30 天):

  • performance.json:机器可读的环境、配置、吞吐、P50/P95/P99、Client/Server metrics
  • summary.md:直接展示在 GitHub Actions Summary
  • latency-samples.csv:每个请求的原始 latency sample,方便后续做趋势图和回归分析

性能快照会校验 Client / Server metrics 的 total/success/failure/timeout/active 与实际请求数一致;但不会用 GitHub Hosted Runner 的绝对 QPS/延迟做硬门槛,避免 runner 抖动导致误报。JMH 继续负责更严格的微基准。

同时将客户端“每个成功响应”的 INFO 日志降为 DEBUG,避免日志 I/O 污染吞吐和延迟观测。

测试

新增覆盖:

  • client interceptor 顺序和 metadata 注入
  • structured BUSINESS_ERROR -> RpcException
  • timeout metrics
  • SERVICE_NOT_FOUND
  • BUSINESS_ERROR + remote error type
  • server interceptor + success metrics
  • SERVER_BUSY
  • CI RPC performance snapshot + raw latency samples

主 CI 继续要求 Build / Unit Tests & Coverage / RPC Integration / CI Gate 全部通过。

@xiaoyumuxi
xiaoyumuxi merged commit e5b68c8 into main Sep 14, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant