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,与当前时间相减得到新鲜度秒数。
归因服务指标采集架构 归因服务实例 Agent (Node Exporter) 埋点 (OpenTelemetry) 日志 (Filebeat) Prometheus / VM Prometheus / VM Elasticsearch Grafana 仪表盘 + AlertManager 告警

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 上报秒级差值,与上游分区完成时间做关联
  • ✅ 告警:固定阈值 + 动态基线已配置,静默窗口已设置