4. 稳定性巡检指标体系:核心指标定义与采集
稳定性巡检的基石是一套可量化、可对比、可预警的指标体系。本章定义归因服务最关键的四个核心指标,并给出标准采集方式与告警阈值设定方法。
4.1 核心指标定义
归因服务的稳定性不能仅靠“服务是否存活”来判断,必须从可用性、延迟、错误率和数据新鲜度四个维度综合度量。
| 指标 | 定义 | 归因场景特殊说明 |
|---|---|---|
| 可用性 | 服务正常响应请求的时间占比 公式: 1 - (故障时长 / 总时长) |
归因计算依赖上游数据管道,需区分“服务自身故障”与“上游数据延迟导致的不可用” |
| 延迟 P99 / P999 | P99:99% 请求在阈值内完成 P999:99.9% 请求在阈值内完成 |
归因查询通常涉及多表 Join 和窗口聚合,P999 更能反映极端数据倾斜下的性能瓶颈 |
| 错误率 | 返回非 2xx/非成功状态码的请求占比 公式: 错误请求数 / 总请求数 |
需区分业务错误(如参数校验失败)与系统错误(如超时、OOM),后者才是巡检重点 |
| 数据新鲜度 | 归因结果中最新数据的时间戳与当前时间的差值 | 归因服务强依赖离线/实时数仓产出,新鲜度直接决定归因结论的时效性 |
实践建议:在归因场景中,数据新鲜度往往比延迟更敏感。如果上游 Hive 分区延迟 30 分钟,即使服务 P99 只有 200ms,归因结果也是过时的。建议将新鲜度作为第一优先级指标。
4.2 指标采集方式
不同指标适合不同的采集路径。归因服务通常采用 Agent + 埋点 + 日志三合一方案,确保无死角覆盖。
- Agent 采集:适用于基础设施级指标(CPU、内存、网络 IO、GC 次数)。通过 Prometheus Node Exporter 或 Telegraf 部署在每台归因节点上,拉取 /metrics 端点。
- 埋点采集:适用于业务级指标(请求量、延迟分布、错误码、新鲜度)。在归因服务代码中嵌入 Micrometer / OpenTelemetry SDK,上报到 Prometheus / VictoriaMetrics。
- 日志采集:适用于错误详情和慢查询分析。归因服务输出结构化 JSON 日志(含 requestId、耗时、错误栈),由 Filebeat 采集写入 Elasticsearch,用于事后归因和告警上下文关联。
采集架构要点:
- Agent 与埋点共用同一套标签体系(cluster、service、instance、version),方便指标关联。
- 日志中必须包含
traceId和spanId,用于链路追踪与延迟分解。 - 新鲜度指标通过埋点上报:每次归因任务完成后,记录
max_event_timestamp,与当前时间相减得到新鲜度秒数。
4.3 告警阈值设定
阈值设定需要平衡“灵敏度”与“误报率”。归因服务建议采用动态基线 + 固定阈值双层策略。
| 指标 | 固定阈值(硬边界) | 动态基线(异常检测) | 说明 |
|---|---|---|---|
| 可用性 | < 99.9% 触发 P0 告警 | 同比 5 分钟下降 > 0.5% | 归因服务通常要求 99.95% 以上 |
| 延迟 P99 | > 3s 触发 P1 告警 | 环比 10 分钟上升 > 50% | 归因查询允许比在线服务稍高,但需控制在 5s 内 |
| 延迟 P999 | > 10s 触发 P1 告警 | 环比 10 分钟上升 > 100% | P999 抖动大,动态基线更有效 |
| 错误率 | > 1% 触发 P0 告警 | 同比 5 分钟上升 > 0.3% | 区分 4xx 与 5xx,5xx 阈值更严格 |
| 数据新鲜度 | > 30 分钟触发 P1 告警 | 环比 15 分钟上升 > 20% | 新鲜度阈值需与上游数仓 SLA 对齐 |
避坑提醒:
- 不要对所有指标使用统一阈值。归因服务的 P999 天然高于普通 API 服务,统一阈值会导致大量误报。
- 新鲜度阈值必须与上游数仓产出周期联动。如果上游每 1 小时产出一次分区,新鲜度阈值设为 30 分钟会持续告警,应设为 90 分钟。
- 告警静默期:归因服务在凌晨执行全量重算任务时,延迟和错误率可能短暂升高,建议配置 02:00-04:00 的告警静默窗口。
4.4 指标采集代码示例
以下展示在归因服务中通过 Micrometer 埋点采集延迟和新鲜度的核心代码片段。
// 归因查询延迟埋点(P99/P999 自动计算)
Timer.Sample sample = Timer.start(registry);
try {
// 执行归因查询逻辑
attributionService.query(request);
} finally {
sample.stop(Timer.builder("attribution.query.duration")
.tag("cluster", clusterName)
.tag("version", appVersion)
.publishPercentiles(0.99, 0.999)
.register(registry));
}
// 数据新鲜度埋点(Gauge 上报)
Gauge.builder("attribution.data.freshness.seconds", () -> {
long maxEventTs = getMaxEventTimestamp();
return (System.currentTimeMillis() - maxEventTs) / 1000;
}).tag("source", "hive_partition")
.register(registry);
巡检指标落地检查清单:
- ✅ 可用性:通过 Prometheus
up指标 + 黑盒探针(/health 端点)双重确认 - ✅ 延迟:埋点已配置 P99 / P999 百分位,并区分读写路径
- ✅ 错误率:按 HTTP 状态码分组,5xx 单独告警
- ✅ 新鲜度:Gauge 上报秒级差值,与上游分区完成时间做关联
- ✅ 告警:固定阈值 + 动态基线已配置,静默窗口已设置