zabbix添加自定义监控项

通过编写脚本来获取tcp的各种状态,添加tcp状态模板,触发器,图形,完整实现通过脚本自定义监控的整体流程

一、agent端配置

1.创建自定义脚本存放目录

[root@localhost ~]# mkdir /etc/zabbix/scripts
[root@localhost ~]# chown zabbix.zabbix /etc/zabbix/scripts/

2.创建脚本

创建获取tcp状态的脚本,内容如下所示

#!/bin/bash
#this script is used to get tcp and udp connetion status
#tcp status
metric=$1
tmp_file=/tmp/tcp_status.txt
/bin/netstat -an|awk '/^tcp/{++S[$NF]}END{for(a in S) print a,S[a]}' > $tmp_file

case $metric in
  closed)
         output=$(awk '/CLOSED/{print $2}' $tmp_file)
         if [ "$output" == "" ];then
            echo 0
         else
            echo $output
         fi
       ;;
  listen)
         output=$(awk '/LISTEN/{print $2}' $tmp_file)
         if [ "$output" == "" ];then
            echo 0
         else
            echo $output
         fi
       ;;
  synrecv)
         output=$(awk '/SYN_RECV/{print $2}' $tmp_file)
         if [ "$output" == "" ];then
            echo 0
         else
            echo $output
         fi
       ;;
  synsent)
         output=$(awk '/SYN_SENT/{print $2}' $tmp_file)
         if [ "$output" == "" ];then
            echo 0
         else
            echo $output
         fi
       ;;
  established)
         output=$(awk '/ESTABLISHED/{print $2}' $tmp_file)
         if [ "$output" == "" ];then
            echo 0
         else
            echo $output
         fi
       ;;
  timewait)
         output=$(awk '/TIME_WAIT/{print $2}' $tmp_file)
         if [ "$output" == "" ];then
            echo 0
         else
            echo $output
         fi
       ;;
  closing)
         output=$(awk '/CLOSING/{print $2}' $tmp_file)
         if [ "$output" == "" ];then
            echo 0
         else
            echo $output
         fi
       ;;
  closewait)
         output=$(awk '/CLOSE_WAIT/{print $2}' $tmp_file)
         if [ "$output" == "" ];then
            echo 0
         else
            echo $output
         fi
       ;;
  lastack)
         output=$(awk '/LAST_ACK/{print $2}' $tmp_file)
         if [ "$output" == "" ];then
            echo 0
         else
            echo $output
         fi
        ;;
  finwait1)
         output=$(awk '/FIN_WAIT1/{print $2}' $tmp_file)
         if [ "$output" == "" ];then
            echo 0
         else
            echo $output
         fi
        ;;
  finwait2)
         output=$(awk '/FIN_WAIT2/{print $2}' $tmp_file)
         if [ "$output" == "" ];then
            echo 0
         else
            echo $output
         fi
        ;;
        *)
         echo -e "\e[033mUsage: sh  $0 [closed|closing|closewait|synrecv|synsent|finwait1|finwait2|listen|established|lastack|timewait]\e[0m"
esac

3.配置zabbix_agentd.conf

执行自定义脚本获取数据,需要在配置文件中打开相应选项,如果已经开启可以跳过此步骤

[root@localhost ~]# egrep -v "(^#|^$)" /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=1
EnableRemoteCommands=1  #允许在本地执行远程命令
Server=c2600217k6.wicp.vip
ListenPort=10050
ListenIP=0.0.0.0
StartAgents=3
Hostname=47.96.226.49
UnsafeUserParameters=1 #启用用户自定义监控脚本
Include=/etc/zabbix/zabbix_agentd.d/*.conf
Timeout=8

4.自定义key配置文件

[root@localhost ~]# cat /etc/zabbix/zabbix_agentd.d/tcp-status-params.conf 
UserParameter=tcp.status[*],/etc/zabbix/scripts/tcp_conn_status.sh $1

说明:此处的tcp.status就是监控项名,后面的$1是对应的参数
例如closewait的状态就是tcp.status[closewait]

5.重启服务

[root@localhost ~]# systemctl restart zabbix-agent.service

6.测试

通过server端的zabbix_get测试是否能获取自定义监控的数据
[root@localhost ~]# zabbix_get -s ip -p 10050 -k “tcp.status[listen]”
13

[root@localhost ~]# zabbix_get -s ip -p 10050 -k "tcp.status[listen]"
13

有数据没有问题
注意:这命令是在zabbix的server端执行,不是在agent端执行
如果没有zabbix_get命令,安装zabbix_get

[root@localhost ~]# yum -y install  zabbix-get
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * epel: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
软件包 zabbix-get-4.0.12-1.el7.x86_64 已安装并且是最新版本无须任何处理

二、定义自定义模板

在agent端配置完成后还需要在zabbix server web上创建对应的模板,其他主机可以套用模板来获取自定义数据

1.创建模板

在配置–>模板–>创建新模板

模板名称"TCP_CONN_STATUS" 群组放到Templates,配置如下图所示

zabbix media type 执行自定义shell脚本 zabbix脚本自定义监控_自定义

2.创建监控项

在创建好模板后,创建监控项,应该先创建应用集的,不过在创建监控项的时候可以直接创建应用集,所以跳过了创建应用集这项。

在配置–>模板–>TCP_CONN_STATUS 找到刚创建的模板–>监控项–>创建监控项

zabbix media type 执行自定义shell脚本 zabbix脚本自定义监控_自定义监控_02


在监控项中我们定义名称TCP_CONN_LISTEN用来监控tcp中LISTEN数,键值是我们前面在自定义key中定义的tcp.status[listen],然后在应用集处选择新的应用集TCP_CONN_STATUS,点击添加,如下图所示:

zabbix media type 执行自定义shell脚本 zabbix脚本自定义监控_自定义_03

通过以上步骤依次创建tcp其他的状态如TCP_CONN_CLOSED,TCP_CONN_FIN-WAIT-1、TCP_CONN_LAST-ACK、TCP_CONN_SYN-RECV、TCP_CONN_TIME-WAIT等

最终监控项如下图所示:

zabbix media type 执行自定义shell脚本 zabbix脚本自定义监控_触发器_04

3.创建触发器

在配置–>模板–>TCP_CONN_STATUS 找到刚创建的模板–>触发器–>创建触发器,如下图所示:

zabbix media type 执行自定义shell脚本 zabbix脚本自定义监控_自定义监控_05

创建名称为Too Many Tcp Closewait的触发器,设置closewait数量大于多少就报警,我设置的是500,表达式为{TCP_CONN_STATUS:tcp.status[closed].last()}>500,具体配置如下图所示:

zabbix media type 执行自定义shell脚本 zabbix脚本自定义监控_TCP_06


表达式那里点添加,在监控项中选择closewait的监控项,将结果选成>500点击插入就好了,如下图所示:

zabbix media type 执行自定义shell脚本 zabbix脚本自定义监控_自定义监控_07

4.创建图形

配置–>模块–>TCP_CONN_STATUS -->图形 -->创建图形 -->名称 “TCP_CONN_STATUS_Graph” -->选择之前的监控项 -->添加 如图:

zabbix media type 执行自定义shell脚本 zabbix脚本自定义监控_zabbix_08

zabbix media type 执行自定义shell脚本 zabbix脚本自定义监控_zabbix_09

到这里一个自定义的监控模板定义完成

5.关联主机

将我们刚建立的模板关联到我们的主机上,让模板生效

在配置–>主机–>选择要监控的主机–>点击模板–>在链接指示器上选择我们刚创建好的模板点击添加–>点击更新,此模板就被添加上了,如下图所示:

zabbix media type 执行自定义shell脚本 zabbix脚本自定义监控_zabbix_10

我们可以在检测–>最新数据–>选择刚刚添加模板的主机–>选择应用集(TCP_CONN_STATUS)可以看到有最新数据生成,说明我们模板配置成功,如下图所示:

zabbix media type 执行自定义shell脚本 zabbix脚本自定义监控_zabbix_11


也可以在图形中选择我们前面创建的TCP_CONN_STATUS_Graph可以看到有图形生成,如下图所示:

zabbix media type 执行自定义shell脚本 zabbix脚本自定义监控_TCP_12

小知识:

在我们创建好模板后,可以选择将模板导出,方便我们分享和重复使用

在配置–>模板–>找到我们创建的模板–>勾选上模板–>点击导出

将导出的文件保存下来,就可以在其他主机上使用了,注意模板和agent的配置要保持一致

zabbix media type 执行自定义shell脚本 zabbix脚本自定义监控_自定义_13