明明有 Prometheus 了,为什么要需要用 Zabbix 做监控,还要拖他的数据?这不是牛头人吗?你说得对,不是所有人都玩懂所有监控平台,而且我管理团队都是尽可能降低大家的操作门槛,能用 Zabbix 就用 Zabbix 吧,至少界面没那么抽象。虽然可以把数据集成到 Grafana 并实现告警,但我是 oldschool,能集成在一个平台那肯定最好的!

大佬们的教程

其实网络上已经有很多 Zabbix 拖 Prometheus 数据的教程,这些大佬的教程已经说得很够了,所以文本不复述了,我也是抄作业的,这里先放几个之前参考的教程吧。

我的问题

但这些教程有个问题就是,他们是只拿本端的 metrics 数据,也就是说我直接访问中心端的数据源结果只有本端的监测数据,没有分布节点的数据(虽然可以在管理页面的 API 调数据但也麻烦)。在 Grafana 做普罗米修斯的监控我还以为数据源可以直接拿所有监测数据,后面才知道是调用了 PromQL 拿节点的数据 。如果在其他节点装了插件,我在 Zabbix 拿数据还得把 URL 改成对应 Target 的 URL 才行。好其实我一个一个 target 做 raw 监控项也行,但是我遇到的问题是,远程 Prometheus 的数据是厂商自己做的,所有分布节点都弄了密码不同的基础加密,我一台一台加权限整太麻烦了。好在厂商的中心端我知道权限了,在中心端就可以获取所有目标节点的数据。

既然可以用 API 查询,那能不能让 Prometheus 输出所有节点的 metrics 数据呢?看了下 Stackoverflow 刚好有一个回答能满足我的需求: Prometheus endpoint of all available metrics. 这个 API 可以直接输出所有节点的监控项和值,我只要将上面的教程的 HTTP 代理的 URL 改成 federate 地址就行了。

关于 Federation 机制可以查阅:Prometheus的Federation机制配置,就是可以拿异地节点的数据。

元数据监控项设置

先建议测试下 curl -G http://HOSTIP:9090/federate -d 'match[]={__name__!=""}' 确认有没有自己想要的数据在不在里面,在的话就可以设置了。

  • 名称:所有 metrics 元数据
  • 键值:node_exporter_key
  • 类型:HTTP 代理
  • URL:http://{HOST.IP}:9090/federate
  • 查询字段:

    • 名称:match[]
    • 值:{__name__!=""}
  • 下面的根据需求自己定吧,反正我不存进历史数据,如下图所示

验证

其他监控项就跟上面大佬们的教程做就行了,预处理的 prometheus to jsonprometheus模式 跟教程一样。可以正常拿数据了。