【背景】
我做了 5 年算法,近两年主做指标体系搭建。负责一条 B 端 SaaS 的核心业务看板:约 30 个原子指标(活跃、留存、下单转化、支付成功率、客单价、接口 P99、错误率等),底层 Kafka → Flink 实时聚合 → ClickHouse,小时级 T+0,看板直接给业务方和 on-call 用。
为了解决「30 个指标各看各的,业务方合不起来一个结论」的问题,我搭了一个 0–100 的「业务综合健康分」,当前实现:
- 归一化:每个指标用「近 90 天 min–max」线性映射到 [0,1];
- 加权:5 个一级维度(流量/转化/履约/质量/性能)各挂 1–4 个原子指标,权重是拍脑袋 + 和老板对齐一轮定的(如转化 30%、质量 25%、性能 20%…);
- 合成:维度内先平均,维度间再加权求和,输出 0–100。
【现象(具体)】
上周大促日出了两个方向相反的失真,都是同一个机制:
- 好日子反而扣分:支付成功率从基线 99.2% 冲到 99.99%(破 90 天极值),min-max 映射后它贡献满分没问题;但同窗口的客单价被拉高后,转化率的 min 被压到历史最低分位,归一化后从 0.82 掉到 0.31,综合分反而比前一天跌了 6 分。业务方当场质疑「全面向好为什么分还跌」。
- 坏日子扣分被稀释:接口 P99 从 45ms 恶化到 220ms(破基线 5 倍),但因为 P99 在 90 天窗口里本来就长尾,min-max 映射后只从 0.7 掉到 0.45,而它所在「性能」维度权重只有 20%,综合分只跌了 5 分——值班同学看到这个分没有升级,等客诉进来才发现已经 40 分钟了。
另外还有一个我怀疑但没量化的问题:支付成功率和订单转化率高度共线(相关系数我算过 ≈0.86),两者合计权重 55%,一次支付网关抖动会在这两个指标上各扣一次分,等于隐性把支付故障的权重放大到了 55%。
【已尝试的排查与结果】
- 把归一化窗口从 90 天改成 30 天 → 失真从「每天发生」变成「大促/节假日发生」,没根治,只是降低频率;
- 把 min-max 换成 z-score(均值 ±3σ 截断)→ 对长尾指标(P99、错误率)更糟,正常日 z 值就在 2–3σ 之间漂移,分数日波动 ±8 分,业务方直接弃用看板;
- 给每个指标设「硬阈值扣满」(如 P99 > 200ms 直接 0 分)→ 解决了「坏日子被稀释」,但引入了新的悬崖效应:P99 从 199ms 到 201ms 分数断崖,值班同学开始质疑分数不可信;
- 权重改成从近 12 个月的 P1/P2 故障复盘反推(每次故障里哪个指标先劣化、劣化幅度与影响面乘积作为该指标的「故障贡献度」)→ 方向对了,但只有 4 次 P1/P2 样本,样本量不够,且「影响面」怎么量化(GMV 损失 vs 客诉数 vs 时长)没有共识,卡在这里。
【期望得到的答案形态】
不要求给出唯一正确答案,希望拿到可对比的方案 + 各自的适用边界,具体想问:
- 归一化锚点:除了 min-max 和 z-score,线上在跑的多指标综合分用什么锚定?「SLO 目标值锚定」(以 SLO 为 1.0 分锚点、以故障阈值为 0 分锚点、中间线性/分段)有没有人实际跑过?长尾指标和短尾指标是不是该用不同的锚定方式?
- 权重反推:从历史故障反推权重,除了「故障贡献度 = 影响面 × 先劣化系数」还有没有别的做法?样本量只有 4–5 次 P1/P2 时,有没有统计上说得通的方法(比如贝叶斯先验 + 故障似然更新)?还是说这个量级的样本根本不该用数据反推、该走专家打分 + 故障复盘双轨校准?
- 共线去重:相关系数 >0.7 的指标对,线上是怎么处理的?降权其中一个?聚类后只取代表指标?还是接受重复扣分当作「隐性加权」但显式文档化?有没有人量化过「重复扣分」对最终综合分的影响幅度?
- 悬崖效应 vs 线性稀释:硬阈值断崖和线性稀释,你们的取舍标准是什么?是按「该指标的故障模式」分(阶跃型故障用硬阈值、渐变型故障用线性)还是有别的判据?
【相关引用】
- 社区里 id=2232 问了服务健康分的分段扣分与防重复扣分,侧重 SRE 侧三项指标(P99/错误率/连接池);本问侧重业务指标体系侧的多指标(30 个原子、5 个维度)合成,归一化锚点与权重反推是主要卡点,与 2232 互补不重复。
- id=1551 讨论了静态阈值 vs 动态基线(3σ/分位数回归),本问的 z-score 尝试(第 2 条)正是踩了这个坑,想进一步要「SLO 锚定」这个第三选项的实战经验。
- id=499 讲了均值指标掩盖长尾劣化的机制,本问的「坏日子扣分被稀释」是同一机制在综合分层的体现。