暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

ClickHouse 官方文档:如何使用 Grafana 分析数据【5/5】

ClickHouseInc 2024-12-13
316



本文字数:5226;估计阅读时间:14 分钟


本文是 ClickHouse 官网文档可观测性系列文章,共有 5 篇:
1. 概述
2. 设计数据模型
3. 管理数据
4. 与 OpenTelemetry 集成
5. 使用 Grafana 分析数据


本篇为第五篇《使用 Grafana 分析数据》,正文如下:


Grafana 是 ClickHouse 中可观测性数据的首选可视化工具。通过官方的 ClickHouse 插件,用户可以轻松集成。用户可参考这里的安装说明进行安装【https://clickhouse.com/docs/en/integrations/grafana】

该插件的 V4 版本将日志和跟踪作为新查询构建器的核心,极大减少了 SRE 编写 SQL 查询的需求,并简化了 SQL 基于可观测性的工作流程,推动了这一新兴的可观测性模式发展。Open Telemetry (OTel) 被集成到插件中,作为未来 SQL 可观测性的基础,这也将成为未来数据采集的主要方式。


Open Telemetry 集成

在 Grafana 中配置 ClickHouse 数据源时,插件允许用户指定日志和跟踪的默认数据库和表,并指定这些表是否遵循 OTel 模式。这可以帮助插件返回正确的日志和跟踪所需的列。如果您修改了 OTel 的默认模式并希望使用自定义列名,插件允许这样配置。如果使用了像时间戳(Timestamp)、日志级别(SeverityText)或消息内容(Body)这样的默认列名,那么无需进行任何更改。

HTTP 或原生协议

用户可以通过 HTTP 协议或原生协议将 Grafana 连接到 ClickHouse。尽管原生协议在性能上有微弱优势,但对于大多数由 Grafana 发出的聚合查询而言,这种提升可能并不明显。相比之下,HTTP 协议在代理和调试方面通常更为简便。

日志配置要求至少包含时间、日志级别和消息内容列,以确保日志正确渲染。

跟踪配置稍显复杂(完整列表见此处【https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree#mergetree-data-storage】),要求提供的列有助于构建完整的跟踪数据。此功能假设数据结构遵循 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 编辑器。只要返回了正确的列,并且选择了日志作为查询类型,结果将自动显示为日志。有关日志渲染所需的列,请参阅这里。【https://grafana.com/developers/plugin-tools/tutorials/build-a-logs-data-source-plugin#logs-data-frame-format】


    日志到跟踪

    如果日志中包含跟踪 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 编辑器。


      查看跟踪详情

      在 Grafana 中,跟踪 ID 会作为可点击的链接显示。点击某个跟踪 ID 后,用户可以选择通过查看跟踪链接查看该跟踪关联的 spans。系统将会发出查询(假设使用 OTel 模式)来检索相关的 spans,并将结果以瀑布图形式呈现。

        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


          构建仪表板

          用户可以使用 Grafana 和 ClickHouse 数据源来构建个性化的仪表板。我们推荐查阅 Grafana 和 ClickHouse 数据源的文档【https://github.com/grafana/clickhouse-datasource】,特别是其中关于宏和变量的部分,这些内容能帮助用户更好地创建动态的仪表板。

          Grafana 插件还提供了多个开箱即用的仪表板,包括一个示例仪表板“简单的 ClickHouse OTel 仪表板”,用于显示符合 OTel 规范的日志和跟踪数据。此示例仪表板要求使用 OTel 默认的列名,并可以通过数据源配置进行安装。

          可视化构建小贴士

          在下面,我们提供了一些关于构建可视化图表的基本建议,帮助用户快速上手。


          时间序列

          在可观测性应用场景中,折线图和统计图表是最常见的可视化方式之一。如果查询返回一个名为 time 的日期时间字段和一个数值类型的列,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


            多线图

            如果查询结果满足以下条件,ClickHouse 插件将自动渲染多线图:

            • 字段 1:日期时间字段,别名为 `time`  

            • 字段 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 字典将地理坐标信息融入可观测性数据。如果你已经有了纬度和经度列,可以使用 geohashEncode 函数对这些数据进行可视化,从而生成与 Grafana 的地理地图图表兼容的地理哈希值。以下是一个查询示例和其对应的可视化效果:

                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


                演示应用

                Open Telemetry 项目提供了一个演示应用【https://opentelemetry.io/docs/demo/】。这个应用的一个维护版本已经集成了 ClickHouse,作为日志和追踪数据的存储源。你可以在此找到相关的代码仓库【https://github.com/ClickHouse/opentelemetry-demo】。用户可以按照官方提供的部署指南【https://opentelemetry.io/docs/demo/docker-deployment/】,使用 Docker 来部署该演示应用。在部署过程中,除了已有的组件外【https://opentelemetry.io/docs/demo/collector-data-flow-dashboard/】,还将部署一个 ClickHouse 实例,用于存储日志和追踪数据。



                注册ClickHouse中国社区大使,领取认证考试券

                ClickHouse社区大使计划正式启动,首批过审贡献者享原厂认证考试券!


                试用阿里云 ClickHouse企业版


                轻松节省30%云资源成本?阿里云数据库ClickHouse 云原生架构全新升级,首次购买ClickHouse企业版计算和存储资源组合,首月消费不超过99.58元(包含最大16CCU+450G OSS用量)了解详情:https://t.aliyun.com/Kz5Z0q9G


                征稿启示

                面向社区长期正文,文章内容包括但不限于关于 ClickHouse 的技术研究、项目实践和创新做法等。建议行文风格干货输出&图文并茂。质量合格的文章将会发布在本公众号,优秀者也有机会推荐到 ClickHouse 官网。请将文章稿件的 WORD 版本发邮件至:Tracy.Wang@clickhouse.com

                文章转载自ClickHouseInc,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论