本篇文章采用的演示数据源是 ElasticSearch,ElasticSearch 版本是 7.x。Grafana 版本是 8.0.5。
Grafana 是一款用 GO 语言开发的开源数据可视化工具,可以做数据监控和数据统计,带有告警功能。
特点:
Mac 下需要首先安装 brew 这个包管理工具,再安装 Grafana 就方便多了:
brew update
brew install grafana
启停命令。通过下面命令可以后台启动/停止 Grafana,默认端口 3000。
// start
brew services start grafana
// stop
brew services stop grafana
查看 Grafana 版本:
grafana-server -v
浏览器登录:http://127.0.0.1:3000/
。
默认的用户名和密码是:admin/admin
。
mac
环境如下:
curl -O https://dl.grafana.com/enterprise/release/grafana-enterprise-8.4.6.darwin-amd64.tar.gz
tar -zxvf grafana-enterprise-8.4.6.darwin-amd64.tar.gz
./bin/grafana-server web
Organization(组织) 是一个很大的概念,每个用户可以拥有多个 Organization,Grafana 有一个默认的组织。用户登录后可以在不同的 Organization 之间切换,前提是该用户拥有多个 Organization。不同的 Organization 之间完全不一样,包括 datasource,dashboard 等都不一样。创建一个 Organization 就相当于开了一个全新的视图,所有的 datasource,dashboard 等都要再重新开始创建。
User(用户),这个概念应该很简单,不用多说。Grafana 里面用户有三种角色 admin,editor,viewer。在2.1版本及之后新增了一种角色read only editor(只读编辑模式),这种模式允许用户修改 DashBoard,但是不允许保存。每个 user 可以拥有多个 Organization。
前文说过,Grafana 支持多种数据源。
可以执行多种简单或复杂 Elasticsearch 查询,以可视化存储在 Elasticsearch 中的日志。
右侧设置 -- 数据源 -- Add data source -- ElasticSearch。
其中 Index name
是为时间字段指定默认值,并指定 Elasticsearch 索引的名称。您可以使用索引名称或通配符的时间模式。
这里对 Access 进行解释一下,它设置了如何处理对数据源的请求。如果没有其他说明,服务器应该是首选的方式。
所有请求都将从浏览器发出到 Grafana 后端/服务器,后者再将请求转发到数据源,从而避免可能的跨源资源共享(CORS)要求。如果选择此访问方式,则需要可以从 Grafana 后端/服务器访问该 URL。
所有请求都将从浏览器直接向数据源发出,并且可能要遵守跨域资源共享(CORS)的要求。如果选择此访问方式,则需要可以从浏览器访问URL。
如果选择浏览器访问,则必须更新您的 Elasticsearch 配置,以允许其他域从浏览器访问 Elasticsearch。您可以通过在 elasticsearch.yml 配置文件中为选项指定这些来实现。
这个版本会在未来的版本中废除,假如选中这个模式会有如下提示:
Browser access mode in the Elasticsearch datasource is deprecated and will be removed in a future release.
http.cors.enabled: true
http.cors.allow-origin: "*"
我们接下来介绍一下 Grafana 中的重要 UI 界面——仪表盘。
指标查询编辑器。ElasticSearch 的 Metric Query editor 支持选择多种指标(Metrics)和分组(Group By)。可以通过添加或者删除的图标进行。
使用 lucene 查询语句。lucene 语法可以参看传送门[1],语法中也可以使用变量。
我大概梳理了一下,常见的语法有以下:
Metrics。指标配置,每种数据源提供不同的选项,我这里用的是Elasticsearch。
根据自己的需求选择,比如 Unique Count(根据某个字段去重,计算 UV 的时候)。比如我们需要计算百分位,就选择 Percentiles。
集成了 ElasticSearch 中很多聚合的方法,比如 Min/Max/Count 等。
聚合分组方式,每个指标属性不同。
Date Histogram,根据时间聚合。
Terms 根据某个字段进行聚合,一般用于生成表格。
可以通过 Expression 计算出相应的结果。
较低版本不支持 Expression。可以通过 Transform 进行处理。在传递查询的结果集以进行可视化之前,对结果进行一层转换。可以支持命名过滤字段、跨查询进行计算等等。
可以用固定值,也可以使用分组变量:
在指标查询除了硬编码的方式,Grafana 支持变量注入的方式。变量显示为仪表板顶部的下拉选择框。这些下拉框可以方便地更改仪表板中显示的数据。
在 Dashboard 的设置中,我们找到 Variables 的设置,点击 New,进入设置页面,其中 Type 类型包含多种,我们常见的就是 Query。可以通过 JSON 字符串来自定义,它的语法如下:
默认大小限制为 500。你可以通过 size 进行设置。
你可以在 Query 中使用其他变量,当其他变量变化时,查询的结果也会随之变化。
{"find": "terms", "field": "@hostname", "query": "@source:$source"}
adhoc Filter 是提供给用户可以自定义条件。官网提供的 demo[2]
变量是值的占位符。您可以在指标查询和面板标题中使用变量。因此,当您使用仪表板顶部的下拉菜单更改值时,面板的指标查询将更改以反映新值。
可以使用以下两种语法:
[[varname]] eg: @hostname:[[hostname]]
以上是官网的使用,个人发现,类似 ES 中模板字符串的写法也是可以的。
name: ${name} AND env: test AND NOT a: ""
本文结合 ElasticSearch 大致介绍了 Grafana 的基础概念以及最佳实践。Grafana 作为一个监控仪表盘系统,它的出现,不需要我们针对数据应用分析进行额外的开发,只需要通过配置就能得到我们想要的图表。
Grafana 的功能是强大而且灵活的,本文只是一个入门的介绍,更多的大家用到的时候还是得去看官网文档[3]。
[1]传送门: https://segmentfault.com/a/1190000002972420
[2]demo: https://play.grafana.org/d/CknOEXDMk/elasticsearch-templated?orgId=1d
[3]官网文档: https://grafana.com/docs/grafana/latest/
[4]Using Elasticsearch in Grafana: https://grafana.com/docs/grafana/latest/datasources/elasticsearch/#logs
[5]入门系列文章: https://juejin.cn/column/7023032795333132302
[6]ES官方文档: https://www.elastic.co/guide/en/kibana/current/lucene-query.html
[7]lucene 语法: https://www.elastic.co/guide/en/elasticsearch/reference/7.15/query-dsl-query-string-query.html#query-string-syntax