文章目录html
grafana 是一个开源的时序性统计和监控平台,支持例如 elasticsearch、graphite、influxdb 等众多的数据源,并以功能强大的界面编辑器著称。咱们在前端监控方面引入 grafana 后取得了一些不错的反馈,可是不少用户因为以前没有接触过 grafana 常常会来询问 grafana 的相关问题,所以但愿本文对你们在 grafana 使用方面有所帮助。前端
grafana 的权限分为三个等级:Viewer、Editor 和 Admin,Viewer 只能查看 grafana 已经存在的面板而不能编辑,Editor 能够编辑面板,Admin 则拥有所有权限例如添加数据源、添加插件、增长 API KEY。git
对于普通用户来讲,Viewer 权限已经足够,本文接下来的内容主要和 Editor 权限有关。因为篇幅有限,本文做为范例的数据源为 graphite,同时也只介绍最经常使用的 Graph 图表的配置方法。github
这里有一个常见的 grafana 误区,由于常常有用数值类型的 count_ps 来顺便获取每秒打点数量的状况,注意在这种状况下,一段时间内的打点总量须要使用 count_ps 的 avg 平均值来乘以这段时间的秒数来计算,而不是经过界面上的 Total 直接读取。web
这是由于,在界面上一条曲线可以展现的点的数量是有限的,grafana 会根据你的窗口宽度来决定返回的点数,由于像一天
这样的时间段确定没办法在界面上展现每一秒的点,毕竟总量为86400个点就算带鱼屏也不可能挤得下。对于没法展现的点,grafana 默认是使用 avg 平均值的行为来修正返回点的值,举个栗子,以下图:chrome
上图时间范围是一天,上部分为曲线面板的值,下部分为 面饼图表的值,而且上部分图标的曲线为 count 类型(十秒聚一次),能够看到 avg 平均值为 683,那么总量应该为 682 乘以 6 (若是是count_ps 这里则是60) 乘以 60 (一小时60分钟)再乘以 24 (一天24小时)获得589万,与图片中下部分的582万相近,所以上部分 total 的117万是一个完彻底全让人误解的值,能够认为它毫无心义进而直接无视掉。数据库
上文中咱们计算出来的589万和界面上的582万其实也有一点偏差,不过这是能够接受的,由于 statsd 通常状况下是 UDP 的形式(它其实有 TCP 的形式),因此若是想要彻底正确的数据,那么最好把打点相关的数据也入库,从数据库里后置查询出来的才是彻底可靠。swift
模板变量可以动态地控制面板中的查询语句,是十分重要的功能。常常能够在面板的左上角发现它们,以下图:后端
模板变量支持 $name
和 [[name]]
的写法,针对 graphite 数据源主要使用前者,例如:stats.timers.fe.test.$key.count_ps
api
grafana 界面上齿轮按钮 -> Templating -> 点击 New,便可出现相似以下的界面:
本段主要介绍 Query 类型的写法。
Never
,On Dashboard Load
和On Time Range Change
On Time Range Change
,不然 On Dashboard Load
就足够了,Query 类型千万不要选 Never,不然变量只会在你点进来编辑变量时才会更新模板变量中的 Query 其实也支持模板变量,例如stats.timers.fe.test.$key.*
这样的语句,会在 $key 变量变化时自动刷新值,是否是有一点 MVVM 的感受。这个功能用来联动多个模板变量能够大幅度减小 grafana 一次查询的时间。
模板变量甚至能够用在 grafana 的跳转中,这是连文档中都没有说起的一个隐藏玩法,在 Link
或者 Dashboard
里 URL 中任意位置填入 $name ,那么在用户点击该连接跳转时 grafana 一样会替换该变量来让你跳到正确的连接去。这和其余系统整合起来可以作到很不错的用户体验,例如跳转到 kibana 那边去查询日志。
kibana 和 grafana 的时间范围格式并不同,可使用这篇文章 中的 chrome 插件来解决。
另外,Custom 模板变量能够容许用户在变量下拉框中自行输入值,也是一个常常用到的值,配合模板变量会和当前连接中的 querystring 部分的var-${name}
同步,配合起来能够轻松地从第三方系统中跳转到正确的 grafana 面板中来
以 Editor 权限的帐号进入到任意面板中,点击某个图表继而点击小弹窗中的 Edit 按钮,便可进入图表的编辑器界面。对于编辑器本文只介绍图表的重要配置,Metrics,Legend 和 Display
toggle editor mode
能够控制编辑模式,关闭则须要手动输入查询语句,开启则是如上图的能够在界面上动态增删改的模式。Panel data source
必定要选对,不然查不到对应的路径,而且颇有可能冒出来 Mock 数据让人一脸懵逼。开启动态编辑模式时能够在点击上图中每一个框框,这时 grafana 会自动加载该位置在数据源中的值,而且你也能够在这里选择模板变量来动态控制。
点击尾巴上的加号,会冒出来对应数据源的函数,能够作一些高级的功能,这个也是本文下半部分的重点,稍后再作介绍。graphite 的函数比较多,其余数据源会少一些。
Legend 主要控制曲线的名称和值的展现,比较简单,这里列出一下他们的含义
Display 控制图表的点和线的展现,有一些比较重要的参数
All serires
(展现该时间点的全部线段的值)和 single
(只展现鼠标指着的那一条线段)以 graphite 为例子,打点路径中的 KEY 只支持大小写字母、数字、中划线和下划线,这会致使前端的路径(常常包含 # 和 :path)存不下来,所以咱们只能提早转译,例如将 # 转译为 ANCHOR,将 :path 转译为 PATH ,再将 / 转译为 -,这样在变量模板中展现的就是比较怪异的前端路径,不过好在咱们有函数,能够在界面上把它替换回来。
点击编辑界面 Metrics 面板中编辑模式的加号,添加 aliaSub
函数,并依此填入上图的三种的替换规则,在界面上就能够看到以下图的正常路径了:
aliaSub 只是其中一个简单的 alias 函数,用来处理曲线的名称,更多的函数是被用来处理单个查询的聚合、多条曲线的聚合、展现不一样时间线、计算和过滤,本节会介绍其中一些常常用到的函数。
例如,假设 stats_count.fe.test.*
有几十个匹配值,那么这个查询就会在图表中展现几十条曲线,此时如何获取全部曲线的总值呢?不须要在打点时多打一份总量数据,直接使用 sumSeries
函数便可,sumSeries(stats_count.fe.test.*)
想要在这个时间段内同时展现前一天的的曲线?timeShift(Query, '-1d')
便可
若是数值类型中出现了异常的值,例如平均为 1秒 的状况下出现了几百万秒的状况,那么就能够经过众多的过滤函数在界面上直接过滤掉而不是去修改打点代码,removeAboveValue(Query, 10000)
便可
sumSeries 函数只能简单地将多条数据的最终值加起来,若是不是末尾位置的就不行了,并且也不支持除了 sum 外的功能,例如 avg 平均,使用 groupByNode 就能够动态地对指定位置的多个数值类型进行聚合了,以下图:
假设咱们有以下几条打点:
stats.timers.fe.test.error1.count
stats.timers.fe.test.error2.count
stats.timers.fe.test.error3.count
stats.timers.fe.test.success.count
复制代码
此时想要计算 success 的成功比例,如何作呢?
在这种相较复杂的状况下,就不能只靠一个 Query 来解决了,首先咱们建立两个 Query,以下:
stats.timers.fe.test.*.count (Query 序列号为 #A)
stats.timers.fe.test.success.count (Query 序列号为 #B)
复制代码
再建立第三个 Query,值为 asPercent(#B, sumSeries(#A)
,顾名思义,首先将 #A 的查询聚合起来获得总值,再用 asPercent 来进行除法便可。
经过如上的几个例子,能够看到函数强大的功能,即便是很复杂的在之前须要用后端代码来实现的部分,均可以经过多条Query和多个函数的互相嵌套来在界面上简单地实现。
每一个数据源都有对应的函数开发文档,例如 graphite。grafana 正是凭借着对众多数据源以及函数的支持,才能在一个网页界面上完成这么多强大的功能。
grafana 在 4.0 版本后增长了报警功能,不过 grafana 的报警属于数据源的后置查询,实时性不大能知足需求,咱们公司有一个开源的 banshee ,就是为了解决这个问题。
banshee 使用了三西格马定律,支持基于阈值和趋势的报警,同时提供开放的 API 和 webhook 并默认集成了 Slack。banshee 和数据源位于同一个位置(statsd 的后端),所以能够保证时效性,也由于报警的独立性质因此对 grafana 版本没有任何要求。
grafana 依赖的若是是时序性数据库,那么每个 KEY 都会对应一个文件来存储数据,例如 stats.timers.fe.test.*
至关于 stats/timers/fe/test
文件夹下的全部文件,所以必须注意打点路径不要有过多的组合,好比将省份和市做为 KEY 时的组合很容易就能占到 1G 以上的数据致使磁盘爆掉。
为了不组合过多致使路径污染,请尽可能保证每一个 KEY 中格式化掉点,例如替换成下划线,另外打点路径能够尽可能多加一点前缀,例如将stats.timers.fe.test.*
改成 stats.timers.fe.test.v1.*
,这样一旦污染后,清理数据时能够直接把 v1 整个文件夹删除而不是删除 test 这个根路径,用以保留你的历史正常的打点数据。
通常推荐使用 API KEY 来查询 grafana 的数据,Admin 权限帐号能够在界面中生成上文三种权限的 API KEY,不过 grafana 默认会开启 Basic Auth,使用帐号密码便可经过 grafana 的鉴权,例如http://${account}:${password}@${grafana_host}/api/org
。
固然,最好是拥有数据源的读权限来直接读取数据。
有时候用户确实没有 grafana 的帐号,但他就是想看面板,怎么办?此时就得 grafana 的匿名模式出马了。
grafana 配置文件中有 auth.anonymous
配置段,enabled
控制开关,org_name
控制开启匿名模式的组织,org_role
控制匿名者的权限。组织开启匿名意味着非登陆用户可以直接跳过 grafana 无权限地查询数据源,所以请保证数据源的安全,例如限定内网访问。
本文介绍了 grafana 相对高级的一些使用技巧,除了能够看到 grafana 的强大功能之外,也应该注意到 grafana 只是一个时序性很强的统计监控平台,一些非时序性质的功能例如报错的聚合和报错的日志等应该交给更专业的去作,例如 sentry 和 ELK。