缘起:
为什么我执行ceph health时都是HEALTH_OK,但是搭建了Prometheus+grafana: (参考:https://www.2cto.com/net/201801/712794.html ),看到的状态却是HEALTH_WARN,why?
分析:
我们使用的ceph_exporter: github.com/digitalocean/ceph_exporter ; 参考源码发现,这里使用json格式获取的health,而且参考的是overall_status ; 自己在命令行看看:
1 2 |
# ceph health -f json {"checks":{},"status":"HEALTH_OK","overall_status":"HEALTH_WARN"} |
果不其然,overall_status 为 HEALTH_WARN
办法一:
参考status,不参考overall_status;
缺点:
- exporter并没有收集status信息,只收集了overall_status ,如果要使用status,还得修改exporter
- HEALTH_WARN 毕竟是有问题,查明问题才是根本解决办法
办法二:
查明为什么overall_status 为HEALTH_WARN , 应该确实存在问题
查原因:
我的ceph版本: ceph version 12.2.1 (3e7492b9ada8bdc9a5cd0feafd42fbca27f9c38e) luminous (stable)
在 luminous 之前,ceph 输出的都是 overall_status , luminous开始,就开始使用status了,但是,为了兼容以前的版本,还是输出了overall_status了,不过,为了让使用者意识到 overall_status 不建议使用了,所以,就强制将 overall_status 设置为了 HEALTH_WARN; 有时候,这个逻辑显得不太友好,于是,从12.2.2 开始添加了一个选项:
1 |
mon_health_preluminous_compat_warning |
可以通过设置该选项,来禁止这个警告。
但是,我使用的是12.2.1 ,咋办? 要么修改exporter,要么干脆升级ceph
比较稳妥的做法是,在一个测试的机器上,启动一个12.2.5版本的ceph-mon,设置:
1 |
mon_health_preluminous_compat_warning=false |
然后,ceph.conf中指定连接该ceph-mon,测试效果如下:
1 2 |
# ceph health -f json {"checks":{},"status":"HEALTH_OK"} |
没有了overall_status; 如此的话,ceph_exporter 就是要overall_status的话,还真就得修改ceph_exporter了, fork 后修改之:
https://github.com/phpor/ceph_exporter
参考:
https://github.com/ceph/ceph/pull/17930
http://lists.ceph.com/pipermail/ceph-users-ceph.com/2017-September/021031.html