指标体系统一设计(四套 → Micrometer 单门面)
本文供评审,不含代码改动。目标:仓库目前有四套互不连通的"指标"代码,其中两套是死代码;收敛为以 Micrometer 为唯一门面的一套。
现状(事实盘点)
| 位置 | 是什么 | 生产侧使用情况 |
|---|---|---|
metrics 模块(MetricCollector/MetricRegistry/InMemoryMetricCollector/MetricTimer/prometheus 等) | 自建指标门面 + 内存实现 + Prometheus 输出 | 零生产消费者(除 examples),事实上的死代码 |
reliability metrics/ReliabilityMetrics | 指标桥接 | 零调用者,死桥 |
cdc CDCMetrics | 不可变 POJO(计数快照) | CDC 连接器在用,但没有 Micrometer 桥,用户拿不到运行时可观测数据 |
runtime RedisRuntimeMetrics(+RedisRuntimeMetricsCollector) | 运行时指标(watermark、延迟、in-flight 等) | 唯一真正在跑的,runtime 内部多处调用 |
其他事实:
- 只有
spring-boot-starter依赖 Micrometer(api libs.micrometer.core),且已有先例:RateLimit 指标通过@ConditionalOnClass(MeterRegistry)桥接到 Micrometer(RedisStreamingAutoConfiguration)。 metrics模块无 Micrometer 依赖,与 starter 桥各走各路。- 命名格式至少三种(
topic.group、job.topic.group、camel/snake 混用),跨模块无法聚合对比。 runtime指标带作业/主题/消费组维度(如setWatermarkMs(job, topic, group, ms)),是四套里唯一带完整维度的。
问题
- 用户接 Micrometer/Prometheus 时只有 RateLimit 与 runtime 部分指标可见;CDC、reliability 全部不可观测。
metrics模块维护成本照付(测试、覆盖率门禁、API 演进),却没人用。- 自建门面无法复用 Micrometer 生态(registry 自动配置、Boot 指标导出、直方图发布等)。
可选方案
方案 A:Micrometer 为唯一门面,runtime 指标为基准(推荐)
- 标准:对外可观测性只有一条路——Micrometer
MeterRegistry。命名规范统一为redis.streaming.<module>.<metric>(小写点分),维度统一带job/topic/group/tenant(预留)。 - runtime 指标提升为公共 SPI:
RedisRuntimeMetrics的接口部分抽到公共位置(或提取StreamingMetrics接口),实现保留 runtime;starter 用与 RateLimit 相同的@ConditionalOnClass(MeterRegistry)模式自动桥接。 - CDC:
CDCMetrics保留为纯快照 POJO(对进程内轮询有用),另加一个 Micrometer 导出器(starter 自动装配时绑定到 registry),连接器每轮采集后打点。 - 清理:删除
reliabilityReliabilityMetrics死桥;metrics模块在 v2 删除(走 major),其 prometheus 输出由 Micrometer 的micrometer-registry-prometheus承担。
方案 B:保留自建 metrics 门面,为各模块补桥接
把 starter 的 Micrometer 桥换成"桥到 metrics 模块",再由 metrics 模块输出 Prometheus。多一层自建抽象要长期维护,且与 Spring Boot 生态的既有习惯相反——不推荐。
方案 C:各模块各自直接依赖 Micrometer 打点
不抽公共接口,各模块自己 Metrics.counter(...)。短期最快,但命名/维度约定必然漂移(现状已经是这样),需要文档纪律兜底——作为方案 A 落地过程中的过渡形态可以接受,终态不推荐。
迁移路径(方案 A 分期)
- v1(已落地 2026-10-11):runtime 指标接口公共化 + starter 自动桥接 Micrometer;CDC 导出器;统一命名规范写入文档;删除
ReliabilityMetrics死桥。实际落地以 todo.md 记录为准(DLQ 重放观测、死桥删除、CDC Micrometer 绑定、命名规范成文)。 - v2(major,已落地 2026-10-12):
metrics模块已删除(含MetricCollector/InMemoryMetricCollector/MetricRegistry/MetricTimer/Metric与prometheus.*,零仓外消费者已核实);gradle/libs.versions.toml的 simpleclient 两个坐标随之移除;Metrics.md 已给出「从 InMemoryMetricCollector 到 Micrometer」迁移对照表,Prometheus 输出交给micrometer-registry-prometheus。runtime 指标接口公共化同步落地:RedisRuntimeMetricsCollector更名并上移为 core 的公共 SPIio.github.cuihairu.redis.streaming.api.metrics.StreamingMetricsCollector(运行时指标词表的唯一对外接口;RedisRuntimeMetrics静态门面与 starter 的 Micrometer 桥保留原位,仅换型)。
非目标
- 不自建指标存储/时序库;传输(Pushgateway、OTLP 等)交给 Micrometer。
- 不做指标卡口限流/采样(如需要,Micrometer 有
MeterFilter)。 - 不在本设计内扩展 metrics 覆盖面(新指标按需另提)。