首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >得物云原生全链路追踪Trace2.0架构实践

得物云原生全链路追踪Trace2.0架构实践

原创
作者头像
得物技术
发布于 2022-09-08 03:00:23
发布于 2022-09-08 03:00:23
1.7K00
代码可运行
举报
文章被收录于专栏:得物技术得物技术
运行总次数:0
代码可运行

导读:

分布式链路追踪作为解决分布式应用可观测问题的重要技术,得物全链路追踪(简称Trace2.0)基于OpenTelemetry提供的可观测标准方案实现新一代的一站式全链路观测诊断平台,并通过全量采集Trace帮助业务提高故障诊断、性能优化、架构治理的效率。

全量采集Trace数据(日增数百TB 、数千亿条Span数据)并以较低的成本保证数据的实时处理与高效查询,对Trace2.0后端整体的可观测性解决方案提出了极高的要求。本文将详细介绍Trace2.0背后的架构设计、尾部采样和冷热存储方案,以及我们是如何通过自建存储实现进一步的降本增效(存储成本下降66%)。

1. 整体架构设计

全链路追踪Trace2.0从数据接入侧、计算、存储到查询整体模块架构如上图所示。这里说一下各组件的核心能力:

  • 客户端&数据采集:集成并定制OpenTelemetry提供的多语言SDK(Agent),生成统一格式的可观测数据。
  • 控制平面Control Plane:统一的配置中心向数据采集侧下发各类动态配置发并实时生效;支持向各采集器下发动态配置并实时生效,支持应用按实例数灰度接入,并提供出入参收集动态开关、性能剖析动态开关、流量染色动态配置、客户端版本管理等。
  • 数据收集服务OTel Server:数据收集器OTel Server兼容OpenTelemetry Protocol(OTLP)协议,提供gRPC和HTTP两种方式接收采集器发送的可观测数据。
  • 分析计算&存储OTel Storage:计算侧除了基础的实时检索能力外,还提供了场景化的数据分析计算主要包括:
    • 存储Trace数据:数据分为两段,一段是索引字段,包括TraceID、ServiceName、SpanName、StatusCode、Duration和起止时间等基本信息,用于高级检索;另一段是明细数据(源数据,包含所有的Span数据)
    • 计算SpanMetrics数据:聚合计算Service、SpanName、Host、StatusCode、Env、Region等维度的执行总次数、总耗时、最大耗时、最小耗时、分位线等数据;
    • 业务单号关联Trace:电商场景下部分研发多以订单号、履约单号、汇金单号作为排障的输入,因此和业务研发约定特殊埋点规则后--在Span的Tag里添加一个特殊字段"bizOrderId={实际单号}"--便将这个Tag作为ClickHouse的索引字段;从而实现业务链路到全链路Trace形成一个完整的排障链路;
    • Redis热点数据统计:在客户端侧扩展调用Redis时入参和出参SpanTag埋点,以便统Redis命中率、大Key、高频写、慢调用等指标数据;
    • MySQL热点数据统计:按照SQL指纹统计调用次数、慢SQL次数以及关联的接口名。

2. 尾部采样&冷热存储

得物早期的全链路追踪方案出于对存储成本的考虑,在客户端设置了1%的采样率,导致研发排查问题时经常查询不到想看的Trace链路。那么Trace2.0为了解决这个问题,就不能仅仅只是简单地将客户端的采样率调整为100%,而是需要在客户端全量采集Trace数据的同时,合理地控制Trace存储成本。且从实践经验来看,Trace数据的价值分布是不均匀的,随着时间的推移Trace的数据价值是急速降低的。

全量存储Trace数据不仅会造成巨大的成本浪费,还会显著地影响整条数据处理链路的性能以及稳定性。所以,如果我们能够只保存那些有价值、大概率会被用户实际查询的Trace,就能取得成本与收益的平衡。那什么是有价值的Trace呢?根据日常排查经验,我们发现业务研发主要关心以下四类优先级高场景:

  • 在调用链上出现了异常ERROR;
  • 在调用链上出现了大于「200ms」的数据库调用;
  • 整个调用链耗时超过「1s」;
  • 业务场景的调用链,比如通过订单号关联的调用链。

在这个背景下,并结合业界的实践经验,落地Trace2.0的过程中设计了尾部采样&冷热分层存储方案,方案如下:

  • 「3天」内的Trace数据全量保存,定义为热数据。
  • 基于Kafka延迟消费+Bloom Filter尾部采样的数据(错、慢、自定义采样规则、以及默认常规0.1%采样数据)保留「30天」,定义为冷数据。

整体处理流程如下:

  • OTel Server数据收集&采样规则:将客户端采集器上报的全量Trace数据实时写入Kafka中,并把满足采样规则(上述定义的场景)的Span数据对应的TraceID记录到Bloom Filter中;
  • OTel Storage持久化热数据:实时消费Kafka中数据,并全量持久化到ClickHouse热集群中;
  • OTel Storage持久化冷数据:订阅上游OTel Server的Bloom Filter,延迟消费Kafka中的数据,将TraceID在Bloom Filter中可能存在的Span数据持久化到ClickHouse冷集群中;延迟时间配置的30分钟,尽量保证一个Trace下的Span完整保留。
  • TraceID点查: Trace2.0自定义了TraceID的生成规则;在生成TraceID时,会把当前时间戳秒数的16进制编码结果(占8个字节)作为TraceID的一部分。查询时只需要解码TraceId中的时间戳,即可知道应该查询热集群还是冷集群。

接下来再介绍一下尾部采样中Bloom Filter的设计细节,如下图所示:

整体处理流程如下:

  • OTel Server会将满足采样规则的Span数据对应的TraceID,根据TraceID中的时间戳写入到对应时间戳的Bloom Filter中;
  • Bloom Filter会按十分钟粒度(可根据实际的数据量并结合BloomFilter的误算率和样本大小计算内存消耗并调整)进行分片,十分钟过后将Bloom Filter进行序列化并写入到ClickHouse存储中;
  • OTel Storage消费侧拉取Bloom Filter数据(注意:同一个时间窗口,每一个OTel Server节点都会生成一个BloomFilter)并进行合并Merge(减少Bloom Filter的内存占用并提高Bloom Filter的查询效率)。

综上所述,Trace2.0仅使用了较少的资源就完成了尾部采样和冷热分层存储。既为公司节约了成本,又保存了几乎所有「有价值」Trace,解决了业务研发日常排查时查询不到想看的Trace的问题。

3. 自建存储&降本增效

3.1 基于SLS-Trace的解决方案

Trace2.0建设初期采用了SLS专为OpenTelemetry定制的Trace方案 【1】,提供了Trace查询、调用分析、拓扑分析等功能,如下图所示:

SLS-Trace主要处理流程如下:

  • 利用OpenTelemetry Collector aliyunlogserverexporter【2】将Trace数据写入到SLS-Trace Logstore中;
  • SLS-Trace通过默认提供的Scheduled SQL任务定时聚合Trace数据并生成相应的Span指标与应用、接口粒度的拓扑指标等数据。

随着Trace2.0在公司内部全面铺开,SLS的存储成本压力变得越来越大,为了响应公司“利用技术手段实现降本提效”的号召,我们决定自建存储。

3.2 基于ClickHouse的解决方案

目前业内比较流行的全链路追踪开源项目(SkyWalking、Pinpoint、Jaeger等)采用的存储大都是基于ES或者HBase实现的。而近几年新兴的开源全链路追踪开源项目(Uptrace【3】、Signoz【4】等)采用的存储大都是基于ClickHouse实现的,同时将Span数据清洗出来的指标数据也存储在ClickHouse中。且ClickHouse的物化视图(很好用)也很好地解决了指标数据降采样(DownSampling)的问题。最终经过一番调研,我们决定基于ClickHouse来自建新的存储解决方案。整体架构图如下:

整体处理流程如下:

  • Trace索引&明细数据:OTel Storage会将基于Span原始数据构建的索引数据写入到SpanIndex表中,将Span原始明细数据写入到SpanData表中(相关表设计可以参考Uptrace【5】);
  • 计算&持久化SpanMetrics数据:OTel Storage会根据Span的Service、SpanName、Host、StatusCode等属性统计并生成「30秒」粒度的总调用次数、总耗时、最大耗时、最小耗时、分位线等指标数据,并写入到SpanMetrics表;
    • 指标DownSampling功能:利用ClickHouse的物化视图将「秒级」指标聚合成「分钟级」指标,再将「分钟级」指标聚合成「小时级」指标;从而实现多精度的指标以满足不同时间范围的查询需求;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- span_metrics_10m_mv
CREATE MATERIALIZED VIEW IF NOT EXISTS '{database}'.span_metrics_10m_mv_local
            on cluster '{cluster}'
            TO '{database}'.span_metrics_10m_local
AS
SELECT a.serviceName                     as serviceName,
       a.spanName                        as spanName,
       a.kind                            as kind,
       a.statusCode                      as statusCode,
       toStartOfTenMinutes(a.timeBucket) as timeBucket,
       sum(a.count)                      as count,
       sum(a.timeSum)                    as timeSum,
       max(a.timeMax)                    as timeMax,
       min(a.timeMin)                    as timeMin
FROM '{database}'.span_metrics_30s_local as a
GROUP BY a.serviceName, a.spanName, a.kind, a.statusCode,
    toStartOfTenMinutes(a.timeBucket);
  • 元数据(上下游拓扑数据):OTel Storage根据Span属性中的上下游关系(需要在客户端埋相关属性),将拓扑依赖关系写入到图数据库Nebula中。

ClickHouse写入细节

ClickHouse使用Distributed引擎实现了Distributed(分布式)表机制,可以在所有分片(本地表)上建立视图,实现分布式查询。并且Distributed表自身不会存储任何数据,它会通过读取或写入其他远端节点的表来进行数据处理。SpanData表创建语句如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- span_data
CREATE TABLE IF NOT EXISTS '{database}'.span_data_local ON CLUSTER '{cluster}'
(
    traceID                   FixedString(32),
    spanID                    FixedString(16),
    startTime                 DateTime64(6 ) Codec (Delta, Default),
    body                      String CODEC (ZSTD(3))
) ENGINE = MergeTree
ORDER BY (traceID,startTime,spanID)
PARTITION BY toStartOfTenMinutes(startTime)
TTL toDate(startTime) + INTERVAL '{TTL}' HOUR;

-- span_data_distributed
CREATE TABLE IF NOT EXISTS '{database}'.span_data_all ON CLUSTER '{cluster}'
as '{database}'.span_data_local
    ENGINE = Distributed('{cluster}', '{database}', span_data_local,
                         xxHash64(concat(traceID,spanID,toString(toDateTime(startTime,6)))));

整体写入流程比较简单(注意:避免使用分布式表),如下所示:

  • 定时获取ClickHouse集群节点;
  • 通过Hash函数选择对应的ClickHouse节点,然后批量写ClickHouse的本地表。

上线效果

全链路追踪是一个典型的写多读少的场景,因此我们采用了ClickHouse ZSTD压缩算法对数据进行了压缩,压缩后的压缩比高达12,效果非常好。目前ClickHouse冷热集群各使用数十台16C64G ESSD机器,单机写入速度25w/s(ClickHouse写入的行数)。相比于初期的阿里云SLS-Trace方案,存储成本下降66%,查询速度也从800+ms下降至490+ms。

下一步规划

目前Trace2.0将Span的原始明细数据也存储在了ClickHouse中,导致ClickHouse的磁盘使用率会有些偏高,后续考虑将Span明细数据先写入HDFS/OSS等块存储设备中,ClickHouse来记录每个Span在块存储中的offset,从而进一步降低ClickHouse的存储成本。

关于我们: 得物监控团队提供一站式的可观测性平台,负责链路追踪、时序数据库、日志系统,包括自定义大盘、应用大盘、业务监控、智能告警、AIOPS等排障分析。

引用 【1】SLS-Trace方案 https://developer.aliyun.com/article/785854 【2】SLS-Trace Contrib https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/alibabacloudlogserviceexporter 【3】Uptrace https://uptrace.dev/ 【4】Signoz https://signoz.io/ 【5】Uptrace Schema设计https://github.com/uptrace/uptrace/tree/v0.2.16/pkg/bunapp/migrations

本篇是《得物云原生全链路追踪Trace2.0》系列开篇,

得物云原生全链路追踪Trace2.0架构实践 得物云原生全链路追踪Trace2.0产品篇 得物云原生全链路追踪Trace2.0采集篇 得物云原生全链路追踪Trace2.0数据挖掘

*文/南风

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
得物云原生全链路追踪Trace2.0-采集篇
2020年3月,得物技术团队在三个月的时间内完成了整个交易体系的重构,交付了五彩石项目,业务系统也进入了微服务时代。系统服务拆分之后,虽然每个服务都会有不同的团队各司其职,但服务之间的依赖也变得复杂,对服务治理等相关的基础建设要求也更高。
得物技术
2022/12/08
1.4K0
得物云原生全链路追踪Trace2.0-采集篇
全链路追踪在腾讯云的落地思考与实践
随着微服务以及容器技术的发展,系统软件的构建方式也随之发生了改变,微服务调用关系错综复杂,传统的监控方案很难满足当下应用场景的需求,指标、链路追踪以及日志目前已经成为了云原生应用的“必备品”,当把它们集成在一起时,需要拥有一个更加成熟的现代化可观测体系来支撑,以便了解应用系统内发生的事情。通过可观测性体系的建立,我们可以更好的去洞察监控数据,从而能够更快速的做问题定界以及根因定位,降低 MTTR。
腾讯云可观测平台
2024/01/03
9241
全链路追踪在腾讯云的落地思考与实践
Opentelemetry 实践分享 - Golang篇
Opentelemetry 是一个CNCF社区下一个开源的可观测性框架,或者也可以说是一组工具、API 和 SDK 的集合,来检测、生成、收集和导出可观测性数据(指标、日志和链路),以帮助我们分析软件的性能和行为。
云原生小白
2023/08/28
4.8K0
Opentelemetry 实践分享 - Golang篇
一文详解|Go 分布式链路追踪实现原理
在分布式、微服务架构下,应用一个请求往往贯穿多个分布式服务,这给应用的故障排查、性能优化带来新的挑战。分布式链路追踪作为解决分布式应用可观测问题的重要技术,愈发成为分布式应用不可缺少的基础设施。本文将详细介绍分布式链路的核心概念、架构原理和相关开源标准协议,并分享我们在实现无侵入 Go 采集 Sdk 方面的一些实践。
开源小E
2022/06/20
1.5K0
一文详解|Go 分布式链路追踪实现原理
腾讯蓝鲸 游戏服务全链路、真全栈无盲点可观测实践
本文整理自2023年12月16日于北京清华大学举办的 以《网络为中心的零侵扰可观测性》的技术论坛, 来自蓝鲸观测平台团队的 刘文平 做了题为 《腾讯游戏真全栈观测实践》的演讲。 介绍了腾讯 IEG 蓝鲸观测平台如何运用前沿的 DeepFlow 的 eBPF 技术,结合传统的 APM 体系,实现了对游戏服务全链路、真全栈,无盲点观测。这一跨越系统、网络、应用、基础组件、服务到业务的监控能力,不仅提升了问题诊断的效率,还优化了应用性能,确保了游戏玩家能获得最佳的体验。
DeepFlow
2024/02/06
6810
腾讯蓝鲸 游戏服务全链路、真全栈无盲点可观测实践
MCP(Model Context Protocol)全链路追踪:调用链监控技术剖析
在微服务架构日益普及的今天,分布式系统的复杂性给开发者带来了前所未有的挑战。一个简单的用户请求,可能在后端触发几十个服务的协同工作。当系统出现性能瓶颈或故障时,传统的日志和监控手段往往显得捉襟见肘。我们迫切需要一种能够贯穿整个调用链的监控技术,这就是 MCP(Model Context Protocol)全链路追踪的核心价值。
二一年冬末
2025/04/29
4780
MCP(Model Context Protocol)全链路追踪:调用链监控技术剖析
B站基于Clickhouse的下一代日志体系建设实践
日志作为线上定位问题排障的重要手段,在可观测领域有着不可替代的作用。稳定性、成本、易用性、可扩展性都是日志系统需要追求的关键点。
从大数据到人工智能
2022/10/28
2.5K0
B站基于Clickhouse的下一代日志体系建设实践
作业帮基础观测能力之二全链路追踪实践
在传统的单体架构应用中,由于系统规模相对较小,服务调用链路简单,追踪系统的建设和使用相对容易。但随着微服务架构的流行,服务之间的交互和调用复杂度急剧增加。此时,传统的追踪系统已无法满足对多服务、跨系统的全链路追踪需求,因此需要引入分布式追踪系统。
深度学习与Python
2025/06/08
930
作业帮基础观测能力之二全链路追踪实践
基于 eBPF 的云原生可观测性深度实践
本文整理自云杉网络 DeepFlow 产品负责人向阳在 QCon 2023 的演讲分享,主题为“基于 eBPF 的云原生可观测性深度实践”。
从大数据到人工智能
2023/04/18
1.4K2
基于 eBPF 的云原生可观测性深度实践
Istio多集群链路追踪实践
为了实现多集群的流量治理,我们采用Istio官方提供的多主集群进行Istio的部署,这样就出现一个问题,对于多主集群的Istio治理,如何进行跨集群的流量监控,实现跨集群的服务链路追踪。
CNCF
2022/11/28
1.1K0
Istio多集群链路追踪实践
分布式系统架构6:链路追踪
在复杂的分布式系统中,系统通常由多个独立的服务组成,几乎每一个前端请求都会形成一个复杂的分布式服务调用链路。
卷福同学
2025/01/01
1670
分布式系统架构6:链路追踪
基于AutoTagging技术实践 构建统一的可观测性数据平台
混合云以及容器逐渐成为承载微服务应用的主要基础设施,对于云原生应用的监控保障,也面临诊断难、规模广、弹性大、波动性强等挑战,这些挑战同时也使得云原生应用可观测性成为了运维开发关注的焦点。基于云杉网络在混合云网络场景下的多年实践,给大家分享在构建统一的云原生应用可观测性数据平台中的一些思考和经验。
清华土著
2022/04/24
8520
基于AutoTagging技术实践 构建统一的可观测性数据平台
微服务日志实践指南 [包含最佳实践]
微服务日志是在分布式微服务架构中跟踪和记录特定服务活动的实践。日志记录是任何软件系统的重要方面,对于微服务架构更为关键,因为有许多小型、独立的服务相互交互。
云云众生s
2024/03/28
7090
微服务日志实践指南 [包含最佳实践]
腾讯蓝鲸 x DeepFlow 基于 eBPF 的可观测性实践
本文整理自腾讯 IEG 高级研发工程师刘文平在《蓝鲸 x DeepFlow 可观测性 Meetup》中的分享实录,详细阐述了蓝鲸可观测性平台如何有效地 融合了 OpenTelemetry 的标准化数据接入能力及 DeepFlow 的无插桩、全面覆盖的数据收集能力, 进而解决游戏业务在观测数据采集、数据孤岛、以及云原生基础设施观测等领域所面临的难题。并展望了通过 DeepFlow,构建适合腾讯游戏的专属观测场景。
深度学习与Python
2023/08/09
1K0
腾讯蓝鲸 x DeepFlow 基于 eBPF 的可观测性实践
蚂蚁集团 SOFATracer 原理与实践
微服务架构带来很多好处的同时也让系统的复杂度提升了,传统的单体应用按照不同的维度拆分成一个一个分布式微服务,不同的微服务甚至可能采用不同的语言编写;此外,服务的部署往往都是分布式的,可能有几千台服务器,横跨多个不同的城市数据中心。下图是一个典型的微服务架构,图中的节点数还比较少,在支付宝,一个线下支付整体交易付款链路,涉及上百个节点。
磊叔的技术博客
2025/06/07
820
蚂蚁集团 SOFATracer 原理与实践
分布式链路追踪续集
在上一文中提到为了统一各种分布式追踪系统的实现,CNCF (云原生计算基金会)下的 OpenTracing 项目定义了一套分布式追踪的标准,可以使用 OpenTracing API 完成代码的监控埋点,最后用户自由选择遵循 OpenTracing 标准的链路追踪系统,比如 jaeger 。
gopher云原生
2021/10/18
8300
有赞全链路追踪实践
在企业级业务系统日趋复杂的背景下,微服务架构逐渐成为了许多中大型企业的标配,它将庞大的单体应用拆分成多个子系统和公共的组件单元。这一理念带来了许多好处:复杂系统的拆分简化与隔离、公共模块的重用性提升与更合理的资源分配、大大提升了系统变更迭代的速度、更灵活的可扩展性以及在云计算中的适用性,等等。
有赞coder
2020/08/24
1.2K0
有赞全链路追踪实践
RUM、APM 强强联手实现全链路监控
导语:文章主要讲解如何让前端性能监控(RUM)和应用性能监控(APM)串联起来,在腾讯云可观测平台实现全链路高效监控。
腾讯云可观测平台
2025/02/11
1970
RUM、APM 强强联手实现全链路监控
日志与追踪的完美融合:OpenTelemetry MDC 实践指南
如果不是,则在日志中捞出 trace_id 再到链路查询系统中查询链路,看看具体是哪个系统的问题,然后再做具体的排查。
crossoverJie
2024/10/02
3590
腾讯文档大仓服务治理:基于自研tRPC框架的研发提效实践
01、背景现状 tRPC 是腾讯自研的高性能、跨平台、插件化、具备高度服务治理能力的 RPC 框架, 目前在公司内各大业务广泛使用并已对外开源,详见:腾讯开
腾讯云开发者
2024/04/02
1.2K0
腾讯文档大仓服务治理:基于自研tRPC框架的研发提效实践
推荐阅读
相关推荐
得物云原生全链路追踪Trace2.0-采集篇
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验