3. 可观测性三大支柱

在金融Serving系统中,一次转账请求可能跨越网关、账户服务、风控引擎、账务核心和通知服务。当这笔请求变慢或失败时,仅靠单一信号很难定位问题。可观测性正是通过三类互补数据——指标(Metrics)、日志(Logging)和链路追踪(Tracing)——把系统内部状态转化为可查询、可关联、可推理的证据。理解三者的基本概念、数据模型、采集方式与协同关系,是构建故障诊断能力的基础。

一、核心原理:三类信号回答不同问题

Metrics是随时间变化的数值型聚合数据,回答“系统整体是否异常、异常程度如何”。它成本低、适合长期存储和告警,典型如QPS、P99延迟、错误率、线程池活跃数、GC暂停时间。Logging是离散事件的文本或结构化记录,回答“某个时刻具体发生了什么”。它信息丰富、上下文强,适合根因分析和审计。Tracing记录单个请求在分布式系统中的完整调用路径与各段耗时,回答“慢在哪里、错在哪一跳”。

三者的数据模型差异明显:Metrics是“时间序列+标签”,Logging是“时间戳+级别+消息+字段”,Tracing是“TraceID+Span树+时间区间+标签”。金融场景对精度和合规要求高,因此日志需结构化、追踪需采样可控、指标需按业务维度打标。

关键认知:Metrics告诉你“着火了”,Logging告诉你“烧的是什么”,Tracing告诉你“火从哪一层烧起来”。三者不是替代关系,而是证据链的不同环节。

二、数据模型与采集方式

Metrics通常采用拉取(Pull)或推送(Push)模式采集。Prometheus生态以Pull为主,通过Exporter暴露/metrics端点;金融系统也常用Push Gateway处理短生命周期任务。指标命名应遵循“命名空间_子系统_指标名_单位”规范,标签基数必须受控,避免userId这类高基数字段直接作为标签。

# 典型指标暴露格式
serving_http_requests_total{service="account",method="transfer",status="500"} 12
serving_http_request_duration_seconds_bucket{service="account",le="0.5"} 9821
serving_jvm_gc_pause_seconds_sum{service="risk",gc="young"} 3.42

Logging采集一般通过应用内日志框架输出JSON,再由Filebeat、Fluent Bit或OpenTelemetry Collector采集转发。金融系统需注意脱敏:卡号、身份证、金额等敏感字段必须在落盘前处理。Tracing采集依赖上下文传播,常用W3C Trace Context标准,在HTTP头中传递traceparent,跨线程和跨服务时通过SDK自动注入。

维度MetricsLoggingTracing
数据形态时间序列数值离散事件记录调用链Span树
主要用途告警、容量、趋势根因、审计、排查延迟归因、依赖分析
采集方式Pull/Push + ExporterAgent采集 + 结构化输出SDK埋点 + 上下文传播
成本低中高中,受采样影响
典型工具Prometheus、VictoriaMetricsELK、LokiJaeger、Tempo、SkyWalking

三、协同关系:从告警到根因的闭环

三者的协同价值在于“关联”。当指标告警触发时,运维人员需要快速跳转到对应时间窗口的日志和追踪。实现关联的关键是统一标识:在日志中打印traceId,在指标标签中保留service和endpoint,在追踪中记录http.status_code。这样就能形成“指标发现异常→追踪定位慢调用→日志确认错误原因”的诊断路径。

可观测性三支柱协同诊断闭环 Metrics 指标 QPS / P99 / 错误率 告警触发,发现异常 时间窗口:14:03–14:05 Tracing 链路 TraceID 串联调用路径 定位慢Span:风控服务 耗时 1.8s,占比 72% Logging 日志 按 TraceID 检索日志 发现:规则引擎超时 异常堆栈 + 入参快照 统一关联键:traceId + service + timestamp 指标告警 → 追踪定位 → 日志确认 → 修复验证 → 指标恢复 金融Serving实战:转账超时告警 → 追踪发现风控Span慢 → 日志定位规则引擎GC停顿 → 扩容+调参后指标恢复

四、案例与误区复盘

某支付Serving系统在午间高峰出现转账成功率下降。指标显示serving_transfer_error_rate从0.2%升至4.7%,告警触发。通过追踪发现,失败请求的Trace中risk-service的Span状态为ERROR,耗时集中在规则匹配阶段。进一步按TraceID检索日志,发现大量rule_engine_timeout,原因是某条新上线规则导致回溯深度过大。最终通过回滚规则并增加规则缓存解决。

最佳实践:在应用入口生成TraceID并写入MDC,日志框架自动输出;指标按service、endpoint、status打标;追踪采样率在故障期间可动态调高,平时保持5%–10%以控制成本。

常见误区:一是把Metrics当万能,看到错误率上升却无日志和追踪,无法定位;二是日志未结构化,无法按字段检索;三是追踪采样率固定且过低,故障时关键请求未被采集;四是指标标签使用高基数userId,导致存储爆炸。金融系统还应避免在日志中明文输出敏感信息,合规风险极高。