Docker下实战zabbix三部曲之三自定义监控项

30次阅读

共计 5720 个字符,预计需要花费 15 分钟才能阅读完成。

通过上一章《Docker 下实战 zabbix 三部曲之二:监控其他机器》的实战,我们了解了对机器的监控是通过在机器上安装 zabbix agent 来完成的,zabbix agent 连接上 zabbix server 之后,将自己所在机器的信息定时给到 zabbix server,这样就实现了机器的监控;
但是我们能监控到的只有 cpu,磁盘这些基础信息,对于一些业务信息例如访问量,某个逻辑的执行成功失败次数等信息,我们也想进行监控,这就需要我们去制作自定义监控项了,本章我们就一起来实战自定义监控项吧。

全系列文章链接:

  1. 《Docker 下实战 zabbix 三部曲之一:极速体验》;
  2. 《Docker 下实战 zabbix 三部曲之二:监控其他机器》;
  3. 《Docker 下实战 zabbix 三部曲之三:自定义监控项》;

机器部署情况一览

总的来说,有四台机器,各自的功能如下:
a. 假设有一个机器在运行 web 应用,容器是 tomcat,这个应用有个接口 http://localhost:8080/zabbixcustomitemdemo/count,可以返回最近一分钟的某个业务量 (例如网站访问次数);

b. 有一台机器安装了 zabbix agent,作为自定义监控项的载体;
c. 有一台机器安装了 zabbix server;
d. 有一台机器安装了 mysql,作为 zabbix 系统的数据库;

整体部署如下图所示:

运行 web 应用的 server

这是个基于 maven 的 java web 应用,里面有个 spring mvc 的 controller,提供一个 http 服务,范围某个业务每分钟的业务量,代码如下图所示:

@Controller
public class CountController {@RequestMapping("/count")
    @ResponseBody
    public int count(String model, String type) {
        int base;
        int max;
        int min;

        if("a".equals(model)){base = 50000;}else{base =10000;}

        if("0".equals(type)){
            max = 9000;
            min = 1000;
        }else{
            max = 1000;
            min = 0;
        }

        return base + new Random().nextInt(max)%(max-min+1);
    }
}

从以上代码我们可以看出,http 服务会返回随机数,此服务接受两个参数 model 和 type,当 model 等于”a”时返回的随机数从 50000 开始,model 不等于”a”时返回的随机数从 10000 开始,当 type 等于”0”时,在 base 的基础上增加的值是 1000 到 9000 之间,当 type 不等于”0”时,在 base 的基础上增加的值是 0 到 1000 之间;

整个工程的代码已经上传到 git 上,地址是 git@github.com:zq2599/blog_demos.git,这个目录下由多个工程,本次实战的工程是 zabbixcustomitemdemo,如下图:

docker-compose.yml 文件

上面我们已经把四台机器的功能和关系梳理清楚了,现在就来制定 docker-compose.yml 文件吧:

version: '2'
services:
  zabbix-mysql-service: 
    image: daocloud.io/library/mysql:8
    container_name: zabbix-mysql-service
    environment:
      - MYSQL_ROOT_PASSWORD=888888
    restart: always
  zabbix-server-service:
    image: monitoringartist/zabbix-xxl:3.2.6
    links: 
      - zabbix-mysql-service:mysqlhost
    container_name: zabbix-server-service
    restart: always
    depends_on:
      - zabbix-mysql-service
    ports:
      - "8888:80"
    environment:
      - ZS_DBHost=mysqlhost
      - ZS_DBUser=root
      - ZS_DBPassword=888888
  zabbix-agent-a:
    image: zabbix/zabbix-agent:ubuntu-3.2.6
    links: 
      - zabbix-server-service:zabbixserverhost
    container_name: zabbix-agent-a
    restart: always
    depends_on:
      - zabbix-server-service
    environment:
      - ZBX_HOSTNAME=zabbix-agent-service-a
      - ZBX_SERVER_HOST=zabbixserverhost
  tomcat-server-service:
    image: bolingcavalry/bolingcavalrytomcat:0.0.1
    container_name: tomcat-server
    restart: always
    ports:
      - "8080:8080"

yml 文件的内容如上所示,其中 mysql、zabbix server,zabbix agent 的配置和上一章《Docker 下实战 zabbix 三部曲之二:监控其他机器》是一样的,新增的是一个 tomcat 的镜像,这个镜像是我在 tomcat 官方镜像的基础上做了点小改动,使得这个 tomcat 支持在线部署 web 应用,关于 tomcat 在线部署应用,请看文章《实战 docker,编写 Dockerfile 定制 tomcat 镜像,实现 web 应用在线部署》

准备好 yml 文件之后,打开终端,在 yml 文件所在目录下执行 <font color=”red”>docker-compose up -d</font> 可以将 yml 文件中所有的容器都启动;

注意,如果您的电脑之前已经运行过上一章《Docker 下实战 zabbix 三部曲之二:监控其他机器》中的 docker-compose.yml 文件,那么本次执行 docker-compose up - d 会提示启动失败,已有同样名称的容器存在,这时候可以去上一章的 docker-compose.yml 文件所在目录执行 docker-compose down,也可以通过 docker ps - a 将所有容器列出,再通过 docker stop 命令依次停止所有容器,再执行 docker-compose rm 命令依次删除;

部署 web 应用

打开终端,进入 web 工程 zabbixcustomitemdemo 的目录下,执行命令 <font color=”red”>mvn clean package -U -Dmaven.test.skip=true tomcat7:redeploy</font>,即可将 web 工程部署到 tomcat 容器上,关于在线部署的细节请参照文章《实战 docker,编写 Dockerfile 定制 tomcat 镜像,实现 web 应用在线部署》;

部署成功后,打开浏览器,访问 http://localhost:8080/zabbixcustomitemdemo/count,web server 会返回一个数字,如下图所示:

制作访问 url 的 shell 脚本

接下来我们要在 zabbix agent 上做一个 shell 脚本,此脚本的功能时发起 http 请求 http://localhost:8080/zabbixcustomitemdemo/count?model=a&type=0,就能得到 web 服务响应的数字,如果此脚本每分钟被调用一次,就能得到完整的监控曲线图了;

a. 首先,执行 <font color=”red”>docker exec -it zabbix-agent-a /bin/bash</font> 登录 zabbix agent 的容器;
b. 登录后,执行 <font color=”red”>apt-get update</font> 更新 apt;
c. 先后执行 <font color=”red”>apt-get install wget</font> 和 <font color=”red”>apt-get install vim</font>,安装 wget 和 vi 工具;
d. 新建目录 /usr/work/, 在此目录下用 vi 创建一个 shell 文件 biz_count.sh,内容如下:

#"!/bin/bash
wget -qO- http://tomcathost:8080/zabbixcustomitemdemo/count?model=$1\&type=$2
echo ""

上面代码的功能是访问 http 服务获取一个数字,其中 model 和 type 用的是 shell 的入参;
注意两个细节:
第一个:最后一行代码 <font color=”red”>echo“”</font>,实践证明这一行是很有用的,有了这一行就会在输出 http 返回的数字后进行换行,有了换行数据才能成功上报到 zabbix server;
第二个:wget 命令后面的 url 参数中,”&”符号前面要加转义的斜杠””;

e. 执行 <font color=”red”>chmod a+x biz_count.sh</font>,给 shell 赋予可执行权限;

agent 上添加监控项

继续在 zabbix agent 容器上,我们要添加一个自定义监控项,这样后面在 zabbix server 上就能使用该监控项了:
a. 在 /etc/zabbix/zabbix_agentd.d 目录下,新增一个 biz.conf 文件,内容如下:

UserParameter=get_total_num[*],/usr/work/biz_count.sh $1 $2

以上代码配置了一个自定义监控项,名称是 get_total_num,可以接受两个入参,该监控项会调用 biz_count.sh 这个脚本,并且把外部传来的两个入参直接传递给 biz_count.sh;

b. 执行 <font color=”red”>chmod a+r biz.conf</font> 使得该文件可读;

在 zabbix agent 上测试

继续在 zabbix agent 容器上,执行以下命令来测试刚刚新加的监控项:

/usr/sbin/zabbix_agentd -t get_total_num[a,0]

中括号中的 a,0 表示两个入参分别是”a”和”0”,我们执行四次,入参分别用 [a,0]、[b,0]、[a,1]、[b,1],得到的结果如下图所示:

四个返回值分别是 54741、17097、50564、10919,结合前面的 java 代码可以发现两个参数都生效了,数字的大小范围因入参而变化;

为了让监控项生效,需要重启 zabbix agent,不过这里有个更快捷的方法可以试试:
a. 执行 <font color=”red”>exit</font> 退出 zabbix agent 容器;
b. 执行 <font color=”red”>docker restart zabbix-agent-a</font> 重启 zambia agent 容器;

到了这里,自定义监控项已经准备好了,接下来在 zabbix server 上把它配置成功,我们就能看到监控数据和曲线图了,不过在配置前,我们可以在 zabbix server 上测试一下能否成功调用 zabbix agent 上的监控项;

在 zabbix server 上测试 agent 机器的监控项

首先我们要搞清楚 zabbix agent 机器的 ip,有两种方法:
第一种,执行 <font color=”red”>docker exec -it zabbix-agent-a /bin/bash</font> 登录 zabbix agent 的容器,在容器中执行 <font color=”red”>ip addr</font> 命令可以得到 ip;
第二种,直接执行 <font color=”red”>docker exec -it zabbix-agent-a ip addr</font> 命令得到 ip;

不论哪种,都能得到 zabbix-agent 的 ip 是 172.31.0.5;

现在我们登录 zabbix server 容器,执行命令 <font color=”red”>docker exec -it zabbix-server-service /bin/bash</font> 即可登录, 登录后执行以下命令:

zabbix_get -s 172.31.0.5 -k get_total_num[a,0]

如下图所示,测试成功,调用 agent 的监控项返回了符合预期的数据:

还记得我们刚才在 zabbix agent 上配置好之后,需要重启 agent 服务或者重启 zabbix agent 容器,如果您忘了这一步,现在 zabbix server 上测试会得到如下错误提示:

这时候去重启一下,再回来测试就可以成功了。

在管理页面上添加监控项

在浏览器上输入”http://localhost:8888/“登录管理页面,先添加 agent 机器,如下图:

添加之后,点击下图红框位置,进入监控项页面:

如下图,点击右上角的“Create item”即可开始添加监控项:

新增的监控项,我们只要填写 Name,Key,Update interval(更新频率)这几个字段,其他的保持不变,每个要更新的字段的内容如下图:

填写并保存后,我们可以在 Monitoring -> Latest data 中看到最新的监控项数据,如下图:

接下来我们添加一个监控图形,操作如下图所示,可以进入图形管理页面:

如下图,点击右上角的“Create graph”创建一个图形:

新建图形的时候,名称随意,只要 Items 选中刚刚创建的监控项即可,如下图:

创建成功,现在要看看效果了,操作如下图所示:

点击”add”之后,在弹出的页面上选择刚刚我们新建的图形选项,操作完毕后,点击下图红框位置,就能看见曲线图了:

曲线图如下:

以上就是自定义监控项开发和设置的所有过程,基于监控项的操作,除了图形还能添加 tirgger 用来告警,在添加 action 用来确定告警的动作,例如邮件短信的,有兴趣的读者可以实际操作实战。

欢迎关注我的公众号

正文完
 0