可观测性
如何用三类信号定位一次调用?
- 可观测性: 通过日志、指标、链路回答“发生了什么、有多严重、从哪来到哪去”;
- Logging: 记录离散事件与错误上下文;
- Metrics: 观察吞吐、延迟、错误率、重试、限流、熔断和连接池;
- Tracing: 串联一次跨服务调用的完整路径;
- RPCInfo: 提供 caller、callee、method、endpoint 与 stats; 仅在有效生命周期内读取;
如何接入 Kitex 的观测接口?
klog: 默认 logger 与全局日志函数;klog.SetLogger: 注入组织统一 logger;Tracer: 在 Start/Finish 接收 RPCInfo,接入 tracing 或 metrics;WithTracer: Client/Server 注入 tracer;WithStatsLevel: 控制埋点粒度;- 实践: 无 tracer 默认 Disabled,有 tracer 默认 Detailed;
如何建立 RPC 指标基线?
| 信号 | 维度 | 用途 |
|---|---|---|
| throughput | caller/callee/method/status | 流量与错误比例 |
| latency | client/server/method/status | 长尾与阶段定位 |
| retry/backup | method/reason | 发现流量放大 |
| breaker/limit | key/reason | 主动保护是否触发 |
| connection | target/state | 池容量与建连异常 |
如何接入观测扩展?
- Prometheus: 使用 kitex-contrib exporter 暴露 Client/Server 与 runtime metrics;
- OpenTelemetry: 同时接入 trace 与 metrics,并传播上下文;
- StreamX: 使用 StreamEventHandler 观测 stream start、Send、Recv、header、finish;
如何控制观测数据的成本与泄露?
- cardinality: 不把 user id、完整 URL 或错误文本作为指标的唯一标识;
- sampling: 正常请求 tracing 的采样率与错误强制采样分开设计;
- PII: 请求/响应日志默认不记录敏感字段;
- exporter lifecycle: 重复初始化 provider 前先
Shutdown, 避免连接和 goroutine 泄漏; - 结果语义: fallback 后同时保留原 RPC 结果与降级结果,避免成功率失真;