使用 Grafana 和 ClickHouse 进行可观测性分析
Grafana 是 ClickHouse 中可观测性数据的首选可视化工具。这是通过使用 Grafana 的官方 ClickHouse 插件实现的。用户可以按照此处找到的安装说明进行操作。
插件的 V4 版本使日志和追踪成为新的查询构建器体验中的首要公民。这最大限度地减少了 SRE 编写 SQL 查询的需求,并简化了基于 SQL 的可观测性,推动了这种新兴范式的发展。其中的一部分是将 Open Telemetry (OTel) 置于插件的核心,因为我们相信这将是未来几年基于 SQL 的可观测性的基础,以及数据收集的方式。
Open Telemetry 集成
在 Grafana 中配置 Clickhouse 数据源时,该插件允许用户为日志和追踪指定默认数据库和表,以及这些表是否符合 OTel 模式。这允许插件返回在 Grafana 中正确渲染日志和追踪所需的列。如果您对默认 OTel 模式进行了更改,并且希望使用自己的列名,则可以指定这些名称。对于时间 (Timestamp)、日志级别 (SeverityText) 或消息体 (Body) 等列,使用默认的 OTel 列名意味着无需进行任何更改。
用户可以通过 HTTP 或 Native 协议将 Grafana 连接到 ClickHouse。后者提供边际性能优势,这在 Grafana 用户发出的聚合查询中不太可能被察觉。相反,HTTP 协议通常更易于用户代理和内省。
日志配置需要时间、日志级别和消息列,以便正确渲染日志。
追踪配置稍微复杂一些(完整列表此处)。此处所需的列是必要的,以便可以抽象出构建完整追踪配置文件的后续查询。这些查询假设数据结构与 OTel 类似,因此显著偏离标准模式的用户将需要使用视图才能从此功能中受益。

配置完成后,用户可以导航到Grafana Explore并开始搜索日志和追踪。
日志
如果遵守 Grafana 对日志的要求,用户可以在查询构建器中选择“查询类型:日志”,然后单击“运行查询”。查询构建器将制定一个查询以列出日志并确保它们被渲染,例如:
SELECT Timestamp as timestamp, Body as body, SeverityText as level, TraceId as traceID FROM "default"."otel_logs" WHERE ( timestamp >= $__fromTime AND timestamp <= $__toTime ) ORDER BY timestamp DESC LIMIT 1000

查询构建器提供了一种修改查询的简单方法,避免了用户编写 SQL 的需要。可以从查询构建器执行过滤,包括查找包含关键字的日志。希望编写更复杂查询的用户可以切换到 SQL 编辑器。只要返回适当的列,并且选择“日志”作为查询类型,结果将渲染为日志。日志渲染所需的列在此处列出。
日志到追踪
如果日志包含追踪 ID,用户可以受益于能够导航到特定日志行的追踪。

追踪
与上述日志记录体验类似,如果满足 Grafana 渲染追踪所需的列(例如,通过使用 OTel 模式),则查询构建器能够自动制定必要的查询。通过选择“查询类型:追踪”并单击“运行查询”,将生成并执行类似于以下内容的查询(取决于您配置的列 - 以下假设使用 OTel)
SELECT "TraceId" as traceID,
"ServiceName" as serviceName,
"SpanName" as operationName,
"Timestamp" as startTime,
multiply("Duration", 0.000001) as duration
FROM "default"."otel_traces"
WHERE ( Timestamp >= $__fromTime AND Timestamp <= $__toTime )
AND ( ParentSpanId = '' )
AND ( Duration > 0 )
ORDER BY Timestamp DESC, Duration DESC LIMIT 1000
此查询返回 Grafana 期望的列名,渲染追踪表,如下所示。可以执行基于持续时间或其他列的过滤,而无需编写 SQL。

希望编写更复杂查询的用户可以切换到“SQL 编辑器”。
查看追踪详情
如上所示,追踪 ID 渲染为可点击的链接。单击追踪 ID 后,用户可以选择通过“查看追踪”链接查看相关的 span。这将发出以下查询(假设 OTel 列)以检索所需结构中的 span,并将结果渲染为瀑布图。
WITH '<trace_id>' as trace_id,
(SELECT min(Start) FROM "default"."otel_traces_trace_id_ts"
WHERE TraceId = trace_id) as trace_start,
(SELECT max(End) + 1 FROM "default"."otel_traces_trace_id_ts"
WHERE TraceId = trace_id) as trace_end
SELECT "TraceId" as traceID,
"SpanId" as spanID,
"ParentSpanId" as parentSpanID,
"ServiceName" as serviceName,
"SpanName" as operationName,
"Timestamp" as startTime,
multiply("Duration", 0.000001) as duration,
arrayMap(key -> map('key', key, 'value',"SpanAttributes"[key]),
mapKeys("SpanAttributes")) as tags,
arrayMap(key -> map('key', key, 'value',"ResourceAttributes"[key]),
mapKeys("ResourceAttributes")) as serviceTags
FROM "default"."otel_traces"
WHERE traceID = trace_id
AND startTime >= trace_start
AND startTime <= trace_end
LIMIT 1000
请注意以上查询如何使用物化视图 otel_traces_trace_id_ts
来执行追踪 ID 查找。有关更多详细信息,请参阅加速查询 - 使用物化视图进行查找。

追踪到日志
如果日志包含追踪 ID,用户可以从追踪导航到其关联的日志。要查看日志,请单击追踪 ID 并选择“查看日志”。这将发出以下查询,假设使用默认的 OTel 列。
SELECT Timestamp as "timestamp",
Body as "body", SeverityText as "level",
TraceId as "traceID" FROM "default"."otel_logs"
WHERE ( traceID = '<trace_id>' )
ORDER BY timestamp ASC LIMIT 1000

仪表板
用户可以使用 ClickHouse 数据源在 Grafana 中构建仪表板。我们建议用户参考 Grafana 和 ClickHouse 数据源文档以获取更多详细信息,特别是宏的概念和变量。
该插件提供了几个开箱即用的仪表板,包括一个示例仪表板“Simple ClickHouse OTel dashboarding”,用于记录和追踪符合 OTel 规范的数据。这要求用户遵守 OTel 的默认列名,并且可以从数据源配置中安装。

我们在下面提供了一些构建可视化的简单技巧。
时间序列
除了统计数据外,折线图是可观测性用例中最常用的可视化形式。如果查询返回名为“time”的 datetime
和一个数值列,则 Clickhouse 插件将自动渲染折线图。例如
SELECT
$__timeInterval(Timestamp) as time,
quantile(0.99)(Duration)/1000000 AS p99
FROM otel_traces
WHERE
$__timeFilter(Timestamp)
AND ( Timestamp >= $__fromTime AND Timestamp <= $__toTime )
GROUP BY time
ORDER BY time ASC
LIMIT 100000

多折线图
如果查询满足以下条件,则将自动渲染多折线图
- 字段 1:别名为 time 的 datetime 字段
- 字段 2:要分组的值。这应该是字符串。
- 字段 3+:指标值
例如
SELECT
$__timeInterval(Timestamp) as time,
ServiceName,
quantile(0.99)(Duration)/1000000 AS p99
FROM otel_traces
WHERE $__timeFilter(Timestamp)
AND ( Timestamp >= $__fromTime AND Timestamp <= $__toTime )
GROUP BY ServiceName, time
ORDER BY time ASC
LIMIT 100000

可视化地理数据
我们已经在前面的章节中探讨了使用 IP 字典丰富具有地理坐标的可观测性数据。假设您有 latitude
和 longitude
列,则可以使用 geohashEncode
函数可视化可观测性。这将生成与 Grafana Geo Map 图表兼容的地理哈希。下面显示了一个示例查询和可视化
WITH coords AS
(
SELECT
Latitude,
Longitude,
geohashEncode(Longitude, Latitude, 4) AS hash
FROM otel_logs_v2
WHERE (Longitude != 0) AND (Latitude != 0)
)
SELECT
hash,
count() AS heat,
round(log10(heat), 2) AS adj_heat
FROM coords
GROUP BY hash
