Grafana系列之Dashboard:新增仪表板、新增变量、过滤变量、变量查询、导入仪表板、变量联动、Grafana Alert
概述
关于Prometheus和Grafana的安装,略过。
写在前面
- Dashboard:仪表板,可包含多个Panel
- Panel:面板,Dashboard中的组件
如有写得不对的地方,烦请指出。
新增仪表板
点击右上角的
选择New dashboard,
备注:上图自有探索->自由探索。
自由探索
点击Add visualizaton,出现选择数据源界面,
如上图所示,一个Grafana可以新增多个Prometheus数据源。选择Prometheus数据源,然后出现如下视图
点击Code,输入http_server_requests
,Grafana有自动补齐提示,也就是说,我们现在是在Grafana里写PromQL。
选择不同的数据源,写的Code不一样,如果选择的是Loki,则写Code时需要遵从LogQL语法(计划会另写一篇博客)。
勾选Explain,下面会出现关于code的解释,比如下面的1 Fetch all series matching metric name and label filters.
,翻译过来就是抓取所有满足指标名称和标签过滤符的序列
变量
在Grafana中,用户可为仪表板定义一组变量(Variables),变量一般包含一个到多个可选值。通过将变量渲染为一个下拉框,使用户可动态地调整变量的值,进而查询不同标签(Tag)下的数据,从而实现分组(Group by)效果
在仪表板右上角,点击Settings,会发现若干个Tab标签页,其中第三个Variables就是变量
点击新增变量
变量是仪表板全局生效的,一个仪表板如果有多个面板,则全部面板都会复用这个变量,也就是说,放在一个仪表板里的多个面板最好是强相关的(能复用这些变量的,负责查询面板会出现No Data问题)。
变量过滤
以http_server_requests
(参考Grails应用http.server.requests指标数据采集问题排查及解决)这个Micrometer默认暴露出来的指标为例,在Prometheus Graph页面查询此指标时,有如下图所示几个标签组(注意,下文会使用这个数据):
- container:容器,表示是Pushgateway采集的
- endpoint:采集方式
- exception:API接口异常
- job:即应用,服务,非常关心
- method:接口方法,GET、POST等
- namespace:命名空间
- outcome:结果,和status功能定位比较类似
- pod:和container类似
- service:和container类似
- status:状态码,表示成功与否
- uri:接口的路径
上面新增过job这个变量。
默认情况下,job变量带出很多个非业务应用的数据(至于为什么,目前尚不清楚),比如kube系列,apiserver,coredns等,如下图所示:
带来的问题(干扰):
在面板里选择应用时,会出现很多不关心的应用。
需求:过滤无关应用,即实现变量过滤功能。
Regex
咨询DeepSeek、ChatGPT等工具后,告知可利用Regex来实现:
给出如下的表达式/^(?!.*kube).*$/
。
注意:只有在点击保存仪表板后才能看到效果。
如下截图所示,Preview of values里不再出现kube相关的数据
在面板上选择应用时,不再出现kube相关的选项
问题来了,我还想继续过滤掉上面截图里的apiserver和coredns,咋办。
DeepSeek给出的答复是:/^(?!.*(kube|apiserver)).*$/
。
是不是看起来非常有理有据,Regex正则表达式嘛,用|
符号实现多个候选项。
结果点击报错仪表板后,页面居然报错:
众所周知,Grafana UI是用JS写的,上面的报错也全是JS相关。
WTF?根本就不能进行任何点击或查看操作。
这该死的、害人的AI幻觉(hallucination)。
问题是AI带来的,还是得靠它们来解决。
给出的答复,其中一个是,强制刷新浏览器。
使用Chrome快捷键Ctrl + Shift + R,果然可以正常查看仪表板,赶紧把上面的错误的Regex表达式给删除。
经过反复尝试,比较明确的一点是,通过Regex,只能过滤一类数据。
几个表达式:
/^(?!.*kube).*$/
:可以过滤kube相关的数据;/^(?!.*(kube|apiserver)).*$/
:不能实现过滤kube和apiserver相关的数据,Grafana解析此Regex表达式失败,页面渲染数据出错;/^(?!.*(kube))}).*$/
:同上,多个()
括号,页面报错。
Metric
既然Regex无法实现过滤,只有另寻他法。反复询问AI工具,给出的答复是使用Metric,即指标。
此时才发现,绕了个弯路,Metric才是最正规的实现指标数据过滤的方法。
下面截图里还写着Regex,实际上无用,应删除,请忽视。
不过,如上图所示,还是有一个不太关心的数据,nacos。Java业务应用里并没有nacos,而是使用Nacos作为配置中心和注册中心。
Label filters
进一步实现过滤。Label filters,中文译为标签过滤器,正好是用于数据过滤的场景:
备注:忽略上面截图里的Regex表达式。
可知,将nacos给过滤掉。
此外,点击中间的操作符
Grafana提供的四种对比符号:
=
:等于,精准匹配!=
:不等于,精准过滤(排除)=~
:等于,模糊匹配!~
:不等于,模糊过滤(排除)
总结
有三种方法:
- Regex:不建议使用
- Metric:绑定指标,可过滤大部分无关数据
- Label filters:进一步过滤数据
变量查询
上面已经新增三个变量:
- 应用:对应于job
- API:对应于uri
- 状态码:对应于status
需求是查询所有的应用下所有API接口,且状态码是4xx或5xx的数据:
遇到的问题:
- 清空应用或API的勾选项,并不能查询到数据,即上图展示的No data。分析下来,发现浏览器的URL上,job这个变量
var-job
- )还是写死(绑定)某个应用agent
,var-uri
还是把所有的已经勾选的接口放在URL路径 - 勾选全部应用以及全部API,可以实现上面提到的查询需求,但是页面太不美观。
经过各种反复尝试。
解决方法:修改变量,构想Include All option。
遇到的问题,查询不到数据,可是通过Prometheus Graph查看明明有数据的
咨询AI类工具,以及反复尝试,发现需要配置如下的Custom all value信息,填入.*
保存仪表板后,果然看到数据
总结:勾选Include All option时,需要配置下面的Custom all value,否则查询数据时会显示No data。
导入仪表板
前面在新增仪表板时,只讲述过Add visualizaton这种方式。
上面的操作,都是基于http_server_requests
这个指标,并不是自定义的指标,而是Micrometer官方暴露出来的数据。以Grafana + Dashboard + http_server_requests 三个单词为关键词搜索Google,不难找到官方维护的仪表板,其ID为21308,URL地址为https://grafana.com/grafana/dashboards/21308-http/
。
此处使用导入功能
如上图所示,Grafana真的很贴心
(注意这里的排版),提供好几种导入方式:
- 文件:在最上方。别人不清楚,我个人会认为这种方式更重要,使用频率更高,所以放在最上面。
- URL:贴入URL
- ID:输入ID
- JSON model:没用过,不太清楚
踩过的坑
:将测试环境的仪表板同步到生产环境,首先导出测试环境的仪表板为JSON文件,点击仪表板右上角的Share->Export->Save to file
然后在生产环境导入JSON文件,却发现无数据
经过排查与分析后才发现,虽然都是Prometheus数据源,但是其uid不一样。(直接给出结论)
选中某个面板后,快捷键E
进入编辑模式,直接点击Run queries发现其实是有数据的。
对于部署多个不同Prometheus集群的场景来说,多了个步骤,切换使用的Prometheus数据源,然后点击Run queries,也可查询到数据。
我们公司做LLM相关应用,因此需要GPU机器用于模型推理与训练。对于GPU机器上的Python应用,额外再部署一套Prometheus集群。
最后点击保存面板,可发现使用的数据源uid确实不一样。
一个仪表板里面有十几个甚至几十个面板,一一进入编辑模式,然后保存面板切换使用的Prometheus数据源,岂不是要疯掉。
如截图所示,上面的仪表板是Node Exporter Dashboard 20240520 TenSunS自动同步版,这是一个三方维护的GitHub开源、仪表板。
解决方法:直接使用URL或ID的方式导入。
总结:
- URL或ID:官方维护的,三方维护的,且一般不会调整加以修改的仪表板;里面的面板一般会比较多;
- JSON:适合于业务自定义的仪表板;仪表板里的面板比较少,使用导出导入功能,需要编辑调整数据源的地方比较少;不编辑保存面板,则无数据。
变量联动
不会配置面板,不知道如何写PromQL,跟着别人学习啊。在Grafana Dashboard页面里,有几万个仪表板(持续新增中),有官方维护的,也有三方维护的。
上面已经导入21308仪表板,点击面板,进入编辑模式,看看别人的变量怎么配置的
点击instance变量后,发现是这样的:
Grafana自动解析变量之间的关系,生成Show dependencies按钮。
同样都是http_server_requests
指标,官方维护的仪表板使用application、cluster、instance三个变量,我上面列出的标签里,这三个一个都没有,所以下拉框并没有数据,不清楚官方为何使用这三个变量。
要善于取学习,跟着配置三个变量后,可以实现联动效果,即所谓选择应用后,API里只出现该应用下的接口:
注意:上面截图里Label filters使用的符号不一致。
Grafana Alert
一般情况下,可以基于面板创建Alert,即Grafana Alert
Grafana Alert涉及很多知识点,如Alert rule(告警规则)、Contact Point(联络点)、Notification policy(通知策略)、Silence(静默),其中联络点又涉及到最常见的邮件告警,告警模板配置;如果是Webhook配置,飞书还非常特殊。
因此另起一篇。
但是也有例外:
No alerting capable query found
Cannot create alerts from this panel because no query to an alerting capable datasource is found.
数据源是Prometheus,PromQL如下,为啥不能基于此面板新增告警的具体原因,有待进一步学习
Prometheus Alertmanager
除了Grafana Alert外,也可接入Prometheus Alertmanager。
另起一篇Grafana系列之面板接入Prometheus Alertmanager。
参考
- Grafana官网
- ChatGPT
- DeepSeek
- GitHub Copilot