全链路监控的落地实践,看似简单,实则要求将每个环节精准串联成一条完整的追踪链路。起点通常从行情数据接口的调用开始:每次请求进入系统时,系统都会为其分配一个唯一的 trace_id。从发起请求到前端最终呈现,这个 trace_id 会一路跟踪,依次经过 API 网关、数据清洗、缓存、前端,任何一个环节都不能缺失。

import uuid
trace_id = str(uuid.uuid4())
logger.info(f"trace_id={trace_id} call api start")
resp = requests.get(url)
logger.info(f"trace_id={trace_id} call api end status={resp.status_code}")
在日志采集层面,我们采用了阿里云 SLS 服务。每条日志都携带 trace_id、时间戳、服务名、耗时、状态码等关键字段。SLS 支持全文检索,一旦出现问题,只需根据 trace_id 进行搜索,整条链路的日志便能完整呈现,极大提升了问题排查效率。
告警配置同样需要跟上节奏。连续 3 次调用失败,触发 P0 告警,直接通过电话通知;P99 延迟超过 3 秒,触发 P1 告警,钉钉消息会迅速推送;数据新鲜度超过 30 秒,则触发 P2 告警,通过邮件通知。代码实现如下:
# 数据新鲜度检查
now = int(time.time())
data_time = data['data'][0]['time']
if now - data_time > 30:
alert(f"数据新鲜度异常: {now - data_time}秒")
这里有一个值得注意的细节:葡萄牙市场的交易时段对应北京时间为 15:00-23:30。告警规则仅在交易时段内启用,非交易时段会自动屏蔽,避免深夜被误报警报打扰。
日志不仅能用于故障定位,还可以进行性能分析。按接口维度聚合 P50、P95、P99 延迟后,我们发现 PSI-20 指数接口的 P99 延迟明显高于平均值。经过深入排查,原来是某次成分股调整后数据量增大,优化后延迟便恢复正常。
-- SLS查询语句
select
a vg(latency) as p50,
approx_percentile(latency, 0.95) as p95,
approx_percentile(latency, 0.99) as p99
from log
where market = 'portugal'
整体来看,全链路监控的核心在于 trace_id 贯穿始终,日志采集必须做到快速且完整,告警需精准而不扰民,性能分析则要能够发现隐藏的瓶颈。将这些环节有效串联起来,行情数据才能稳定可靠地呈现到用户面前。
