当前位置: 首页 > article >正文

APO选择ClickHouse存储Trace的考量

OpenTelemetry生态已经很成熟,但对用户而言,选择OpenTelemetry 仍然需要考虑以下几个问题:

  • 探针的成熟度
  • 海量Trace数据的存储和展示的问题

本文重点讨论海量Trace数据的存储与展示问题,APO定位是一个OpenTelmetry的发行版,本文将重点讨论APO团队是如何考虑这个问题的。

现有OpenTelemetry的Trace存储方案

OpenTelemetry生态过于灵活,选择众多,这也给用户带来了幸福的烦恼。

直接使用Jaeger+ElasticSearch方案

Jaeger作为老牌的Tracing方案,其使用习惯已经被很多用户所接受,Jaeger与OpenTelemetry同属于CNCF组织下的开源项目,所以两者也是结合最紧密的。

目前使用OpenTelemetry方式最快的方式使用的是Jaeger+ElasticSearch方案,该方案成熟。但是由于ElasticSearch的存储查询效率并不高,当规模较大的时候成本较大,所以很多用户期望有更加高效的存储方案。

新起的开源Signoz与Uptrace的做法

Signoz与Uptrace是近几年OpenTelemetry生态的发行版本,这两者都选择了ClickHouse作为存储方案,ClickHouse由于其强大的压缩和查询能力,成为很多可观测性方案的标准做法。

Signoz与Uptrace做法相同:自定义ClickHouse的表结构

自定义ClickHouse的表结构的好处在于,所有的内容完全能够自己掌控,但是坏处是其他生态产品很少会基于该自定义表结构进行演进,从而没有办法与其他生态集成。

大量已经习惯了使用Jaeger用户的在使用Signoz和Uptrace的时候都有一定的学习成本,比如需要理解:

  • Span自身花的时间应该如何查找
  • Span的tag应该如何才能查看

这对于没有接触过Jaeger的用户而言是可行的,选择Signoz和Uptrace没有太多差别,但对于已经熟悉Jaeger的用户不大友好。

ClickHouse官方的Exporter方式

ClickHouse官方针对OpenTelemetry生态推出了Exporter,解决了Trace如何落地到ClickHouse的问题,但是并未搭配界面使用,这意味着用户使用ClickHouse官方Exporter的用户,需要定制页面完成Trace的展示和分析工作,这对于绝大部分用户而言并不友好。

Jaeger 2.0 基于ClickHouse的实现Tracing存储方案

具体可以参考文章:迈向 Jaeger v2:更多 OpenTelemetry!

虽然当前Jaeger 1.X版本并没有正式支持ClickHouse,而是在1.57之前通过RemoteStorage 的插件方式支持,具体见链接,在最新的1.58之后,RemoteStorage 就不再支持了。


APO对Trace存储的思考

不同表结构对性能影响没有显著差别

我们团队调研过Jaeger官方关于ClickHouse不同表结构对于Trace插入和查询的影响(主要对比Jaeger RemoteStorage 的表结构和ClickHouse的官方exporter表结构),虽然表结构对性能影响有些许差异,但在插入、查询、压缩比方面各有千秋,而且性能差异对大部分用户也是能接受的。具体见链接。

用户习惯最重要

由于APO在向导式界面已经屏蔽了Trace的细节,先通过指标和告警引导用户到需要查看的Trace时,用户才通过TraceID查看Trace。此时,我们认为用户能够以最小的成本理解Trace细节最重要,所以我们引入了Jaeger来展示Trace细节,并没有重新开发页面或者选择signoz、uptrace的方案。

APO对Jaeger RemoteStorage的扩展

Jaeger2.0 已经明确会支持ClickHouse了,在Jaeger 2.0发版之前,APO做了Jaeger RemoteStorage的扩展,使其能够支持1.58以后的版本。具体实现项目见链接。


总结

ClickHouse不同的表结构对性能会有差异,但是只要使用ClickHouse其存储和查询效率就会比ElasticSearch高很多,所以在这种情况下,用户的体验就是最重要的。

对于用户而言,每天接触的新产品新功能很多,能够在新产品上无缝嫁接其已具备的成熟体验可能是最重要的。


http://www.kler.cn/a/287792.html

相关文章:

  • MySQL的游标和While循环的详细对比
  • Codeforces Round 987 (Div. 2) ABCD
  • IC 脚本之VIM 记录
  • 跟我学C++中级篇——RAII
  • 网络安全之WINDOWS端口及病毒编写
  • CentOS8 在MySQL8.0 实现半同步复制
  • 代理IP的API接口:轻松实现自动化代理切换
  • 《软件工程导论》(第6版)第3章 需求分析 复习笔记
  • 同样128个内核,AMD霄龙9755性能翻倍:Zen 5架构下的性能飞跃
  • 【嵌入式学习笔记】STM32中断配置及相关知识
  • Go语言学习(一)
  • SpringBoot链路追踪②:如何集成?
  • Fabric.js中fabric.Text的深入解析
  • linux下部署数据库总结
  • Kubernetes中三种探针的作用你真的知道吗?
  • C语言操作符的介绍
  • 51单片机-独立按键控制LED显示二进制
  • GoF 代理模式
  • 安泰功率放大器的特点及原理是什么
  • MyBatis【缓存击穿,缓存雪崩,缓存穿透】
  • Microsoft Word使用公式字体Latin Modern Math时导出pdf显示异常
  • jmeter 响应乱码
  • 有手就会之使用Dify构建RAG聊天应用(基于私有知识库和搜索引擎)
  • iOS 模拟器打不开:unable to boot the simulator
  • 解决Java中Long类型的序列化与JDK8时间的序列化
  • 前后端分离项目实战-通用管理系统搭建(前端Vue3+ElementPlus,后端Springboot+Mysql+Redis)第七篇:菜单和路由动态绑定