
本文字数:9779;估计阅读时间:25 分钟
作者:The ClickStack team
本文在公众号【ClickHouseInc】首发

本月初,我们发布了 ClickStack,这是一款基于 ClickHouse 构建的开源可观测性 (observability) 堆栈,让日志、指标、追踪和会话重放的统一变得比以往更加简单。其背后是同一款被 Netflix、eBay 等企业信赖的高性能引擎。
ClickStack 最大的优势之一在于,它将高基数、宽表事件数据的快速搜索与快速聚合结合在一个开源、低成本的解决方案中。通过采用 OpenTelemetry 进行数据采集,并以 HyperDX 作为 UI 层,ClickStack 提供了从数据摄取到强大可视化探索的完整开箱即用可观测性方案。

在 ClickHouse 的世界里,一个月就能带来巨大的变化。自首次发布以来,我们持续不断地为 ClickStack 增添新功能和改进,致力于让它更强大、更易用。从本月开始,我们会定期分享最新进展,帮助你快速在 ClickStack 部署中应用这些最新改进。
贡献者
首先,我们要感谢本月的新开源贡献者。开源堆栈的构建离不开社区的共同努力,感谢每一位为 ClickStack 贡献力量的朋友——无论是通过 OpenTelemetry collector、Helm chart,还是 HyperDX。我们对你们的付出表示衷心感谢。
Huynguyen-anduin, OhJuhun, mGolestan98
ClickStack 支持 JSON 类型,查询速度更快
本月 ClickStack 的最大更新虽简单,但意义重大。我们为 ClickStack 新增了对 ClickHouse 原生 JSON 列类型的测试版支持。这一功能为基于 ClickHouse 的可观测性 (observability) 工作负载带来了全新的扩展性、性能和压缩能力——在我们的测试中,查询速度相比 Map 类型最高提升了 9 倍。
为什么需要支持 JSON?
在构建可观测性解决方案时,用户往往希望能够直接“发送事件”,而不必受限于严格的 Schema。实际情况是,可观测性数据来源复杂多样——不同的应用、团队,甚至组织,各自的结构不断演变。尽管结构化日志和 OpenTelemetry 等标准有所帮助,但团队依然需要捕获任意数量、类型和层级的标签与字段。
此前,ClickStack 中用于 OpenTelemetry 数据的 Schema 主要依赖 Map 类型,来处理如 LogAttributes、ResourceAttributes 和 SpanAttributes 这类包含动态属性的列。尽管这种方案可行,但也存在明显的不足:
-
类型精度的损失:Map 的键和值都被存储为字符串,所有数据被强制转为单一类型。数值比较只能在查询时转换类型,既冗长又影响性能,同时占用更多内存。
-
单列顺序扫描:使用 Map 类型时,所有 JSON 路径都存储在一个列中,查询某个键时需要加载并扫描整个 Map。当键数量众多时,导致大量不必要的 I/O,查询效率低下。用户通常通过物化列来预先提取需要的值以规避这一问题。
-
不支持原生嵌套:Map 类型在处理原始值时尚可,但对嵌套的 Map 和数组支持较差,所有内容都被转成字符串。复杂数据需序列化成 JSON 字符串,查询繁琐且低效。例如,LogAttributes 结构中:
{ "service.name": "user-service", "service.version": "1.2.3", "http.status_code": "200", "user.preferences": "{\"theme\":\"dark\",\"notifications\":{\"email\":true,\"push\":false}}", "error.stack": "[\"AuthError: Invalid token\",\" at validateToken (auth.js:45)\",\" at middleware (app.js:23)\"]" }
像

最低0.47元/天 解锁文章
813

被折叠的 条评论
为什么被折叠?



