背景与目标
在复杂的算法生态中,系统往往涵盖交易搜索、社区推荐、图像识别及广告策略等多个维度。请求通常从 Java 网关下发,进入 C++ 构建的高性能算法核心(如 DSearch 检索、DGraph 图计算、DFeature 特征提取等)。
随着系统复杂度指数级增长,现有的可观测性已难以支撑全链路的稳定性保障。我们需要建设一个业务场景维度的全链路变更事件中心,以'聚焦做好可观测性'为核心,整合各平台资源与数据,提升系统的整体透明度和故障止血效率。
可观测性的四大支柱
业界常提 Trace、Metric 和 Log 三位一体,我们的目标是打造一套'以场景为魂,以联动为骨'的可观测体系,打破数据孤岛,实现算法治理的智能化转型。具体包括以下四个支柱:
- Trace 为径:超越单纯的拓扑记录。通过 Baggage 机制,将复杂的业务语义与算法策略注入链路,实现调用流与业务流的深度耦合。
- Metric 为脉:基于 Trace 自动生成场景化的性能指标,结合元数据关联服务端业务指标,实现指标间的联动。
- Log 为证:推动全链路日志格式化治理,规范异常码和业务码,还原现场证据。
- Event 为源:打通算法侧 10+ 个变更平台,将日均上万次的变更事件实时映射至链路拓扑。
核心攻坚:可观测性标准化
Trace 标准化
在算法生态中,DMerge、DScatter、DGraph、DSearch、DFeature 等核心组件承载着极致的性能诉求。由于 C++ 侧 Trace SDK 的长期缺失,算法服务曾处于微服务观测体系的'孤岛',难以与上下游实现全链路串联。
我们最终没有直接基于 OpenTelemetry C++ SDK 进行二次开发,而是自研了 Trace2.0。主要考量如下:
- 极致性能与可控开销:C++ 服务位于请求链路关键路径,对 RT 与尾延迟极其敏感。OpenTelemetry C++ SDK 偏向通用性与标准完备性,在高 QPS 场景下存在不可忽略的性能不确定性。我们需要对 Span 创建、上下文传播、属性写入等操作进行严格的 CPU 与内存开销控制。
- 原生 SDK 行为不透明:OpenTelemetry C++ SDK 内部实现复杂,可能包含隐式线程或后台任务,在极端并发下的问题定位成本较高。
- 运行模型兼容性:C++ 服务大量基于 brpc 与 bthread 用户态调度模型,若 SDK 依赖 pthread 或引入额外系统线程,可能影响 bthread worker 的调度行为。
- 工程依赖风险:现有工程依赖特定版本的 protobuf,而 OpenTelemetry C++ SDK 对其依赖栈有独立版本要求,静态链接场景下存在符号泄漏与 ABI 冲突风险。
SDK 框架设计

- APM Cpp SDK:实现 Span 的创建、采集和上报,同时与控制平面对接实现心跳和配置热更新,基于 Kafka 上报 Trace。
- brpc-tracer:brpc 框架适配层,支持 http 与 baidu-std 协议的自动上报探针。
- 引擎接入:业务侧通过依赖 brpc-tracer,支持链路上报。
报文压缩方案
为了降低带宽消耗,避免链路数据与业务请求竞争,我们对报文进行了深度优化:

- :对属性、事件、异常的 key/value 长度进行限制,Span 整体超出阈值部分截断,阈值支持控制平面动态更新。










