通过上一章《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文件所在目录下执行docker-compose up -d可以将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的目录下,执行命令mvn clean package -U -Dmaven.test.skip=true tomcat7:redeploy,即可将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. 首先,执行docker exec -it zabbix-agent-a /bin/bash登录zabbix agent的容器;

b. 登录后,执行apt-get update更新apt;

c. 先后执行apt-get install wget和apt-get install vim,安装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的入参;

注意两个细节:

第一个:最后一行代码echo “”,实践证明这一行是很有用的,有了这一行就会在输出http返回的数字后进行换行,有了换行数据才能成功上报到zabbix server;

第二个:wget命令后面的url参数中,”&”符号前面要加转义的斜杠”\”;

e. 执行chmod a+x biz_count.sh,给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. 执行chmod a+r biz.conf使得该文件可读;

在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. 执行exit退出zabbix agent容器;

b. 执行docker restart zabbix-agent-a重启zambia agent容器;

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

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

首先我们要搞清楚zabbix agent机器的ip,有两种方法:

第一种,执行docker exec -it zabbix-agent-a /bin/bash登录zabbix agent的容器,在容器中执行ip addr命令可以得到ip;

第二种,直接执行docker exec -it zabbix-agent-a ip addr命令得到ip;

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

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

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用来确定告警的动作,例如邮件短信的,有兴趣的读者可以实际操作实战。

欢迎关注我的公众号

Docker下实战zabbix三部曲之三:自定义监控项的更多相关文章

  1. Docker下实战zabbix三部曲之二:监控其他机器

    在上一章<Docker下实战zabbix三部曲之一:极速体验>中,我们快速安装了zabbix server,并登录管理页面查看了zabbix server所在机器的监控信息,但是在实际场景 ...

  2. Docker下实战zabbix三部曲之一:极速体验

    对于想学习和实践zabbix的读者来说,在真实环境搭建一套zabbix系统是件费时费力的事情,本文内容就是用docker来缩减搭建时间,目标是让读者们尽快投入zabbix系统的体验和实践: 环境信息 ...

  3. Docker下dubbo开发三部曲之三:java开发

    在前两章<Docker下dubbo开发,三部曲之一:极速体验>和<Docker下dubbo开发,三部曲之二:本地环境搭建>中,我们体验了dubbo环境搭建以及服务的发布和消费, ...

  4. Zabbix添加SNMP自定义监控项OID出现“No Such Instance currently exists at this OID”

    原因:zabbix 是用snmpget来获取指定的OID数据,snmpwalk是遍历某个OID下的数据. 所以一定要用snmpget来验证某个OID是否正确. snmptranslate 获取的OID ...

  5. Flink的DataSource三部曲之三:自定义

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. zabbix自定义监控项、添加图形、设置触发器、远程执行命令

    监控项是在zabbix中手机数据的基础,没有监控项就没有数据,系统自带模板带有大量默认item,自定义item可以定义在模板中,在应用模板即可使用对应item:也可直接在host中定义 目标:自定义监 ...

  7. 分布式系统监视zabbix讲解六之自定义监控项--技术流ken

    宏 概述 Zabbix支持许多在多种情况下使用宏.宏是一个变量,由如下特殊语法标识: {MACRO} 根据在上下文中, 宏解析为一个特殊的值. 有效地使用宏可以节省时间,并使Zabbix变地更加高效. ...

  8. zabbix自定义监控项一

    1.在agent端配置 1.1 添加自定义监控项 zabbix中监控项叫做item,监控项的取值方法叫做key item: Items是从agnet主机里面获取的所有数据.通常情况下我叫itme为监控 ...

  9. Zabbix自定义监控项(模板)

    虽然Zabbix提供了很多的模板(简单理解为监控项的集合),在zabbix界面点击share按钮就可以直接跳到模板大全的官方网站,但是由于模板内的监控项数量太多不好梳理且各种模板质量参差不齐,还是建议 ...

随机推荐

  1. ImageNet主要网络benchmark对比

    深度神经网络繁多,各自的性能指标怎样? 实际应用中,在速度.内存.准确率等各种约束下,应该尝试哪些模型作为backbone? 有paper对各个网络模型进行了对比分析,形成了一个看待所有主要模型的完整 ...

  2. DES加解密工具类

    这两天在跟友商对接接口,在对外暴露接口的时候,因为友商不需要登录即可访问对于系统来说存在安全隐患,所以需要友商在调用接口的时候需要将数据加密,系统解密验证后才执行业务.所有的加密方式并不是万能的,只是 ...

  3. linux 7忘记密码找回

    一.linux 7忘记密码二种更改方法 centos7/rhel7进入单用户方式和重置密码方式发生了较大变化,GRUB由b引导变成了ctrl+x引导.重置密码主要有rd.break和init两种方法. ...

  4. 快应用 吸顶 bug

    官网说, 加载页面时,所有元素的appear事件都会被触发一次.因此,需要过滤第一次的appear事件:  但是,即使设置了过滤,也无效 于是,我把show属性改成了if属性,问题就解决 如下图:  

  5. 替代Flume——Kafka Connect简介

    我们知道过去对于Kafka的定义是分布式,分区化的,带备份机制的日志提交服务.也就是一个分布式的消息队列,这也是他最常见的用法.但是Kafka不止于此,打开最新的官网. 我们看到Kafka最新的定义是 ...

  6. lua_lua与.Net互相调用

    配置环境:创建C#项目,引入luainterface-1.5.3\Built下面的LuaInterface.dll文件和luanet.dll文件.引入命名空间using LuaInterface 代码 ...

  7. [C#] 建立UDP连接、发送广播

    说明: 通过建立本地UdpClient与远程UdpClient进行通讯,亦可直接发送到其他已存在的远程端. 基本原理:构建一个本地的udpcSend实例,开启多线程进行监听,然后再发送广播. 案例有字 ...

  8. C#开发BIMFACE系列7 服务端API之获取文件信息列表

    系列目录     [已更新最新开发文章,点击查看详细] 本文详细介绍如何获取BIMFACE平台中所有上传过的文件信息列表. 请求地址:GET https://file.bimface.com/file ...

  9. 【数据结构】10.java源码关于LinkedHashMap

    目录 1.LinkedHashMap的内部结构 2.LinkedHashMap构造函数 3.元素新增策略 4.元素删除 5.元素修改和查找 6.特殊操作 7.扩容 8.总结 1.LinkedHashM ...

  10. CodeForces Round #514 (div2)

    A:Cashier 题意:问可以休息多少次. 代码: #include<bits/stdc++.h> using namespace std; #define Fopen freopen( ...