简介
Grafana 是一款用 GO 语言开发的开源数据可视化工具,可以做数据监控和数据统计,带有告警功能。
特点:
可视化。Grafana 拥有快速灵活的客户端图表,面板插件有许多不同方式的可视化指标和日志,官方库中具有丰富的仪表盘插件,比如热图、折线图、图表等多种展示方式,让我们复杂的数据展示的美观而优雅。
报警和通知。可视化地为最重要的指标定义警报规则。Grafana 将持续评估它们,并发送通知。
动态仪表盘:使用模板变量创建动态和可重用的仪表板,这些模板变量作为下拉菜单出现在仪表板顶部。
混合数据源:在同一个图中混合不同的数据源!可以根据每个查询指定数据源。这甚至适用于自定义数据源。
注释:注释来自不同数据源图表。将鼠标悬停在事件上可以显示完整的事件元数据和标记。
过滤器:Grafana 使用 Ad-hoc 过滤器允许动态创建新的键/值过滤器,这些过滤器会自动应用于使用该数据源的所有查询。
安装
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。
- admin 权限最高,可以执行任何操作,包括创建用户,新增 Datasource,创建DashBoard。
- editor 角色不可以创建用户,不可以新增 Datasource,可以创建 DashBoard。
- viewer 角色仅可以查看 DashBoard。
数据源
前文说过,Grafana 支持多种数据源。
可以执行多种简单或复杂 Elasticsearch 查询,以可视化存储在 Elasticsearch 中的日志。
右侧设置 -- 数据源 -- Add data source -- ElasticSearch。
其中 Index name 是为时间字段指定默认值,并指定 Elasticsearch 索引的名称。您可以使用索引名称或通配符的时间模式。
Access
这里对 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: "*"
仪表盘(Dashboard)
我们接下来介绍一下 Grafana 中的重要 UI 界面——仪表盘。
- Dashboard。通过数据源定义好可视化的数据来源之后,对于用户而言最重要的事情就是实现数据的可视化。在 Grafana 中,我们通过 Dashboard 来组织和管理我们的数据可视化图表。
- Row。在 Dashboard 页面中,我们还可以定义一个 Row(行),来组织和管理一组相关的 Panel。
- Panel。在一个 Dashboard 中一个最基本的可视化单元为一个 Panel(面板)。通过 Panel 的 Query Editor(查询编辑器)我们可以为每一个 Panel 添加查询的数据源以及数据查询方式。每一个 Panel 都是独立的,可以选择一种或者多种数据源进行查询。比如我们使用 ElasticSearch,那么我们可以使用 Lucene 语句进行查询。
最佳实践 - 编辑图表
Metric Query editor
指标查询编辑器。ElasticSearch 的 Metric Query editor 支持选择多种指标(Metrics)和分组(Group By)。可以通过添加或者删除的图标进行。
Query
使用 lucene 查询语句。lucene 语法可以参看传送门[1],语法中也可以使用变量。
我大概梳理了一下,常见的语法有以下:
Metrics指标
Metrics。指标配置,每种数据源提供不同的选项,我这里用的是Elasticsearch。
根据自己的需求选择,比如 Unique Count(根据某个字段去重,计算 UV 的时候)。比如我们需要计算百分位,就选择 Percentiles。
集成了 ElasticSearch 中很多聚合的方法,比如 Min/Max/Count 等。
Group by
聚合分组方式,每个指标属性不同。
Date Histogram,根据时间聚合。
Terms 根据某个字段进行聚合,一般用于生成表格。
Expression 计算
可以通过 Expression 计算出相应的结果。
较低版本不支持 Expression。可以通过 Transform 进行处理。在传递查询的结果集以进行可视化之前,对结果进行一层转换。可以支持命名过滤字段、跨查询进行计算等等。
别名使用
可以用固定值,也可以使用分组变量:
Templating(模板)
在指标查询除了硬编码的方式,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
- [[varname]] eg: @hostname:[[hostname]]
以上是官网的使用,个人发现,类似 ES 中模板字符串的写法也是可以的。
name: ${name} AND env: test AND NOT a: ""
总结
本文结合 ElasticSearch 大致介绍了 Grafana 的基础概念以及最佳实践。Grafana 作为一个监控仪表盘系统,它的出现,不需要我们针对数据应用分析进行额外的开发,只需要通过配置就能得到我们想要的图表。
Grafana 的功能是强大而且灵活的,本文只是一个入门的介绍,更多的大家用到的时候还是得去看官网文档[3]。
参考
- Using Elasticsearch in Grafana[4]
- 入门系列文章[5]
- ES官方文档[6]
- lucene 语法[7]
参考资料
[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