grafana使用中遇到的一些坑

prometheus+grafana的系统监控方式用起来很不错,最近开始使用它来监控haipproxyweibospider。由于网上相关的中文资料比较少,所以在使用它们的时候还是遇到很多坑。这篇文章主要提一下自己遇到的几个小坑。

1.如何显示对人类友好的时间?

有这么一个场景,我想对定时任务调度器下次调度任务的时间进行监控,Prometheus中存储了下次调度的时间戳,数据类型是Gauge,但是到了grafana中通过options中的unit选项使用date&time展示出来就是1970-01-01 xxxx了,这个时间明显不对。后来在github上找到了work around的方法: 如果用的Graphite作为数据源,那么可以直接进行使用scale函数让时间戳扩大1000倍,就可以显示出正确的时间;但是prometheus作为数据源没这个函数,还好prometheus自带有一个time()函数,可以返回表达式计算时的时间戳,因此我显示的是举例下次任务运行的倒计时,表达式为time()-(process_start_time_seconds)。注意对于Gauge的值的选择,应该选择current,默认是 average

2.通过非本机访问grafana,数据一直加载失败?

这个问题困扰了我一个中午。我通过非grafana服务器访问grafana的服务的时候,prometheus的数据一直渲染不出来,如下图所示 grafana无法加载数据

但是通过直接在本机访问prormetheus和查询prometheus又没问题,手足无措的时候突然想到使用f12看看浏览器的资源加载情况,发现了一个问题 prometheus路径不对

从上图可以看出,这里取prometheus的数据是去的localhost:9090,所以问题就出在这里,我们应该在grafana的配置面板配置data source的时候,填写prometheus对外暴露的ip

正确配置示意图

这样就可以访问了。注意,这个过程我还遇到一个坑,就是URL路径末尾不能加/,即不能写成http://192.168.1.11:9090/,否则还是无法加载数据,通过追踪它的网络请求可以发现已经被301重定向了,并且会抛出blocked by CORS policy错误