可观测性:Prometheus 与 Grafana 在 EasyQuant 中的用法

很多量化系统在“能跑起来”之后,会遇到一个现实问题:
你不知道它是否在稳定运行,也不知道它为什么突然不工作。

在交付视角里,可观测性不是锦上添花,而是系统从 demo 走向日常运行的门槛。
结论先行:EasyQuant 的可观测性重点不在“监控 CPU/内存”,而在“监控业务链路是否可交付”:数据新鲜度、策略评估节奏、阻塞原因、拒单原因、回测与执行的关键行为统计。


一、你应该监控什么:从“资源”转向“链路”

资源监控(CPU/内存/磁盘)很重要,但它解决不了量化团队最常问的三句话:

  • 为什么今天没成交?
  • 为什么策略看起来在跑,但没有评估?
  • 为什么回测突然变慢/结果变了?

因此,平台级监控建议按链路组织:

  1. 数据链路:tick/bars 是否持续更新?是否滞后?是否缺口?
  2. 策略链路:是否在评估?评估频率是否异常?是否被去重跳过?
  3. 执行链路:下单、成交、拒单的分布与原因
  4. 回测链路:回测任务吞吐、耗时、失败原因、数据读取量
  5. 诊断与解释:Blocking Reasons Top、趋势、突变

二、Prometheus 在 EasyQuant 里怎么用(最小闭环)

最小闭环的目标:让你能在 5 分钟内确认系统是否“可交付运行”

推荐的验证顺序:

  • 后端健康检查:/actuator/health 必须 UP
  • Prometheus 抓取:/actuator/prometheus 可访问并有指标
  • Grafana(可选):能看到基础面板与核心业务指标

在 Docker Compose 环境下,关键是让 Prometheus 能稳定发现后端服务(service name/port/metrics_path 正确)。


三、建议的关键指标(按你最常排障的问题来)

下面是“工程最有用”的指标建议(不追求铺天盖地,而追求能解决问题):

1)数据新鲜度(Data Freshness)

要能回答:

  • 最新 tick/bars 的时间戳是多少?
  • 滞后了多久?
  • 某个 code 是否长期无更新?

告警建议

  • bars 滞后超过阈值(例如 10 分钟)触发告警
  • tick 长期无数据且系统仍在交易时段触发告警

2)评估与去重(Evaluation / Dedup)

要能回答:

  • 策略是否在评估?每分钟评估次数是否合理?
  • DUP_EVAL_SKIPPED 是否异常升高(表明调度重复或 bars ts 未更新)?

告警建议

  • 策略 enabled,但评估次数持续为 0
  • 去重跳过次数突增

3)Blocking Reasons(可解释性指标化)

把 03 的可解释体系变成可观测对象:

  • NO_SYMBOLS / NO_BARS / SIGNAL_NONE / ENGINE_ERROR 等原因码的计数与趋势
  • Top 原因的突变(例如 NO_BARS 突然成为 Top1)

告警建议

  • ENGINE_ERROR 突增(可能是 DSL/指标升级引入问题)
  • NO_BARS 持续为 Top(数据链路故障)

4)执行拒绝(Risk/Broker Rejections)

要能回答:

  • 风控拒绝与通道拒绝的比例是多少?
  • 哪类拒绝是系统性问题(比如参数校验/额度过小/数据质量)?

告警建议

  • RISK_REJECTED 占比持续升高(可能是风控口径不匹配或策略变得过激)
  • BROKER_REJECTED 突增(可能是通道校验规则变化或价格异常)

5)回测吞吐与失败率(Backtest Throughput)

要能回答:

  • 回测任务平均耗时、P95 耗时是否恶化?
  • 失败原因分布(数据不足?引擎错误?)

告警建议

  • 回测失败率超过阈值
  • P95 耗时突增(可能是数据查询/索引/容量问题)

四、Grafana 面板怎么设计:按“问题”组织,而不是按“模块”堆图

推荐三张核心面板即可覆盖 80% 排障:

  1. 系统交付健康面板(大盘)
    • 数据新鲜度、评估次数、阻塞原因 Top、拒单 Top、回测任务状态
  2. 数据链路面板
    • tick/bars 摄入速率、滞后、缺口、按 marketId/code 维度切片
  3. 策略交付面板
    • 各策略评估频率、阻塞原因趋势、订单与拒绝分布

这三张面板的目标是:
让你不进日志就能把问题收敛到“数据/策略/执行/引擎”之一。


五、一个验收:从“没成交”到“10 分钟定位原因”

你可以用一个实际场景验收可观测性是否到位:

场景:今天某策略没有成交。
验收路径:

  1. 大盘看数据新鲜度是否异常(bars/tick 是否滞后)
  2. 看策略评估次数是否为 0 或异常低
  3. 看 Blocking Reasons Top 是否显示 NO_SYMBOLS/NO_BARS/ENGINE_ERROR
  4. 若有下单意图,看拒单原因 Top(RISK_REJECTED/BROKER_REJECTED)

如果这条路径能在 10 分钟内收敛原因,而不是“先去翻日志”,说明系统具备交付级可观测性。


结语:可观测性是“交付能力”的外化

当你能把阻塞原因、拒单原因、数据新鲜度这些“交付关键变量”指标化,
系统才可能长期稳定运行,团队才可能持续迭代而不是持续救火。

下一篇(12)我们会讲 Mock 与对外交付:如何在没有外部行情订阅的情况下,也能稳定跑通闭环(演示数据、最小数据集、回归策略)。