通过在 ZooKeeper 中埋点来暴露数据,使用 ARMS Prometheus 监控抓取数据,并借助 ARMS Prometheus Grafana 大盘来展示数据,即可实现通过 ARMS Prometheus 监控 ZooKeeper 的目的。

背景信息

本教程的操作流程如图所示。

How It Works

步骤一:启动 JMX 服务

首先需要在 ZooKeeper 中启用 JMX 服务以获取资源信息。

  1. 修改/opt/zk/zookeeper-3.4.10/bin/zkServer.sh,在第44行添加JMXPORT=8999。具体添加位置如下所示。
    if [ "x$JMXLOCALONLY" = "x" ]
    then
        JMXLOCALONLY=false
    fi
    
    JMXPORT=8999 ## 添加在此处第 44 行
    
    if [ "x$JMXDISABLE" = "x" ] || [ "$JMXDISABLE" = 'false' ]
    then
      echo "ZooKeeper JMX enabled by default $JMXPORT ..." >&2
      if [ "x$JMXPORT" = "x" ]
      then
  2. 重启 ZooKeeper。
    /opt/zk/zookeeper-3.4.10/bin/zkServer.sh start /opt/zk/zookeeper-3.4.10/conf/zoo_sample.cfg &

步骤二:在 ZooKeeper 中启动 jmx_exporter

其次需要启动 jmx_exporter,让 JMX 信息可以直接通过HTTP方式访问,以便 ARMS Prometheus 监控抓取。

  1. 下载 zookeeper.yaml/opt/exporter_zookeeper/目录下。
  2. 修改下载的 /opt/exporter_zookeeper/zookeeper.yaml文件,在第一行添加 hostPort: localhost:8999,将 JMX 服务运行的端口暴露给 jmx_exporter。
  3. 下载 jmx_exporter 的可执行文件opt/exporter_zookeeper/目录下。
  4. 启动 jmx_exporter。
    java -Dcom.sun.management.jmxremote.ssl=false -
    Dcom.sun.management.jmxremote.authenticate=false -
    Dcom.sun.management.jmxremote.port=8998 -cp /opt/exporter_zookeeper/jmx_prometheus_httpserver-0.12.0-jar-with-dependencies.jar 
    io.prometheus.jmx.WebServer 8997 /opt/exporter_zookeeper/zookeeper_exporter.yaml &
    至此应用部分配置完成。可通过运行如下命令验证 jmx_exporter 是否可以正常工作。
    curl http://<jmx_exporter 所在机器的IP>:9997/metrics

步骤三:配置 ARMS Prometheus 监控以抓取 ZooKeeper 的数据

接下来需要在 ARMS 控制台配置 ARMS Prometheus 监控以抓取 ZooKeeper 的数据。

  1. 登录 ARMS 控制台
  2. 在左侧导航栏中单击 Prometheus监控
  3. Prometheus监控页面顶部选择容器服务 K8s 集群所在的地域,然后单击目标集群的名称。
  4. 在接下来的页面单击配置详情页签,然后单击编辑prometheus.yamlprom_kafka yaml
  5. 粘贴以下代码。
      global:
      scrape_interval:     15s # Set the scrape interval to every 15 seconds. 
    Default is every 1 minute.
      evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
    scrape_configs:
      - job_name: 'zookeeper'    
        static_configs:    
        - targets: ['121.40.124.46:8997']

步骤四:通过 Grafana 大盘展示 ZooKeeper 的数据

最后需要在 ARMS 控制台导入 Grafana 大盘模板并指定 Prometheus 数据源所在的容器服务 K8s 集群。

  1. 打开 ARMS Prometheus Grafana 大盘概览页
  2. 在左侧导航栏中选择 + > Import,并在 Grafana.com Dashboard 文本框输入 10981,然后单击 Load
    Import Grafana Dashboard
  3. Import 页面输入以下信息,然后单击 Import
    Import Grafana Dashboard with Options
    1. Name 文本框中输入自定义的大盘名称。
    2. Folder 下拉框中选择您的阿里云容器服务 K8s 集群。
    3. 在最下方的下拉框中选择您的阿里云容器服务 K8s 集群。
    配置完毕后的 ARMS Prometheus Grafana ZooKeeper 大盘如图所示。prom-zoo gra

步骤五:创建 Prometheus 监控报警

  1. 报警创建提供两个入口,您可根据需要自行选择其中一个入口进入创建报警环节。
    • ARMS Prometheus Grafana 大盘New DashBoard 页面,单击左侧的 图标,跳转至 ARMS Prometheus 创建报警对话框。
    • 在控制台左侧导航栏中选择报警管理 > 报警策略管理,进入报警策略管理页面,在右上角单击创建报警 > Prometheus
  2. 创建报警对话框中输入所有必填信息,完成后单击保存
    1. 填写报警名称,例如:网络接收压力报警。
    2. 选择要创建报警的 Prometheus 监控对应的集群
    3. 选择类型grafana
    4. 选择要监控的具体大盘图表
    5. 设置报警规则。
      1. 勾选同时满足下述规则
      2. 编辑报警规则,例如:N = 5 时网络接收数据字节(MB)的平均值大于等于 3 时则报警。
        说明 一个 Grafana 图表中可能有 A、B、C 三条曲线数据,您可设置监控其中的一条线。
      3. PromQL 输入框中编辑或重新输入 PromQL 语句。
        注意 PromQL 语句中包含的“$”符号会导致报错,您需要删除包含“$”符号的语句中“=”左右两边的参数及“=”。例如:将sum (rate (container_network_receive_bytes_total{instance=~"^$HostIp.*"}[1m]))修改为sum (rate (container_network_receive_bytes_total[1m]))
    6. 勾选通知方式,例如:勾选短信。
    7. 设置通知对象。在全部联系组中单击联系人分组的名称,该联系人分组出现在已选联系组中,即设置成功。
    Prometheus Monitoring Alarm

后续步骤

ARMS Prometheus Grafana ZooKeeper 大盘配置完毕后,您可以查看 Prometheus 监控指标和进一步自定义大盘,详见相关文档。