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

ClickHouse - 创建漂亮的 Grafana 仪表盘

DataFlow范式 2019-12-29
1003

今天笔者给大家带来 Grafana 在 ClickHouse 项目中的应用。为了内容的完整性,笔者会从 Grafana 讲起,简单普及一下,毕竟业界使用度已经非常高了。

Grafana

Grafana 是一种非常流行的工具,可用于根据时间序列数据创建交互式的仪表盘,也是每个数据库的分析和监控的解决方案。Grafana 允许用户查询、可视化、警报和了解指标。

Grafana 提供的很多很棒的特性:

  • 可视化

    从热图到直方图,常见图形到地理地图。Grafana 提供了大量的可视化选择,可帮助用户精美地理解数据。

  • 监控报警

    在接入数据时,根据业务需求定义阈值,无缝定义警报。

  • 整合度

    Grafana 与众多项目进行整合,比如我们熟悉且常用的 Graphite、Elasticsearch、InfluxDB 和 Prometheus 等。将数据整合在一起以获得更完美的的解决方案。

  • 开源

    Grafana 是完全开源的,并有一个充满活力的社区支持。

  • 扩展

    官方库提供数百个仪表盘和插件。今天笔者介绍的就是 Vertamedia 公司开发的 Grafana ClickHouse 插件,现已由 Altinity 团队维护 。

  • 协作

    将每个人聚集在一起,并在团队之间共享数据和仪表盘。Grafana 增强了用户能力,并帮助建立了数据驱动的文化。

好了,简单普及,相信读者对于 Grafana 还是非常熟悉的。

用于 Grafana 的 ClickHouse 数据源

Grafana 是 ClickHouse 项目中使用的非常强大且流行的开源仪表盘工具,它是由 ClickHouse 的早期采用者 Vertamedia 公司开发的 Grafana ClickHouse 插件。现在,社区中的许多用户都依赖 Vertamedia 实施。

据悉,Grafana ClickHouse 插件的主要维护者 Roman Khavronenko 授予 Altinity 权限来管理 Grafana Clickhouse 插件库。

插件项目 Github 地址为:

  1. https://github.com/Vertamedia/clickhouse-grafana

复制

Grafana ClickHouse 插件地址为:

  1. https://grafana.com/grafana/plugins/vertamedia-clickhouse-datasource

复制

clickhouse-grafana 提供的功能特性有:

  • Access to CH via HTTP

  • Query setup

  • Raw SQL editor

  • Query formatting

  • Macros support

  • Additional functions

  • Templates

  • Table view

  • SingleStat view

  • Ad-hoc filters

  • Annotations

版本信息

笔者选择演示的环境如下:

  • Grafana 版本为 6.5.2

  • ClickHouse Grafana 插件版本为 1.9.3

  • ClickHouse 版本为 19.17.2.4

部署环境

Grafana 配置数据(包括数据源和仪表盘布局)存储在 grafana.db 中。ClickHouse Grafana 插件位于目录 vertamedia-clickhouse-datasource 中。

安装 Grafana 和 Clickhouse 插件

这里笔者使用 Docker 方式部署 Grafana,方便读者实战,所以没有以目前的生产环境为例。

1. 下载镜像

  1. $ docker pull grafana/grafana:6.5.2

复制

2. 启动

  1. $ docker run -d --name=grafana -p 3000:3000 grafana/grafana:6.5.2

  2. d8af2a030422d46c6686d6f89360b7cbbd21266b0a6755bc44663e9ec0f0d6a6

复制

3. 安装 Clickhouse 插件

登录 Docker 容器并安装 ClickHouse 插件:

  1. $ docker exec -it d8 bash

  2. bash-5.0$ grafana-cli plugins install vertamedia-clickhouse-datasource

  3. installing vertamedia-clickhouse-datasource @ 1.9.3

  4. ...

复制

然后重启容器(否则看不到新加的 ClickHouse 插件):

  1. $ docker restart d8

复制

目前 ClickHouse 插件库更新到 1.9.4 版本,更新的功能有:

  • Ad Hoc Filters small adjustments for numeric values

  • UI optimizations within Metric builder

但是 Grafana 插件库还未更新,读者可以根据源码生成。

4. 访问 Grafana

访问 Grafana:

  1. http://localhost:3000

复制

使用 admin/admin 用户和密码登录,首次登录可以修改 admin 管理员密码。笔者建议部署 Grafana 生产环境时,开启 HTTPS 以及设置安全的密码。

ClickHouse 相关准备

Grafana ClickHouse 插件使用 HTTP 接口。默认情况下,HTTP 通信使用端口 8123,HTTPS 使用 8443。笔者使用 curl 命令确认其中一个端口可用:

  1. $ curl http://192.168.146.125:8123

  2. Ok.

复制

另外,笔者使用 US Bureau of Transportation Statistics 提供的航空数据进行演示,具体可参考 ClickHouse 官方文档:

  1. https://clickhouse.yandex/docs/en/getting_started/example_datasets/ontime/

复制

请读者继续阅读前在 ClickHouse 中创建相应的表和导入数据。

Grafana 配置 ClickHouse 数据源

接下来,我们登录 Grafana,创建一个数据源并指向 ClickHouse。

访问 http://locahost:3000
 并登录到主页,在左侧的 Configuration 标签页中,选择 Data Sources,如下: 

点击 Add data source,选择一个数据源类型,可以在🔍搜索栏中搜索 clickhouse,如下: 


并点击 select,添加 ClickHouse 数据源,然后进入 ClickHouse 数据源配置页面: 

配置:

  • URL

    输入 ClickHouse HTTP 访问地址。

  • Access

    选择 Server(default)。

  • Basic auth

    开启 Basic auth,并在 Basic Auth Details 中输入 User 和 Password。

创建 Dashboard

回到 Grafana 首页: 

选择创建 New dashboard: 

可以看到面板包含可视化和文本两种方式,用来表示数据。每个面板通常可以使用从数据库中获取的数据来显示图形或文本。每个基于 ClickHouse 的面板包含两个部分:一个 SQL 查询和一个显示结果的可视化。

我们选择 Add Query: 

Grafana 已优化为显示时间序列数据,因此默认查询显示包含许多与简单文本显示无关的数据。我们将跳过所有这些,仅需选择 Go to Query 按钮。 

输入查询 SQL:

  1. select countDistinct(Carrier) from ssb.ontime

复制

Format as 选择 Table,因为我们的查询与时间序列无关。

接下来,选择左侧的图形图标 Visualization 以选择可视化格式: 

从下拉菜单中选择 Visualization 为 Singlestat,然后 Show 参数为 First,作为要显示的值。 

填写可视化设置后,编辑器应如下图所示,并在面板中带有实际查询的结果值。 

最后,选择左侧的最后一个工具图标,可以为该面板指定一个名称,例如 Total Carriers。

如果要保存该 Dashboard,选择右上角的 Save dashboard: 

添加时间序列数据

Grafana 可以接入时间序列数据提供实时数据分析,接下来我们将添加一个面板来计算每个航空公司的每日航班数量。这将很好地展示 Grafana 时间序列功能。

要开始使用时间序列功能,需要添加一个新面板,用于动态展示时间序列图形,使其显示在上面创建的 Total Carriers 面板的右侧。Grafana 可以轻松移动和调整面板窗口大小。

首先创建一个新面板并选择 Add Query:

这里还有一些其他字段需要填写,如下:

  • FROM

    选择数据库和表,告诉 Grafana 数据来自哪里。

  • Column:DateTime

    Grafana 需要一个 DateTime 列来选择时间序列。用户必须输入一列,并且该列必须是 DateTime 或 Timestamp 数据类型。由于本例中使用的 ontime 样本数据集没有符合要求的字段,因此使用函数转换 FlightDate。

  • Column:Date

    还添加了一个 Date 列,在这里使用 FlightDate。这是 ClickHouse 插件 1.9.3 及更低版本的一项特殊功能。较旧版本的 ClickHouse 需要使用 Date 列作为过滤器,因此需要额外的列。ClickHouse Grafana 插件 1.9.4 及更高版本不需要它。版本 1.9.4 发布后,只需跳过此列即可。

  • Time shift

    大多数生产数据集会生成最新的数据,但本例中使用的是 ontime 提供的静态数据集。要使用Grafana 方便的 Last

设置完这些值后,由于我们尚未输入查询,因此仍将在面板中看不到数据。点击 Go to Query 按钮,然后在查询窗口中输入查询。将屏幕顶部的 Last

从上图中可以看到,ClickHouse 插件生成 SQL 时自动填充了一些变量,Grafana 查询时可以识别这些变量:

  • $ timeSeries
     

    指定的 DateTime 列以及一些转换逻辑,以确保数据采用 Grafana 可以在显示中使用的格式。

  • $ table
     

    数据库表名。

  • $ timeFilter
     

    自动生成的时间序列过滤条件。

为了更好地理解 Grafana 和 ClickHouse 之间交互关系,笔者带大家查看生成的查询中实际内容以及返回哪些数据。点击 Query Inspector 按钮,查看通过 HTTP 接口以及 JSON 响应发送到 ClickHouse 的查询文本: 

该查询是经过 URL 编码的,因此很难阅读。不过,可以通过 URL 解码器运行它以查看实际文本,细心的读者会注意到额外的过滤条件,这些条件是在 1.9.3 版和以前的 ClickHouse 插件中生成的。

  1. SELECT

  2. (intDiv(toUInt32(toDateTime(FlightDate)), 3600) * 3600) * 1000 as t,

  3. Carrier,

  4. count() Flights

  5. FROM ssb.ontime

  6. WHERE FlightDate BETWEEN toDate(1511945180) AND toDate(1514537182)

  7. AND toDateTime(FlightDate) BETWEEN toDateTime(1511945180) AND toDateTime(1514537182)

  8. GROUP BY t,

  9. Carrier ORDER BY t, Carrier

  10. FORMAT JSON

复制

我们来设置 Visualization 为 Graph,并且设置 Draw Modes 为 Bars 和开启 Stack,如下所示: 

到此,我们创建了两个 Dashboard,整体看一下: 

用户可以在可视化图形上点点看,Grafana 会以交互式方式展示结果,比如选择航空编号为 AA: 

构建一个完整的 dashboard

目前笔者已经介绍了仪表盘构造的基础知识,但是我们可以使用 Grafana 和 ClickHouse 做更多的事情。grafana.com 上有一个完整的样例仪表盘,用于航空公司的航班准时数据,可以提供更多的参考和建议。

下面,笔者将演示如何将该完整的仪表盘导入自己的环境中。

首先,访问 https://grafana.com/grafana/dashboards/11471
 地址,复制 Dashboard ID 的值 11471。

然后,打开我们的 Grafana 的 Dashboards -> Manage 页面: 

点击 Import 按钮: 

在 Grafana.com Dashboard 输入框中粘贴 Dashboard ID,即 11471:

这里我们可以把 ClickHouse 参数对应的值选择自己的数据源名称(比如前面创建的 ClickHouse),然后点击 Import 完成导入。

默认使用的数据库和表为 airline.ontime,由于笔者环境为 ssb.ontime,所以需要修改模板,修改完成后,Dashboard 效果如下: 

该 Dashboard 模板还定义了 carrier 的类别,所以我们可以选择不同的 carrier 来查看统计数据。

总结

通过本文,可以看到 ClickHouse 和 Grafana 可以很好地协同工作,以构建漂亮的交互式页面,后续笔者还会基于 Grafana 监控 ClickHouse 集群各种指标以及接入监控报警。


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

评论