Zookeeper的指标获取方式一般有两种,一种是Zookeeper的四字命令,另一种是使用JMX。ZooKeeper的四字命令用法在官方文档可以查到。针对JMX,Prometheus的jmx_exporter组件可以导出这些监控指标提供给Prometheus。Prometheus的exporter支持自定义,社区里面很多人开发了对接各种各样组件的exporter。除了jmx_exporter,Github上也有人做了zookeeper_exporter,有兴趣的人可以尝试一下。

下载 jmx_exporter

jmx_exporter Github地址 包含下载链接和使用说明。
我们可以看到此项目有个example_configs目录,这里包含了一些配置样例,其中有zookeeper的配置样例,我们可以一并下载下来。

我们可以看到jmx的使用方法是以java agent的形式启动:

  1. java -javaagent:./jmx_prometheus_javaagent-0.13.0.jar=8080:config.yaml -jar yourJar.jar

如果你是像我一样正准备建设一整套hadoop的监控,我建议你规划一下exporter的存放路径和端口。
我是将监控相关的文件放在了和各种大数据组件平级的路径下,并对配置文件进行了归类:

mkdir -p /opt/bigdata/monitoring
mkdir -p /opt/bigdata/monitoring/zookeeper
mv jmx_prometheus_javaagent-0.13.0.jar /opt/bigdata/monitoring
mv zookeeper.yaml /opt/bigdata/monitoring/zookeeper

ZooKeeper 配置(唠叨版)

如果觉得废话太多可以跳过看精简版。

也许你在网上搜索其他攻略的时候,可以看到有些攻略在ZooKeeper里面配置各种和JMX相关的参数
像这样:
-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.port=1234
但其实是不需要的,zookeeper默认开启JMX的本地模式,结合jmx_exporter,我们不需要开启远程模式,只需要把 -javaagent命令添加到启动命令中即可。
也许你还在网上搜索到我们需要在zookeeper home目录的bin/zkServer.sh进行修改:
像这样:

if [ "x$SERVER_JVMFLAGS"  != "x" ]
then
    JVMFLAGS="$SERVER_JVMFLAGS $JVMFLAGS"
fi

## 新增javaagent
JMX_DIR="/usr/local/zookeeper/prometheus"
JVMFLAGS="$JVMFLAGS -javaagent:$JMX_DIR/jmx_prometheus_javaagent-0.3.1.jar=9505:$JMX_DIR/zookeeper.yml"

if [ "x$2" != "x" ]
then
    ZOOCFG="$ZOOCFGDIR/$2"
fi

但个人不是很喜欢这样很硬核的修改某个软件的非配置文件,除非找不到其他方法,迫不得已。个人更倾向于寻找软件本身留给我们的配置入口,我相信一个优秀的项目肯定会留有这样的入口让我们进行一些自定义配置。
在bin/zkEnv.sh中我们可以看到这么一段:

if [ -f "$ZOOCFGDIR/java.env" ]
then
    . "$ZOOCFGDIR/java.env"
fi

而这段语句的上面我们能找到$ZOOCFGDIR的具体路径为zookeeper home目录下的conf目录:

if [ -e "${ZOOKEEPER_PREFIX}/conf" ]; then
    ZOOCFGDIR="$ZOOBINDIR/../conf"
  else
    ZOOCFGDIR="$ZOOBINDIR/../etc/zookeeper"
  fi

我们检查一下conf目录,其实是没有java.env这个文件的,没关系,新建一个即可。既然环境配置中引用了,我们就可以使用它。
vim java.env

export JMX_DIR="/opt/bigdata/"
export SERVER_JVMFLAGS="$SERVER_JVMFLAGS -javaagent:$JMX_DIR/jmx_prometheus_javaagent-0.13.0.jar=30001:$JMX_DIR/zookeeper/zookeeper.yaml"

启动zookeeper

bin/zkServer.sh

检查一下指标获取情况

curl ‘http://localhost:30001’

ZooKeeper 配置(精简版)

ZooKeeper conf目录下新建文件 java.env

cd zookeeper/conf
vim java.env

添加java agent启动信息

export JMX_DIR="/opt/bigdata/"
export SERVER_JVMFLAGS="$SERVER_JVMFLAGS -javaagent:$JMX_DIR/jmx_prometheus_javaagent-0.13.0.jar=30001:$JMX_DIR/zookeeper/zookeeper.yaml"

启动zookeeper

bin/zkServer.sh

检查一下指标获取情况

curl ‘http://localhost:30001’

Prometheus 配置

添加zookeeper作业相关配置

  - job_name: '添加'
    static_configs:
    - targets: ['ip1:30001','ip2:30001','ip3:30001']

也可以这样配置:

 - job_name: 'zookeeper' 
    file_sd_configs:
     - files:
       - configs/zookeeper.json

这样配置需要在prometheus根目录下新建configs目录,并新建文件zookeeper.json

[
 {
  "targets": ["ip1:30001","ip2:30001","ip3:30001"]
 }
]

这样的配置在prometheus监控作业较多的情况下,更好管理,如果zookeeper节点发生变动,我们只需要修改到json文件即可,不用重启prometheus。

监控展示

Prometheus+grafana的安装配置和使用可参考本人之前写的Prometheus监控Flink
https://www.yuque.com/u552836/hu5de3/mvhz9a
或者上网找更加详细的教程

启动 prometheus

nohup ./prometheus --config.file=prometheus.yml &

启动 grafana

nohup bin/grafana-server &

社区中找一下有没有可以用的模版,我这里也有一个模版,可以在此基础上修改修改。
Zookeeper Prometheus Dashboard-1590976438779.json

Reference

https://zookeeper.apache.org/doc/r3.4.14/zookeeperAdmin.html#sc_monitoring
https://www.cnblogs.com/bigberg/p/10118555.html