Zabbix自定义key监控docker
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ‘BEGINprintf "%.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监控脚本
以上是关于Zabbix自定义key监控docker的主要内容,如果未能解决你的问题,请参考以下文章