ClickHouse 官方文档:设计可观测性数据模型【2/5】
本篇为第二篇《设计数据模型》,正文如下: 我们建议用户为日志和跟踪设计自己的数据模型,主要原因如下:
以上各项场景将在后文中详细说明。 重要提示:尽管鼓励用户对数据模型进行扩展和优化,以实现最佳的压缩和查询性能,但建议尽可能遵循 OTel(OpenTelemetry)模式中的核心字段命名规则。例如,ClickHouse 的 Grafana 插件依赖一些基础字段(如 Timestamp 和 SeverityText)来辅助构建查询。日志和跟踪所需的必备字段已在文档 [1][2] 中列出。用户也可以通过插件配置自定义这些字段名以覆盖默认设置。 无论是结构化日志还是非结构化日志,用户通常需要以下功能:
示例查询: 假设我们希望统计接收到最多 POST 请求的 URL 路径。此路径信息以 JSON 数据块的形式存储在 Body 列中(字符串类型)。如果用户在采集器中启用了 json_parser,这部分数据也可能存储在 LogAttributes 列中,类型为 Map(String, String)。
当 LogAttributes 可用时,可以通过以下查询统计网站中接收到最多 POST 请求的 URL 路径:
在上述查询中,使用了 Map 的语法(如 LogAttributes['request_path']),同时通过 path 函数去除 URL 的查询参数。 如果用户未启用 JSON 解析,LogAttributes 将为空,则需要通过 JSON 函数从 Body 列中的字符串提取字段。
针对非结构化日志的处理
对于非结构化日志,类似的查询需要使用 extractAllGroupsVertical 函数,通过正则表达式解析数据。
相比结构化日志,解析非结构化日志的查询复杂度更高,性能成本也更大(尤其需要注意性能差异)。因此,我们建议用户尽可能选择使用结构化日志。
以上两种处理场景都可以通过在数据写入时,将查询逻辑预处理并存储到 ClickHouse 来实现。我们将在下文探讨几种具体方法,并说明每种方法的适用场景。
物化字段 物化字段是从其他列提取数据结构的最简单方法。这类字段的值会在数据写入时自动计算,无法通过 INSERT 查询直接指定。
物化字段支持 ClickHouse 的所有表达式,并可使用多种分析函数对数据进行处理,例如字符串操作(包括正则表达式和搜索)、URL 解析、类型转换、从 JSON 中提取值以及数学运算。 我们推荐在基础数据处理场景中使用物化字段,尤其适用于从 Map 类型列中提取值,将其提升为顶层字段,或进行类型转换。在简单的模式设计中,或与物化视图结合使用时,这些字段能发挥最佳效果。例如,在以下日志模式中,JSON 数据已通过采集器提取到 LogAttributes 列中:
关于如何通过 JSON 函数从字符串类型的 Body 列提取数据的等效模式,请参见相关文档【https://pastila.nl/?005cbb97/513b174a7d6114bf17ecc657428cf829#gqoOOiomEjIiG6zlWhE+Sg==】。 在示例中,我们定义了三个物化字段,分别提取了请求页面、请求类型和引用域名。这些字段从 Map 中提取键值,并对其值进行了相应的处理。经过优化后,查询性能显著提升:
物化视图为日志和追踪的数据处理提供了一种更强大的 SQL 筛选和转换方式。 通过物化视图,用户可以将计算的开销从查询阶段转移到数据写入阶段。ClickHouse 的物化视图本质上是一个触发器,它会在数据写入表时执行指定查询,并将查询结果存储到另一个“目标”表中。
物化视图的查询可以是几乎任何 SELECT 语句,包括聚合查询,但在涉及 Joins 时存在一定的限制。对于日志和追踪所需的转换和筛选任务,几乎所有的查询都可以被支持。 需要注意,物化视图的查询只是一个触发器,用于对插入源表的每一行数据执行计算,并将结果写入目标表。 为了避免数据同时存储在源表和目标表中,可以将源表的存储引擎更改为 Null 表引擎,同时保留原始表的模式。OTel 采集器将继续向源表发送数据。例如,对于日志,可以将 otel_logs 表修改为:
Null 表引擎:日志处理优化 Null 表引擎是一个强大的优化工具,可以理解为 /dev/null。该表不会存储任何数据,但所有关联的物化视图会在插入数据时执行相应的操作,随后这些数据会被丢弃。 查询示例 以下查询将行数据转换为所需的格式,从 LogAttributes 中提取所有列(假设这些列由采集器通过 json_parser 操作符设置),并根据简单条件和列定义生成或提取 SeverityText 和 SeverityNumber。在该示例中,我们仅选择已知会被填充的列,忽略例如 TraceId、SpanId 和 TraceFlags 这样的列。
|
版权声明:本文为 clickhouse 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。