原创作品,允许转载,转载时请务必以超链接形式标明文章
原始出处 、作者信息和本声明。否则将追究法律责任。
http://dl528888.blog.51cto.com/2382721/1660844
1
|
easy_install docker-py
|
1
2
|
UserParameter=zabbix_low_discovery[*],
/bin/bash
/usr/local/zabbix/bin/zabbix_low_discovery
.sh $1
UserParameter=docker_stats[*],
sudo
/usr/local/zabbix/bin/zabbix_monitor_docker
.py $1 $2
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
[root@ip-10-10-125-8 bin]
# cat zabbix_monitor_docker.py
#!/usr/bin/env python
#-*- coding: utf-8 -*-
#author:Deng Lei
#email: dl528888@gmail.com
from docker
import
Client
import
os
import
re
import
sys
import
subprocess
import
time
def check_container_stats(container_name,collect_item):
container_collect=docker_client.stats(container_name)
old_result=
eval
(container_collect.next())
new_result=
eval
(container_collect.next())
container_collect.close()
if
collect_item ==
'cpu_total_usage'
:
result=new_result[
'cpu_stats'
][
'cpu_usage'
][
'total_usage'
] - old_result[
'cpu_stats'
][
'cpu_usage'
][
'total_usage'
]
elif
collect_item ==
'cpu_system_uasge'
:
result=new_result[
'cpu_stats'
][
'system_cpu_usage'
] - old_result[
'cpu_stats'
][
'system_cpu_usage'
]
elif
collect_item ==
'cpu_percent'
:
cpu_total_usage=new_result[
'cpu_stats'
][
'cpu_usage'
][
'total_usage'
] - old_result[
'cpu_stats'
][
'cpu_usage'
][
'total_usage'
]
cpu_system_uasge=new_result[
'cpu_stats'
][
'system_cpu_usage'
] - old_result[
'cpu_stats'
][
'system_cpu_usage'
]
cpu_num=len(old_result[
'cpu_stats'
][
'cpu_usage'
][
'percpu_usage'
])
result=round((float(cpu_total_usage)
/float
(cpu_system_uasge))*cpu_num*100.0,2)
elif
collect_item ==
'mem_usage'
:
result=new_result[
'memory_stats'
][
'usage'
]
elif
collect_item ==
'mem_limit'
:
result=new_result[
'memory_stats'
][
'limit'
]
elif
collect_item ==
'mem_percent'
:
mem_usage=new_result[
'memory_stats'
][
'usage'
]
mem_limit=new_result[
'memory_stats'
][
'limit'
]
result=round(float(mem_usage)
/float
(mem_limit)*100.0,2)
#network_rx_packets=new_result['network']['rx_packets']
#network_tx_packets=new_result['network']['tx_packets']
elif
collect_item ==
'network_rx_bytes'
:
network_check_command=
""
"docker exec %s ifconfig eth1|grep bytes|awk -F ':' '{print $2,$3}'|awk -F '(' '{print $1,$2}'|awk -F ')' '{print $1}'|awk '{print "
{\\
"rx\\"
:
"$1"
,\\
"tx\\"
:
"$2"
}
"}'"
""
%container_name
network_old_result=
eval
(((subprocess.Popen(network_check_command,shell=True,stdout=subprocess.PIPE)).stdout.readlines()[0]).strip(
'\n'
))
time
.
sleep
(1)
network_new_result=
eval
(((subprocess.Popen(network_check_command,shell=True,stdout=subprocess.PIPE)).stdout.readlines()[0]).strip(
'\n'
))
#unit KB
result=int(network_new_result[
'rx'
]) - int(network_old_result[
'rx'
])
elif
collect_item ==
'network_tx_bytes'
:
network_check_command=
""
"docker exec %s ifconfig eth1|grep bytes|awk -F ':' '{print $2,$3}'|awk -F '(' '{print $1,$2}'|awk -F ')' '{print $1}'|awk '{print "
{\\
"rx\\"
:
"$1"
,\\
"tx\\"
:
"$2"
}
"}'"
""
%container_name
network_old_result=
eval
(((subprocess.Popen(network_check_command,shell=True,stdout=subprocess.PIPE)).stdout.readlines()[0]).strip(
'\n'
))
time
.
sleep
(1)
network_new_result=
eval
(((subprocess.Popen(network_check_command,shell=True,stdout=subprocess.PIPE)).stdout.readlines()[0]).strip(
'\n'
))
result=int(network_new_result[
'tx'
]) - int(network_old_result[
'tx'
])
return
result
if
__name__ ==
"__main__"
:
docker_client = Client(base_url=
'unix://var/run/docker.sock'
, version=
'1.17'
)
container_name=sys.argv[1]
collect_item=sys.argv[2]
print check_container_stats(container_name,collect_item)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
[root@ip-10-10-125-6 ~]
# sh /usr/local/zabbix/bin/zabbix_low_discovery.sh docker
{
"data"
:[
{
"{#CONTAINERNAME}"
:
"nodeA"
},
{
"{#CONTAINERNAME}"
:
"xiaotg-mesos.5"
},
{
"{#CONTAINERNAME}"
:
"xiaotg-mesos.4"
},
{
"{#CONTAINERNAME}"
:
"xiaotg-mesos.3"
},
{
"{#CONTAINERNAME}"
:
"xiaotg-mesos.2"
},
{
"{#CONTAINERNAME}"
:
"xiaotg-mesos.1"
},
{
"{#CONTAINERNAME}"
:
"xiaotg-mesos.0"
},
{
"{#CONTAINERNAME}"
:
"ulimit_test.1"
},
{
"{#CONTAINERNAME}"
:
"ulimit_test.0"
}
]
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
[root@ip-10-10-125-6 tmp]
# cat zabbix_low_discovery.sh
#!/bin/bash
#Fucation:zabbix low-level discovery
docker() {
port=($(
sudo
docker
ps
-a|
grep
-
v
"CONTAINER ID"
|
awk
'{print $NF}'
))
printf
'{\n'
printf
'\t"data":[\n'
for
key
in
${!port[@]}
do
if
[[
"${#port[@]}"
-gt 1 &&
"${key}"
-
ne
"$((${#port[@]}-1))"
]];
then
printf
'\t {\n'
printf
"\t\t\t\"{#CONTAINERNAME}\":\"${port[${key}]}\"},\n"
else
[[
"${key}"
-
eq
"((${#port[@]}-1))"
]]
printf
'\t {\n'
printf
"\t\t\t\"{#CONTAINERNAME}\":\"${port[${key}]}\"}\n"
fi
done
printf
'\t ]\n'
printf
'}\n'
}
case
$1
in
docker)
docker
;;
*)
echo
"Usage:`basename $0` {docker}"
;;
esac
|
1
|
echo
"zabbix ALL=(root) NOPASSWD:/bin/docker, /usr/local/zabbix/bin/zabbix_monitor_docker.py"
>>
/etc/sudoers
|
1
2
|
ps
-ef|
grep
zabbix|
grep
-
v
grep
|
awk
'{print $2}'
|
xargs
kill
-9
/usr/local/zabbix/sbin/zabbix_agentd
-c
/usr/local/zabbix/conf/zabbix_agentd
.conf
|