Zabbix自定义key监控docker

一、需求场景
在某些docker容器中运行着java,容器提供API供监控调用。需要监控服务运行是否正常和容器内JVM使用情况。

二、想法
编写监控脚本,使用自定义key的方式添加到Zabbix中。

三、实践
1、编写服务监控脚本

#!/bin/bash
interval_time=600
service_port_file=/script/tmp/service_port.txt

#Gener_service_port
tee > ${service_port_file} << EOF
apigate=8603
config=8602
eureka=8601
file=8606
schedule=8677
service=8605
EOF

#Accept input
container_id=$($(which docker) ps|grep "$1"|awk ‘{print $1}‘)
service_name=$(echo $1 | awk -F ‘.‘ ‘{print $1}‘|awk -F ‘-‘ ‘{print $NF}‘)
service_port=$(grep ${service_name} ${service_port_file}|awk -F ‘=‘ ‘{print $NF}‘)

#Get created
created_time=$(docker inspect ${container_id} --format ‘{{.Created}}‘)
created_timestamp=$(date +%s -d ${created_time})
system_timestamp=$(date +%s)
interval=$((system_timestamp-created_timestamp))

#Get container version
container_version=$(docker exec ${container_id} [ -f "/etc/redhat-release" ] && grep -oE  "[0-9.]+" /etc/redhat-release|awk -F . ‘{print $1}‘ || echo 0)

#Get ip
docker_gwbridge=$(ifconfig docker_gwbridge|awk ‘NR==2‘|awk ‘{print $2}‘|awk -F . ‘{print $1"."$2"."$3}‘)
if [ ${container_version} -eq 7 ];then
    service_ip=$($(which docker) exec ${container_id} hostname -I | grep -o ${docker_gwbridge}.*|sed s/[[:space:]]//g)
else
    service_ip=$($(which docker) exec ${container_id} ifconfig | grep ${docker_gwbridge}|awk ‘{print $2}‘|awk -F ‘:‘ ‘{print $2}‘)
fi

#Get status_code
status_code=$(curl -I -m 10 -o /dev/null -s -w %{http_code} ${service_ip}:${service_port}/info)

#Return value
if [ ${status_code} -eq 200 ];then
    echo "1"
else
    if [ ${interval} -gt ${interval_time} ];then
        echo "0"
    else
        awk ‘BEGIN{printf "%.2f\n",(1-‘${interval}‘/‘${interval_time}‘)}‘
    fi
fi

说明:脚本接受容器名字作为参数,访问预先商议好对应服务的API。返回200则表示正常,将输出1。若返回0,则判断容器的创建时间,如果是创建时间小于约定的时间,说明容器是新生成的,返回对应代表进度的数值,否则返回0。

2、编写监控JVM的脚本

#!/bin/bash
pid=1

container_id=$($(which docker) ps|grep "$1"|awk ‘{print $1}‘)

function Survivor0 {
    $(which docker) exec ${container_id} jstat -gcutil ${pid} | awk ‘NR==2 {print $1}‘
}
function Survivor1 {
    $(which docker) exec ${container_id} jstat -gcutil ${pid} | awk ‘NR==2 {print $2}‘
}
function Eden {
    $(which docker) exec ${container_id} jstat -gcutil ${pid} | awk ‘NR==2 {print $3}‘
}
function Old {
    $(which docker) exec ${container_id} jstat -gcutil ${pid} | awk ‘NR==2 {print $4}‘
}
function Perm {
    $(which docker) exec ${container_id} jstat -gcutil ${pid} | awk ‘NR==2 {print $5}‘
}
function Metaspace {
    $(which docker) exec ${container_id} jstat -gcutil ${pid} | awk ‘NR==2 {print $5}‘
} 

"$2"

说明:脚本接受2个参数。第一个参数为容器名,第二个参数为监控项目名。

3、编写自动发现脚本

#!/bin/bash
key=cloud
#Get app_name
array=($($(which docker) ps |awk ‘{print $NF}‘|grep ${key}|awk -F ‘[_.]‘ ‘{print $2 "." $3}‘))

printf ‘[‘
for ((i=0;i<${#array[@]};i++))
do
        printf ‘{‘
        num=$(echo $((${#array[@]}-1)))
        if [ "$i" == ${num} ];
        then
                printf "\"{#APP_NAME}\":\"${array[$i]}\"}"
        else
                printf "\"{#APP_NAME}\":\"${array[$i]}\"},"
        fi
done
printf "]"

说明:以特定的关键字过滤需要监控的容器名字,按照规则输出json格式的字串。

4、在Agent的配置文件中加入自定义key

UserParameter=app.status[*],sudo /usr/bin/bash /script/appstatus.sh $1
UserParameter=docker.java[*],sudo /usr/bin/bash /script/dockerjava.sh $1 $2
UserParameter=app.discovery,sudo /usr/bin/bash /script/appdiscovery.sh

5、在Zabbix创建自动发现规则
(1)填写键值

(2)创建监控原型

(3)创建触发器

(4)创建图形原型

四、效果展示
1、服务监控脚本
(1)Zabbix

(2)Grafana

(3)说明
(1)在14:45分之前,服务正常运行(值为1)
(2)在14:46分时,关闭2个服务(值为0,触发报警),重启其他服务
(3)在14:47分左右,重启所有服务(随着时间的推移,数值逐渐减少)
(4)在14:53分左右,服务逐渐恢复。

2、JVM监控脚本

原文地址:https://blog.51cto.com/9473774/2411975

时间: 2024-08-03 20:54:46

Zabbix自定义key监控docker的相关文章

zabbix自定义KEY监控服务状态[不需要端口]

zabbix监控Windows下的服务并实现告警和重启服务 首先 创建获取服务状态的脚本 一.Windows脚本 @echo off set srvname=%1 for /f "skip=3 tokens=4" %%i in ('sc query %srvname%') do set "zt=%%i" &goto :next :next if /i "%zt%"=="RUNNING" ( :服务运行正常,返回1. e

zabbix 自定义key 监控mysql增删查改

1.先熟悉一下zabb自定义key的使用格式 vim /etc/zabbix/zabbix_agentd.d/mysql.conf##zabbix_agentd.d在这个文件夹下的.conf,都会被agent读取,我们这里新建的一个配置文件方便使用,这样就不需要去动主配置文件了 UserParameter=echo[*],echo "$1" #要传递参数要带[*],且key键必须全局唯一 UserParameter=ifconfig,ifconfig|awk NR==2'{print

zabbix 自定义key监控redis

一.环境 ubuntu 14.04 LTS zabbix 2.4.5 redis-2.8.7 二.配置redis监控 1.在/etc/zabbix/zabbix_agentd.d/目录下新建userparameter_redis.conf文件,添加以下内容: UserParameter=redis.stat[*],cat /tmp/redisstat | grep "$1:" | cut -d":" -f2 2.在/etc/crontab文件下添加以下内容 sudo

Zabbix 自定义 key 监控 apache

一.环境 Ubuntu14.04 LTS  zabbix 2.4.5  Apache/2.4.7 二.配置apache监控 1. 开启apache的server-status 添加下面的内容到apache的配置文件中 sudo vim /etc/apache2/apache2.conf <Location /server-status> SetHandler server-status Allow from 127.0.0.1 Order deny,allow Deny from all &l

zabbix自定义key监控mysql主从同步超简单!

1.在zabbix客户端配置文件中加入: 首先要对mysql提供一个查询主从状态的账号!(当然用root也可以.) UserParameter=mysql.replicate_error,if test `mysql -uxxx -pxxx -h127.0.0.1 -e 'show slave status\G' | awk -F: '{if($1~/Slave_IO_Running/) print$2}' ` = "Yes" -a `mysql -uxxx -pxxx -h127.0

zabbix 自定义key 监控 网站关键字

http://www.tuicool.com/articles/3Q7R3y http://www.tuicool.com/articles/fYjQ7j 监控磁盘 配置客户端 vim /usr/local/zabbix-2.2.2/etc/zabbix_agentd.conf Include=/usr/local/etc/zabbix_agentd.conf.d/ #此行去掉注释 编写脚本 vim /usr/local/zabbix-2.2.2/scripts/jfedu.sh #!/bin/

zabbix开源监控系列三(自定义key监控nginx_status)

需求场景 lnmp环境 3台nginx 每台nginx服务上有几个虚拟主机,分别跑了不同的域名,准备对主站做nginx status 状态做监控,监控每一台nginx的活动链接数,和总的连接数. 解决方案1 每台nginx server的主配置文件 都配置status模块  代码端如下 location /ngst{   stub_status on;   access_log off;   allow 127.0.0.1;   allow xxx.xxx.xxx.xxx;   deny all

zabbix 自定义 key (转)

转自:http://www.cnblogs.com/miclesvic/p/6164303.html 1.在zabbix_agent端zabbix_agentd.conf配置文件中增加自定义Key(/usr/local/zabbix_agent/etc/zabbix_agentd.conf) ### Option: UserParameter # User-defined parameter to monitor. There can be several user-defined parame

zabbix 自定义key值监控

1.zabbix一般监控使用zabbix即可,如果自定义的监控的话也是可以的,现看下zabbix.agentd.conf里面的介绍 UnsafeUserParameters 默认参数是0,0表示不启用UserParameter,1表示启用. 2. UserParameter=<key>,<shell command> 这个就是自定义监控的命令,key加上监控的选项,如下监控http的连接数 3.改完配置以后一定要重启下,之后再服务端测试下 这里可以看到有输出的,但是没访问所以很少