zabbix监测系统
安装
使用docker安装/运行方式(建议使用此方式)
离线安装包: smb://192.168.9.1/公共模块/繁星/繁星二代/自检系统/(zabbix_agent_proxy_tx1、zabbix_docker)
有docker离线包zabbix_docker,拷贝到有docker的主机上,加载镜像:
docker load < postgres9.6.docker.images
# 屏幕会返回镜像的id,假设是:id-1
# 给镜像命名
docker tag id-1 postgres:9.6
# 下面两个镜像不需要命名,如果load后运行docker images 发现名字和版本都是none,则手动命名
docker load < zabbix-server-pgsql.docker.images
# docker tag id-2 zabbix/zabbix-server-pgsql:ubuntu-3.4.13
docker load < zabbix-web-nginx-pgsql.docker.images
# docker tag id-3 zabbix/zabbix-web-nginx-pgsql:ubuntu-3.4.13
# 加载完毕,docker images应该能显示
root@user-ubuntu:~/zabbix_docker# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zabbix/zabbix-web-nginx-pgsql ubuntu-3.4.13 bf422197fafe 4 weeks ago 254 MB
zabbix/zabbix-server-pgsql ubuntu-3.4.13 af4434f6332b 4 weeks ago 224 MB
postgres 9.6 4023a747a01a 20 months ago 265 MB
本地安装/运行方式(坑多)
**此方法不同的机器上可能遇到不同的问题,下面的说明只能作为参考。 **
我用网上说的apt-get方式装,无法成功。web界面使用不正常,所以采用源码方式装。zabbix-3.4.13.tar.gz
环境依赖安装按照以下步骤: https://blog.csdn.net/yannanxiu/article/details/54924198
zabbix-proxy zabbix-server zabbix-front-php 用源码安装,参考: https://www.zabbix.com/documentation/3.4/zh/manual/installation/install
数据库安装,建立zabbix用户,建立zabbix数据库,运行zabbix-3.4.13/database/postgresql/中的3个脚本。命令行:
su postgres
createdb zabbix
createuser -SDRP zabbix
su root
cat ./zabbix-3.4.13/zabbix-3.4.13/database/postgresql/{schema,images,data}.sql.gz | psql -h 127.0.0.1 zabbix postgres
或者带界面的postgres客户端做也行。自行选择
zabbix-fornt(web界面)
# 从源码拷贝到apache2 sudo cp -r zabbix-3.4.13/frontends/php/ /var/www/html/zabbix
- zabbix_sender报错
root@tegra-ubuntu:/home/ubuntu# zabbix_sender -s "192.168.5.198" -z "192.168.5.133" -k "keytrtest" -o "1133"
info from server: "processed: 0; failed: 1; total: 1; seconds spent: 0.000026"
这里failed: 1说明失败了。
注意看item的type必须是Zabbix trapper
server主动获取,在zabbix_agent.conf增加的item的type是Zabbix trapper
配置
zabbix_agent配置
需要在系统配置开机启动
zabbix_agentd安装包是在tx1上编译的。zabbix_agent_proxy_tx1的install.sh会将配置文件拷贝到 /usr/local/etc/zabbix_agent.conf
# 填写主节点ip
Server=192.168.5.177
ServerActive=192.168.5.177
# 主节点运行的是proxy,在默认情况下这样填写
Hostname=Zabbix proxy
AllowRoot=1
修改完重启进程
zabbix_proxy配置
需要在系统配置开机启动
zabbix_proxy安装包是在tx1上编译的。zabbix_agent_proxy_tx1的install.sh会将配置文件拷贝到 /usr/local/etc/zabbix_proxy.conf
# zabbix_server主机ip
Server=192.168.9.133
# 需和zabbix_agent配置的Hostname对应
Hostname=Zabbix proxy
# zabbix_proxy数据库目录,如果是使用install.sh脚本安装的,会放在/root/UserApp下。
DBName=/root/UserApp/zabbix_proxy.db
# 多长间隔从zabbix_server拉取配置(秒)
ConfigFrequency=120
AllowRoot=1
zabbix_server配置
需要在系统配置开机启动
zabbix_server在docker运行,在每次启动容器的时候会将必要参数传入,zabbix_docker/dockerrun_zabbix.sh已写好,运行即可
使用
访问路径: http://ip:9210
第一次运行会有一些额外步骤,按照提示下一步即可
quick start
添加proxy,注意Proxy name必须和 zabbix_proxy配置中的Hostname相同。其他配置默认即可。点add添加成功
添加host,Configuration->Hosts->Create host
红框都是需要填写修改的。Groups可以自己建,给设备分组。Monitored by proxy必须选择正确的proxy代理
点Template配置模板,模板决定了有哪些监测项。select选择一个模板,模板后续我们会自己创建,这里先选择Template OS Linux,包含了很多linux的监测项 点小add后再点大add
添加成功
Dashboard可以浏览状态、报警等,Edit dashboard可以自定义。比如Problems中提示我的主机掉线了。
如果想有目的的查询监测项状态,可以打开Monitoring->Lastest data。可以在过滤条件选择感兴趣的主机和检测项组 可以看到最后的值,可以点Graph看数值历史折线图。
这是最基本的使用,后续添加如何自定义监测项,利用api批量添加主机、动态管理监测项等功能。
模板
繁星2代模板已放在sdv上 smb://192.168.9.1/公共模块/繁星/繁星二代/自检系统/zabbix_template
自定义监测项
zabbix的监测项有两种:
- 上报型
zabbix item type选择 traper。需配合zabbix_sender使用
- 查询型
zabbix item type选择 agent
如果没有特殊需求,均采用查询型,走vproc流程。
应用程序使用vproc将状态写到文件,zabbix_agentd用vproc查询各状态的值,采用这种方式的原因:
- zabbix的交互压力可控,查询频率在web上配一下就好了。
- 应用程序写状态的操作与zabbix解耦。即使没有zabbix,我们在调试程序时也可以使用vproc,可以用命令行查询检测项的值。有助于调试
vproc后面章节有详细介绍
繁星增加自定义监测项典型流程
细节可以自行百度“zabbix增加自定义item”
界面上操作可参考:https://blog.csdn.net/u012062455/article/details/53257059
zabbix_agentd端操作可参考:https://www.cnblogs.com/mingerlcm/p/7754076.html
以繁星2代为例。假设我们要在slave模板中增加vaserver的“进程号”、“是否授权”两个监测项。
- 在zabbix web端增加检测项
监测项是添加到模板中的,添加后所有使用该模板的主机均生效,修改starnet_tx1_slave_tp模板
- 点击Configuration->Template 。
- 点击starnet_tx1_slave_tp行的items。
- 点右上角的Create item
- 填写具体信息并保存
- 在zabbix_agentd端配置
- 确保/usr/local/etc/zabbix_agentd.conf中有配置
UnsafeUserParameters=1
Include=/usr/local/etc/zabbix_agentd.conf.d/*.conf
- 在/usr/local/etc/zabbix_agentd.conf.d/vaserver.conf增加命令行,如果没有可新建文件
# UserParameter=后面是key值,必须跟web上配置的相同。逗号后面的是查询这个值所执行的指令。
# 进程号很简单,shell命令就能搞定
UserParameter=vaserver.pid,pgrep VAServer
# license状态是需要应用程序开发者写入到vproc系统中(/root/UserApp/vproc/vaserver/license文件内容)的。在这里用vproc工具进行查询。如果没查到,返回0
UserParameter=vaserver.license,vproc read --key=vaserver.license --value=0
- 重启zabbix_agentd。过一会在web上就能看到了。
vproc
vproc是python编写的工具
类似linux proc系统,应用程序调用vproc脚本将监测项状态值持续更新到指定文件中。外部可读取文件值,得知应用程序的运行情况。
vproc工具有5种用法。
- 写:
# 此命令将创建文件 ROOT_VPROC/app/group1/group2/item,文件内容为value1
./vproc write --key=app.group1.gourp2.item --value=value1
- 读:
# 将ROOT_VPROC/app/group1/group2/item文件内容打印出来
./vproc read --key=app.group1.gourp2.item
- 重置:
# 删除ROOT_VPROC/app/group1/目录。相当于重置状态值
./vproc clean --path=app.group1
- lld json功能:
# 将path目录下第一级目录/文件名当做macro的value,生成json
# 假设有 app.group1.group2.item和app.group1.item1
./vproc lld --path=app.group1 --macro=DY
# 输出
{"data": [{"{#DY}": "group1"}, {"{#DY}": "item1"}]}
这个功能是配合zabbix的lld功能使用。详情见watchmen文档动态item章节
- 查看:
# 类似top,每隔1秒刷新输出一次状态值。参数path可以是任意级别,输出的监测项是path下的所有监测项。
./vproc watch --path=app.group1
所有key值均采用 app.[group1.gourp2...groupn].item方式组织。末端item为文件,记录监测项的值,前面是多级目录。比如key值vaserver.va0.cameraname,记录状态值的文件为VPORC_ROOT/vaserver/va0/cameraname。
单个监测项更新状态频率不宜过快。建议间隔时间1分钟以上
注意: 建议在程序(以及能代表一组的流程)启动时、关闭时重置状态,避免旧的状态值干扰。
vproc 典型使用流程,拿vaserver举例:
有vaserver.event_count(发出了多少事件) ; vaserver.va0.taskname(分析通道0的任务名称); vaserver.va1.taskname
vaserver启动和退出时应调用
# 清理旧状态
./vproc clean --path=vaserver
vaserver启动、关闭一个va时(假设是编号0)应调用
# 清理旧状态
./vproc clean --path=vaserver.va0
# 然后将任务信息状态更新
./vproc write --key=vaserver.va0.taskname --value=taskname1
# 其他状态值在恰当时更新
自定义监测项列表
VAServer
key | 类型 | 说明 |
---|---|---|
vaserver.va0.taskname | Text | 任务名称 |
vaserver.va0.taskid | Text | 任务id |
vaserver.va0.cameraname | Text | 相机名称 |
vaserver.va0.cameraid | Text | 相机id |
vaserver.va0.playok | int | 是否点播成功,实际接收到流后再更新状态 |
vaserver.va0.sendresultcount | int | 对外发送了多少条结果,1分钟更新一次 |
vaserver.va0.YUVfreq | int | YUV帧率 |
vaserver.va0.playfreq | int | 调试流帧率 |
vaserver.va0.MediaDatafreq | int | 输入码流帧率 |
vaserver.va0.personNumberAlarm | int | 人流量结果数量 |
vaserver.va0.densityAlarm | int | 密度结果数量 |
vaserver.va[1...n].xxx | 同va0 | 同va0 |
vaserver.license | int | 授权状态,check license后更新 |
vaserver.some |
动态item
概述
动态item的官方说法叫做 Low-level discovery(LLD)
之前我们使用zabbix时需要手动、明确的添加一个个item,对于某些特殊需求,这种方式无法优雅的实现。比如我们想监测所有正在点播的摄像机状态,我们无法预知有多少摄像机,无法预知摄像机id从而定义key值,这时LLD功能派上用场。
参考资料:
zabbix 自定义自动发现的key! low level discovery
操作教程
摄像机状态这个监控项有几个特点:
- 摄像机有多少不固定
- 摄像机是动态的,随时增减
- 每个设备点播的摄像机不同,能够监控的摄像机也就不同
下面演示如何利用LLD功能满足摄像机状态的监控需求
web上的配置
打开zabbix web,点开模板配置,点击指定模板的Discovery,如图:
此时进入了Discovery rules页面,点击右上角的Create discovery rule,填写相关内容:
- key 拉取macro集合的key值
- Update interval是每隔多少秒拉取一次
- Custom intervals是设备上删除了动态items后,zabbix web上多少秒后删除。 最低时间3600秒
创建成功后,在Discovery rules多出一行,点 Item prototypes
此时进入了Item prototypes页面,点击右上角的Create item prototype,参考图中填写,注意:
- {#CAMERAID} 称之为宏macro,macro是动态items的关键,我们用macro处理 items key值中的变化项。macro可以是任何值,和设备上配置的对应上即可(后面会介绍)。
- 注意key的格式,中括号模式是带参数的key,中括号的值是参数,zabbix server向zabbix_agentd获取值时带参数。 设备上配置文件中会体现出作用。
设备上配置文件
总结在zabbix web上的操作,我们创建了一个Discovery,在Discovery中创建了一个Item prototypes,涉及到两个key: cameras和cameras.fps[{#CAMERAID}]
在/usr/local/etc/zabbix_agentd.conf.d/test.conf中增加两行
UserParameter=cameras,vproc lld --path=cameras --macro=CAMERAID
UserParameter=cameras.fps[*],vproc read --key=cameras.$1.fps --value=-1
第一行是发现items。vproc增加了lld功能,将--path下第一级的文件/目录名当做macro的赋值,返回zabbix定义的json串:
{"data": [{"{#CAMERAID}": "vax1"}, {"{#CAMERAID}": "vax2"}, {"{#CAMERAID}": "id2"}, {"{#CAMERAID}": "id1"}]}
在设备上写测试数据,几个摄像机状态
vproc write --key=cameras.vax1.fps --value=25
vproc write --key=cameras.vax1.playok --value=0
vproc write --key=cameras.vax2.fps --value=25
vproc write --key=cameras.vax2.playok --value=0
vproc write --key=cameras.id2.fps --value=25
vproc write --key=cameras.id2.playok --value=1
vproc write --key=cameras.id1.fps --value=25
vproc write --key=cameras.id1.playok --value=1
# 此时[vproc_root]/cameras目录下有vax1,vax2,id1,id2目录。 所以vproc lld命令读取到4个相机id,组成json返回zabbix
第二行是获取指定相机的fps,相机id用参数传进来。 $1代表参数。也就是web设置key值cameras.fps[{#CAMERAID}]时中括号里的值。我们这里中括号是macro
重启zabbix_agentd后,过一会就能看到效果了
192.168.88.3我只写了id1和id2。
vproc write --key=cameras.id2.fps --value=25
vproc write --key=cameras.id2.playok --value=1
vproc write --key=cameras.id1.fps --value=25
vproc write --key=cameras.id1.playok --value=1
所以比88.2少了 vax1、vax2的监测项。我们在设备上继续添加其他其他摄像机状态,在web上会自动创建监测项。 设备上删除摄像机后,1小时后,web上会删除对应的监测项。
运作流程简述
- 创建Discovery后,zabbix server会每隔n秒,向设备拉取macro的value集合。 拉取动作有自己的key,在zabbix_agentd上配置这个key对应的command,command收集macro的value集合,生成json返回给zabbix server。 zabbix server解析json,保存macro的value集合。
- 在Discovery中创建的Item prototypes可以使用macro,创建带参数的key值,根据macro的value集合自动创建的item集合。
- Discovery会检查macro的value的增减,新增就创建item,减少了就等n时间后删除item。
- 可以创建多个Item prototypes
- macro的value集合json利用vproc lld功能生成
监控docker
已有开源项目https://github.com/monitoringartist/Zabbix-Docker-Monitoring
平台端运行zabbix_agentd定制版docker,离线包中已添加zabbix_docker/dockbix-agent-xxl-limited_3.4-3.images
dockerrun_zabbix.sh中有运行命令
zabbix web增加Zabbix-Template-App-Docker.xml模板。创建主机,关联此模板