zabbix监控docker容器

1、环境说明

由于最近zabbix进行过一次迁移,所以zabbix-server系列采用docker方式安装,参考zabbix官网:https://github.com/zabbix/zabbix-docker。为适应本地环境和需求,docker-compose.yml文件有改动,具体内容如下:

docker-compose.yml文件

version: '3.5'
services:zabbix-server:image: zabbix/zabbix-server-mysql:centos-4.2-latestports:- "10051:10051"volumes:- /etc/localtime:/etc/localtime:ro- /etc/timezone:/etc/timezone:ro - ./zbx_env/usr/lib/zabbix/alertscripts:/usr/lib/zabbix/alertscripts:ro- ./zbx_env/usr/lib/zabbix/externalscripts:/usr/lib/zabbix/externalscripts:ro- ./zbx_env/var/lib/zabbix/modules:/var/lib/zabbix/modules:ro- ./zbx_env/var/lib/zabbix/enc:/var/lib/zabbix/enc:ro- ./zbx_env/var/lib/zabbix/ssh_keys:/var/lib/zabbix/ssh_keys:ro- ./zbx_env/var/lib/zabbix/mibs:/var/lib/zabbix/mibs:rolinks:- mysql-server:mysql-servercontainer_name: zabbix-serverrestart: unless-stoppedulimits:nproc: 65535nofile:soft: 20000hard: 40000env_file:- .env_db_mysql- .env_srvsecrets:- MYSQL_USER- MYSQL_PASSWORD- MYSQL_ROOT_PASSWORDuser: rootdepends_on:- mysql-serverstop_grace_period: 30ssysctls:- net.ipv4.ip_local_port_range=1024 65000- net.ipv4.conf.all.accept_redirects=0- net.ipv4.conf.all.secure_redirects=0- net.ipv4.conf.all.send_redirects=0zabbix-web-nginx-mysql:image: zabbix/zabbix-web-nginx-mysql:centos-4.2-latestports:- "8081:80"- "8443:443"links:- mysql-server:mysql-server- zabbix-server:zabbix-servercontainer_name: zabbix-web-nginx-mysqlrestart: unless-stoppedvolumes:- /etc/localtime:/etc/localtime:ro- /etc/timezone:/etc/timezone:ro- ./zbx_env/etc/ssl/nginx:/etc/ssl/nginx:roenv_file:- .env_db_mysql- .env_websecrets:- MYSQL_USER- MYSQL_PASSWORDuser: rootdepends_on:- mysql-server- zabbix-serverhealthcheck:test: ["CMD", "curl", "-f", "http://localhost"]interval: 10stimeout: 5sretries: 3start_period: 30sstop_grace_period: 10ssysctls:- net.core.somaxconn=65535zabbix-agent:image: zabbix/zabbix-agent:centos-4.2-latestports:- "10050:10050"volumes:- /etc/localtime:/etc/localtime:ro- /etc/timezone:/etc/timezone:ro- ./zbx_env/etc/zabbix/zabbix_agentd.d:/etc/zabbix/zabbix_agentd.d:ro- ./zbx_env/usr/lib/zabbix/alertscripts:/usr/lib/zabbix/alertscripts:ro- ./zbx_env/usr/lib/zabbix/externalscripts:/usr/lib/zabbix/externalscripts:ro- ./zbx_env/var/lib/zabbix/modules:/var/lib/zabbix/modules:ro- ./zbx_env/var/lib/zabbix/enc:/var/lib/zabbix/enc:ro- ./zbx_env/var/lib/zabbix/ssh_keys:/var/lib/zabbix/ssh_keys:rolinks:- zabbix-server:zabbix-serverrestart: unless-stoppedcontainer_name: zabbix-agentenv_file:- .env_agentuser: rootprivileged: truepid: "host"stop_grace_period: 5smysql-server:image: mysql:8.0ports:- "33060:3306"command: [mysqld, --character-set-server=utf8, --collation-server=utf8_bin, --default-authentication-plugin=mysql_native_password]volumes:- ./zbx_env/var/lib/mysql:/var/lib/mysql:rwrestart: unless-stoppedcontainer_name: mysql-serverenv_file:- .env_db_mysqlsecrets:- MYSQL_USER- MYSQL_PASSWORD- MYSQL_ROOT_PASSWORDuser: rootstop_grace_period: 1msecrets:MYSQL_USER:file: ./.MYSQL_USERMYSQL_PASSWORD:file: ./.MYSQL_PASSWORDMYSQL_ROOT_PASSWORD:file: ./.MYSQL_ROOT_PASSWORD
View Code

2、zabbix添加自定义监控

(1)zabbix_server.conf配置

#脚本路径
AlertScriptsPath=/usr/lib/zabbix/alertscripts ExternalScripts=/usr/lib/zabbix/externalscripts

(2)zabbix_agent.conf配置

##允许使用用户自定义参数
UnsafeUserParameters=1
##导入该文件下的配置
Include=/etc/zabbix/zabbix_agentd.d/*.conf

(3)自定义监控脚本

/usr/lib/zabbix/externalscripts/docker_discovery.py,搜集正在运行的容器的名称

#!/usr/bin/env python
# -*- coding: utf-8 -*
import os
import simplejson as json
t=os.popen("""docker ps |grep -v 'CONTAINER ID'|awk {'print $NF'} """)
container_name = []
for container in t.readlines():r = os.path.basename(container.strip())container_name += [{'{#CONTAINERNAME}':r}]
print(json.dumps({'data':container_name},sort_keys=True,indent=4,separators=(',',':')))
View Code

安装python3 所需要的包

pip3 install simplejson

docker_discovery.py执行结果

python3 docker_discovery.py
{"data":[{"{#CONTAINERNAME}":"nginx"},{"{#CONTAINERNAME}":"fortune"}]
}
View Code

/usr/lib/zabbix/externalscripts/docker_monitor.py,输入容器名称以及监控项,输出数据

#!/usr/bin/env python
import docker
import sys
import subprocess
import osdef check_container_stats(container_name,collect_item):if collect_item == "ping":cmd = 'docker inspect --format="{{.State.Running}}" %s' % container_nameresult = os.popen(cmd).read().replace("\n","")if result == "true":return 1else:return 0#:docker_client = docker_client.containers.get(container_name)container_collect=docker_client.containers.get(container_name).stats(stream=True)old_result=eval(next(container_collect))new_result=eval(next(container_collect))print(new_result)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_usage':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 == 'network_rx_bytes':result=new_result['networks']['eth0']['rx_bytes']elif collect_item == 'network_tx_bytes':result=new_result['networks']['eth0']['tx_bytes']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)return result
if __name__ == "__main__":docker_client = docker.DockerClient(base_url='unix://var/run/docker.sock')container_name=sys.argv[1]collect_item=sys.argv[2]print(check_container_stats(container_name,collect_item)
View Code

安装python3依赖的包

pip3 install docker

docker_monitor.py执行结果

python3 docker_monitor.py nginx mem_percent
0.49
View Code

(4)脚本赋执行权限

chmod +x docker_discovery.py
chmod +x docker_monitor.py

(5)自定义监控配置文件

/etc/zabbix/zabbix_agentd.d/docker_discovery.conf 
UserParameter=docker_discovery,/usr/bin/python3 /usr/lib/zabbix/externalscripts/docker_discovery.py
UserParameter=docker_status[*],/usr/bin/python3 /usr/lib/zabbix/externalscripts/docker_monitor.py $1 $2

 (6)导入模板

<?xml version="1.0" encoding="UTF-8"?>
<zabbix_export><version>4.2</version><date>2019-09-27T06:35:12Z</date><groups><group><name>Templates</name></group></groups><templates><template><template>Template Discovery Docker</template><name>Template Discovery Docker</name><description/><groups><group><name>Templates</name></group></groups><applications/><items/><discovery_rules><discovery_rule><name>collect docker container use resource</name><type>0</type><snmp_community/><snmp_oid/><key>docker_discovery</key><delay>30s</delay><status>0</status><allowed_hosts/><snmpv3_contextname/><snmpv3_securityname/><snmpv3_securitylevel>0</snmpv3_securitylevel><snmpv3_authprotocol>0</snmpv3_authprotocol><snmpv3_authpassphrase/><snmpv3_privprotocol>0</snmpv3_privprotocol><snmpv3_privpassphrase/><params/><ipmi_sensor/><authtype>0</authtype><username/><password/><publickey/><privatekey/><port/><filter><evaltype>0</evaltype><formula/><conditions><condition><macro>{#CONTAINERNAME}</macro><value/><operator>8</operator><formulaid>A</formulaid></condition></conditions></filter><lifetime>30d</lifetime><description/><item_prototypes><item_prototype><name>docker:{#CONTAINERNAME}:cpu_percent</name><type>0</type><snmp_community/><snmp_oid/><key>docker_status[{#CONTAINERNAME},cpu_percent]</key><delay>30s</delay><history>90d</history><trends>365d</trends><status>0</status><value_type>0</value_type><allowed_hosts/><units>%</units><snmpv3_contextname/><snmpv3_securityname/><snmpv3_securitylevel>0</snmpv3_securitylevel><snmpv3_authprotocol>0</snmpv3_authprotocol><snmpv3_authpassphrase/><snmpv3_privprotocol>0</snmpv3_privprotocol><snmpv3_privpassphrase/><params/><ipmi_sensor/><authtype>0</authtype><username/><password/><publickey/><privatekey/><port/><description/><inventory_link>0</inventory_link><applications/><valuemap/><logtimefmt/><preprocessing/><jmx_endpoint/><timeout>3s</timeout><url/><query_fields/><posts/><status_codes>200</status_codes><follow_redirects>1</follow_redirects><post_type>0</post_type><http_proxy/><headers/><retrieve_mode>0</retrieve_mode><request_method>0</request_method><output_format>0</output_format><allow_traps>0</allow_traps><ssl_cert_file/><ssl_key_file/><ssl_key_password/><verify_peer>0</verify_peer><verify_host>0</verify_host><application_prototypes/><master_item/></item_prototype><item_prototype><name>docker:{#CONTAINERNAME}:cpu_total_usage</name><type>0</type><snmp_community/><snmp_oid/><key>docker_status[{#CONTAINERNAME},cpu_total_usage]</key><delay>30s</delay><history>90d</history><trends>365d</trends><status>0</status><value_type>3</value_type><allowed_hosts/><units/><snmpv3_contextname/><snmpv3_securityname/><snmpv3_securitylevel>0</snmpv3_securitylevel><snmpv3_authprotocol>0</snmpv3_authprotocol><snmpv3_authpassphrase/><snmpv3_privprotocol>0</snmpv3_privprotocol><snmpv3_privpassphrase/><params/><ipmi_sensor/><authtype>0</authtype><username/><password/><publickey/><privatekey/><port/><description/><inventory_link>0</inventory_link><applications/><valuemap/><logtimefmt/><preprocessing/><jmx_endpoint/><timeout>3s</timeout><url/><query_fields/><posts/><status_codes>200</status_codes><follow_redirects>1</follow_redirects><post_type>0</post_type><http_proxy/><headers/><retrieve_mode>0</retrieve_mode><request_method>0</request_method><output_format>0</output_format><allow_traps>0</allow_traps><ssl_cert_file/><ssl_key_file/><ssl_key_password/><verify_peer>0</verify_peer><verify_host>0</verify_host><application_prototypes/><master_item/></item_prototype><item_prototype><name>docker:{#CONTAINERNAME}:men_percent</name><type>0</type><snmp_community/><snmp_oid/><key>docker_status[{#CONTAINERNAME},mem_percent]</key><delay>30s</delay><history>90d</history><trends>365d</trends><status>0</status><value_type>0</value_type><allowed_hosts/><units>%</units><snmpv3_contextname/><snmpv3_securityname/><snmpv3_securitylevel>0</snmpv3_securitylevel><snmpv3_authprotocol>0</snmpv3_authprotocol><snmpv3_authpassphrase/><snmpv3_privprotocol>0</snmpv3_privprotocol><snmpv3_privpassphrase/><params/><ipmi_sensor/><authtype>0</authtype><username/><password/><publickey/><privatekey/><port/><description/><inventory_link>0</inventory_link><applications/><valuemap/><logtimefmt/><preprocessing/><jmx_endpoint/><timeout>3s</timeout><url/><query_fields/><posts/><status_codes>200</status_codes><follow_redirects>1</follow_redirects><post_type>0</post_type><http_proxy/><headers/><retrieve_mode>0</retrieve_mode><request_method>0</request_method><output_format>0</output_format><allow_traps>0</allow_traps><ssl_cert_file/><ssl_key_file/><ssl_key_password/><verify_peer>0</verify_peer><verify_host>0</verify_host><application_prototypes/><master_item/></item_prototype><item_prototype><name>docker:{#CONTAINERNAME}:men_usage</name><type>0</type><snmp_community/><snmp_oid/><key>docker_status[{#CONTAINERNAME},mem_usage]</key><delay>30s</delay><history>90d</history><trends>365d</trends><status>0</status><value_type>0</value_type><allowed_hosts/><units>%</units><snmpv3_contextname/><snmpv3_securityname/><snmpv3_securitylevel>0</snmpv3_securitylevel><snmpv3_authprotocol>0</snmpv3_authprotocol><snmpv3_authpassphrase/><snmpv3_privprotocol>0</snmpv3_privprotocol><snmpv3_privpassphrase/><params/><ipmi_sensor/><authtype>0</authtype><username/><password/><publickey/><privatekey/><port/><description/><inventory_link>0</inventory_link><applications/><valuemap/><logtimefmt/><preprocessing/><jmx_endpoint/><timeout>3s</timeout><url/><query_fields/><posts/><status_codes>200</status_codes><follow_redirects>1</follow_redirects><post_type>0</post_type><http_proxy/><headers/><retrieve_mode>0</retrieve_mode><request_method>0</request_method><output_format>0</output_format><allow_traps>0</allow_traps><ssl_cert_file/><ssl_key_file/><ssl_key_password/><verify_peer>0</verify_peer><verify_host>0</verify_host><application_prototypes/><master_item/></item_prototype><item_prototype><name>docker:{#CONTAINERNAME}:network_rx_bytes</name><type>0</type><snmp_community/><snmp_oid/><key>docker_status[{#CONTAINERNAME},network_rx_bytes]</key><delay>30s</delay><history>90d</history><trends>365d</trends><status>0</status><value_type>0</value_type><allowed_hosts/><units>%</units><snmpv3_contextname/><snmpv3_securityname/><snmpv3_securitylevel>0</snmpv3_securitylevel><snmpv3_authprotocol>0</snmpv3_authprotocol><snmpv3_authpassphrase/><snmpv3_privprotocol>0</snmpv3_privprotocol><snmpv3_privpassphrase/><params/><ipmi_sensor/><authtype>0</authtype><username/><password/><publickey/><privatekey/><port/><description/><inventory_link>0</inventory_link><applications/><valuemap/><logtimefmt/><preprocessing/><jmx_endpoint/><timeout>3s</timeout><url/><query_fields/><posts/><status_codes>200</status_codes><follow_redirects>1</follow_redirects><post_type>0</post_type><http_proxy/><headers/><retrieve_mode>0</retrieve_mode><request_method>0</request_method><output_format>0</output_format><allow_traps>0</allow_traps><ssl_cert_file/><ssl_key_file/><ssl_key_password/><verify_peer>0</verify_peer><verify_host>0</verify_host><application_prototypes/><master_item/></item_prototype><item_prototype><name>docker:{#CONTAINERNAME}:network_tx_bytes</name><type>0</type><snmp_community/><snmp_oid/><key>docker_status[{#CONTAINERNAME},network_tx_bytes]</key><delay>30s</delay><history>90d</history><trends>365d</trends><status>0</status><value_type>0</value_type><allowed_hosts/><units>%</units><snmpv3_contextname/><snmpv3_securityname/><snmpv3_securitylevel>0</snmpv3_securitylevel><snmpv3_authprotocol>0</snmpv3_authprotocol><snmpv3_authpassphrase/><snmpv3_privprotocol>0</snmpv3_privprotocol><snmpv3_privpassphrase/><params/><ipmi_sensor/><authtype>0</authtype><username/><password/><publickey/><privatekey/><port/><description/><inventory_link>0</inventory_link><applications/><valuemap/><logtimefmt/><preprocessing/><jmx_endpoint/><timeout>3s</timeout><url/><query_fields/><posts/><status_codes>200</status_codes><follow_redirects>1</follow_redirects><post_type>0</post_type><http_proxy/><headers/><retrieve_mode>0</retrieve_mode><request_method>0</request_method><output_format>0</output_format><allow_traps>0</allow_traps><ssl_cert_file/><ssl_key_file/><ssl_key_password/><verify_peer>0</verify_peer><verify_host>0</verify_host><application_prototypes/><master_item/></item_prototype><item_prototype><name>docker:{#CONTAINERNAME}:is run</name><type>0</type><snmp_community/><snmp_oid/><key>docker_status[{#CONTAINERNAME},ping]</key><delay>30s</delay><history>90d</history><trends>365d</trends><status>0</status><value_type>0</value_type><allowed_hosts/><units>%</units><snmpv3_contextname/><snmpv3_securityname/><snmpv3_securitylevel>0</snmpv3_securitylevel><snmpv3_authprotocol>0</snmpv3_authprotocol><snmpv3_authpassphrase/><snmpv3_privprotocol>0</snmpv3_privprotocol><snmpv3_privpassphrase/><params/><ipmi_sensor/><authtype>0</authtype><username/><password/><publickey/><privatekey/><port/><description/><inventory_link>0</inventory_link><applications/><valuemap/><logtimefmt/><preprocessing/><jmx_endpoint/><timeout>3s</timeout><url/><query_fields/><posts/><status_codes>200</status_codes><follow_redirects>1</follow_redirects><post_type>0</post_type><http_proxy/><headers/><retrieve_mode>0</retrieve_mode><request_method>0</request_method><output_format>0</output_format><allow_traps>0</allow_traps><ssl_cert_file/><ssl_key_file/><ssl_key_password/><verify_peer>0</verify_peer><verify_host>0</verify_host><application_prototypes/><master_item/></item_prototype><item_prototype><name>docker:{#CONTAINERNAME}:cpu_system_usage</name><type>0</type><snmp_community/><snmp_oid/><key>docker_status[{#CONTAINERNAME},system_cpu_usage]</key><delay>30s</delay><history>90d</history><trends>365d</trends><status>0</status><value_type>0</value_type><allowed_hosts/><units>%</units><snmpv3_contextname/><snmpv3_securityname/><snmpv3_securitylevel>0</snmpv3_securitylevel><snmpv3_authprotocol>0</snmpv3_authprotocol><snmpv3_authpassphrase/><snmpv3_privprotocol>0</snmpv3_privprotocol><snmpv3_privpassphrase/><params/><ipmi_sensor/><authtype>0</authtype><username/><password/><publickey/><privatekey/><port/><description/><inventory_link>0</inventory_link><applications/><valuemap/><logtimefmt/><preprocessing/><jmx_endpoint/><timeout>3s</timeout><url/><query_fields/><posts/><status_codes>200</status_codes><follow_redirects>1</follow_redirects><post_type>0</post_type><http_proxy/><headers/><retrieve_mode>0</retrieve_mode><request_method>0</request_method><output_format>0</output_format><allow_traps>0</allow_traps><ssl_cert_file/><ssl_key_file/><ssl_key_password/><verify_peer>0</verify_peer><verify_host>0</verify_host><application_prototypes/><master_item/></item_prototype></item_prototypes><trigger_prototypes/><graph_prototypes><graph_prototype><name>docker:{#CONTAINERNAME}:cpu</name><width>900</width><height>200</height><yaxismin>0.0000</yaxismin><yaxismax>100.0000</yaxismax><show_work_period>1</show_work_period><show_triggers>1</show_triggers><type>0</type><show_legend>1</show_legend><show_3d>0</show_3d><percent_left>0.0000</percent_left><percent_right>0.0000</percent_right><ymin_type_1>0</ymin_type_1><ymax_type_1>0</ymax_type_1><ymin_item_1>0</ymin_item_1><ymax_item_1>0</ymax_item_1><graph_items><graph_item><sortorder>0</sortorder><drawtype>0</drawtype><color>1A7C11</color><yaxisside>0</yaxisside><calc_fnc>2</calc_fnc><type>0</type><item><host>Template Discovery Docker</host><key>docker_status[{#CONTAINERNAME},cpu_percent]</key></item></graph_item><graph_item><sortorder>1</sortorder><drawtype>0</drawtype><color>F63100</color><yaxisside>0</yaxisside><calc_fnc>2</calc_fnc><type>0</type><item><host>Template Discovery Docker</host><key>docker_status[{#CONTAINERNAME},system_cpu_usage]</key></item></graph_item><graph_item><sortorder>2</sortorder><drawtype>0</drawtype><color>2774A4</color><yaxisside>0</yaxisside><calc_fnc>2</calc_fnc><type>0</type><item><host>Template Discovery Docker</host><key>docker_status[{#CONTAINERNAME},cpu_total_usage]</key></item></graph_item></graph_items></graph_prototype><graph_prototype><name>docker:{#CONTAINERNAME}:menory</name><width>900</width><height>200</height><yaxismin>0.0000</yaxismin><yaxismax>100.0000</yaxismax><show_work_period>1</show_work_period><show_triggers>1</show_triggers><type>0</type><show_legend>1</show_legend><show_3d>0</show_3d><percent_left>0.0000</percent_left><percent_right>0.0000</percent_right><ymin_type_1>0</ymin_type_1><ymax_type_1>0</ymax_type_1><ymin_item_1>0</ymin_item_1><ymax_item_1>0</ymax_item_1><graph_items><graph_item><sortorder>0</sortorder><drawtype>0</drawtype><color>1A7C11</color><yaxisside>0</yaxisside><calc_fnc>2</calc_fnc><type>0</type><item><host>Template Discovery Docker</host><key>docker_status[{#CONTAINERNAME},mem_percent]</key></item></graph_item><graph_item><sortorder>1</sortorder><drawtype>0</drawtype><color>F63100</color><yaxisside>0</yaxisside><calc_fnc>2</calc_fnc><type>0</type><item><host>Template Discovery Docker</host><key>docker_status[{#CONTAINERNAME},mem_usage]</key></item></graph_item></graph_items></graph_prototype><graph_prototype><name>docker:{#CONTAINERNAME}:network</name><width>900</width><height>200</height><yaxismin>0.0000</yaxismin><yaxismax>100.0000</yaxismax><show_work_period>1</show_work_period><show_triggers>1</show_triggers><type>0</type><show_legend>1</show_legend><show_3d>0</show_3d><percent_left>0.0000</percent_left><percent_right>0.0000</percent_right><ymin_type_1>0</ymin_type_1><ymax_type_1>0</ymax_type_1><ymin_item_1>0</ymin_item_1><ymax_item_1>0</ymax_item_1><graph_items><graph_item><sortorder>0</sortorder><drawtype>0</drawtype><color>1A7C11</color><yaxisside>0</yaxisside><calc_fnc>2</calc_fnc><type>0</type><item><host>Template Discovery Docker</host><key>docker_status[{#CONTAINERNAME},network_rx_bytes]</key></item></graph_item><graph_item><sortorder>1</sortorder><drawtype>0</drawtype><color>F63100</color><yaxisside>0</yaxisside><calc_fnc>2</calc_fnc><type>0</type><item><host>Template Discovery Docker</host><key>docker_status[{#CONTAINERNAME},network_tx_bytes]</key></item></graph_item></graph_items></graph_prototype></graph_prototypes><host_prototypes/><jmx_endpoint/><timeout>3s</timeout><url/><query_fields/><posts/><status_codes>200</status_codes><follow_redirects>1</follow_redirects><post_type>0</post_type><http_proxy/><headers/><retrieve_mode>0</retrieve_mode><request_method>0</request_method><allow_traps>0</allow_traps><ssl_cert_file/><ssl_key_file/><ssl_key_password/><verify_peer>0</verify_peer><verify_host>0</verify_host><lld_macro_paths/><preprocessing/><master_item/></discovery_rule></discovery_rules><httptests/><macros/><templates/><screens/><tags/></template></templates>
</zabbix_export>
View Code

模板导入成功后,查看监控项是否可用,注意客户端版本是否和文章一致,这里的zabbix所有版本均为4.2,若有问题可留言讨论。

3、问题整理

由于原本客户端python是2.7版本,在执行docker_monitor.py时有如下报错,后来知道是python版本问题,升级python3以后执行成功。

# python docker_monitor.py
Traceback (most recent call last):File "docker_monitor.py", line 36, in
<module>docker_client = docker.DockerClient(base_url='unix://var/run/docker.sock') AttributeError: 'module' object has no attribute 'DockerClient'

(1)python2升级步骤

#安装python3.6
yum -y install epel-release
yum install https://centos7.iuscommunity.org/ius-release.rpm ##安装centos7的ius源
yum install python36u -y ln -s /usr/bin/python3.6 /bin/python3 #安装pip3 yum install python36u-pip -y ln -s /usr/bin/pip3.6 /bin/pip3 pip3 install --upgrade pip ##有些情况安装完python3之后就不需要再安装pip3

(2)升级python3后,simplejson和docker-py需要重装

pip3 install simplejson
#docker-py最新版改名为docker
pip3 install docker

(3)zabbix-serve端测试时报错

zabbix_get -s 10.8.0.22 -p 10050 -k  docker_status[reids,cpu_percent]
Traceback (most recent call last):File "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 672, in urlopenchunked=chunked,File "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 387, in _make_requestconn.request(method, url, **httplib_request_kw)File "/usr/lib64/python3.6/http/client.py", line 1254, in requestself._send_request(method, url, body, headers, encode_chunked)File "/usr/lib64/python3.6/http/client.py", line 1300, in _send_requestself.endheaders(body, encode_chunked=encode_chunked)File "/usr/lib64/python3.6/http/client.py", line 1249, in endheadersself._send_output(message_body, encode_chunked=encode_chunked)File "/usr/lib64/python3.6/http/client.py", line 1036, in _send_outputself.send(msg)File "/usr/lib64/python3.6/http/client.py", line 974, in sendself.connect()File "/usr/local/lib/python3.6/site-packages/docker/transport/unixconn.py", line 43, in connectsock.connect(self.unix_socket)
PermissionError: [Errno 13] Permission deniedDuring handling of the above exception, another exception occurred:Traceback (most recent call last):File "/usr/local/lib/python3.6/site-packages/requests/adapters.py", line 449, in sendtimeout=timeoutFile "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 720, in urlopenmethod, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]File "/usr/local/lib/python3.6/site-packages/urllib3/util/retry.py", line 400, in incrementraise six.reraise(type(error), error, _stacktrace)File "/usr/local/lib/python3.6/site-packages/urllib3/packages/six.py", line 734, in reraiseraise value.with_traceback(tb)File "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 672, in urlopenchunked=chunked,File "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py", line 387, in _make_requestconn.request(method, url, **httplib_request_kw)File "/usr/lib64/python3.6/http/client.py", line 1254, in requestself._send_request(method, url, body, headers, encode_chunked)File "/usr/lib64/python3.6/http/client.py", line 1300, in _send_requestself.endheaders(body, encode_chunked=encode_chunked)File "/usr/lib64/python3.6/http/client.py", line 1249, in endheadersself._send_output(message_body, encode_chunked=encode_chunked)File "/usr/lib64/python3.6/http/client.py", line 1036, in _send_outputself.send(msg)File "/usr/lib64/python3.6/http/client.py", line 974, in sendself.connect()File "/usr/local/lib/python3.6/site-packages/docker/transport/unixconn.py", line 43, in connectsock.connect(self.unix_socket)
urllib3.exceptions.ProtocolError: ('Connection aborted.', PermissionError(13, 'Permission denied'))During handling of the above exception, another exception occurred:Traceback (most recent call last):File "/usr/lib/zabbix/externalscripts/docker_monitor.py", line 39, in <module>print(check_container_stats(container_name,collect_item))File "/usr/lib/zabbix/externalscripts/docker_monitor.py", line 9, in check_container_statscontainer_collect=docker_client.containers.get(container_name).stats(stream=True)File "/usr/local/lib/python3.6/site-packages/docker/models/containers.py", line 880, in getresp = self.client.api.inspect_container(container_id)File "/usr/local/lib/python3.6/site-packages/docker/utils/decorators.py", line 19, in wrappedreturn f(self, resource_id, *args, **kwargs)File "/usr/local/lib/python3.6/site-packages/docker/api/container.py", line 756, in inspect_containerself._get(self._url("/containers/{0}/json", container)), TrueFile "/usr/local/lib/python3.6/site-packages/docker/utils/decorators.py", line 46, in innerreturn f(self, *args, **kwargs)File "/usr/local/lib/python3.6/site-packages/docker/api/client.py", line 230, in _getreturn self.get(url, **self._set_request_timeout(kwargs))File "/usr/local/lib/python3.6/site-packages/requests/sessions.py", line 546, in getreturn self.request('GET', url, **kwargs)File "/usr/local/lib/python3.6/site-packages/requests/sessions.py", line 533, in requestresp = self.send(prep, **send_kwargs)File "/usr/local/lib/python3.6/site-packages/requests/sessions.py", line 646, in sendr = adapter.send(request, **kwargs)File "/usr/local/lib/python3.6/site-packages/requests/adapters.py", line 498, in sendraise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', PermissionError(13, 'Permission denied'))
View Code

从错误可以看出是权限问题,解决办法:

#查看docker.sock用户权限
ls /var/run/docker.sock -lh
srw-rw---- 1 root docker 0 9月   2 17:04 /var/run/docker.sock
#将zabbix用户加入docker所在组
gpasswd -a zabbix docker

zabbix_get测试连接

 zabbix_get -s 10.8.0.22 -p 10050 -k  docker_status[redis,mem_percent]
0.3

以上所有内容均为亲自测试成功后才写的,那些踩的最深的坑都已经都修改,大可放心使用。

 

转载于:https://www.cnblogs.com/wanghongli/p/11598121.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全角半角转换

#region 全角半角转换 /// <summary> /// 转全角的函数(SBC case) /// </summary> /// <param name"input">任意字符串</param> /// <returns>全角字符串</returns> ///<remarks> ///全角空格为12288&#xff0c;半角空格…

jquery中的left和top

left 和 top /*1. 获取元素基于定位容器的位置*//*返回的是对象 属性 left top */var position $(.inner).position();console.log(position.left);console.log(position.top);/*2. 获取元素基于页面容器的位置 基于页面的偏移*/var offset $(.inner).offset();console.l…

让我们用jOOλ在Java 8中流式传输地图

我想找到一种简单的方法来用Java 8流式传输Map 。猜猜是什么&#xff1f; 没有&#xff01; 为了方便起见&#xff0c;我期望的是以下方法&#xff1a; public interface Map<K, V> {default Stream<Entry<K, V>> stream() {return entrySet().stream();} …

双向链表的快速排序

#include <stdio.h> #include <stdlib.h> #include <time.h> //定义类型 所有的排序例子中都是用的int作为data typedef int elemType; //返回值 #define RET_SUCCESS ( 1 ) #define RET_FAILED ( 0 ) //定义链表的长度 #define LIST_MAX_SIZ…

Hibernate应用程序级可重复读取

介绍 在我以前的文章中&#xff0c;我描述了应用程序级事务如何为长时间的对话提供合适的并发控制机制。 所有实体都在Hibernate会话的上下文中加载&#xff0c;充当事务后写式缓存 。 Hibernate持久性上下文可以包含给定实体的一个引用和一个引用。 一级缓存可确保会话级可重…

HDU-2732 Leapin' Lizards 最大流

题目意思是有一些蜥蜴在一个迷宫里面&#xff0c;求这些蜥蜴还有多少是无论如何都逃不出来的。题目只给定一个行数&#xff0c;一个最远能够跳跃的距离&#xff0c;列数是不确定的&#xff08;题目告知列数小于等于20&#xff09;&#xff0c;但是数据一定会是一个矩阵。每只蜥…

canvas动画简单操作

canvas动画 小球滚动效果 关键api&#xff1a; window.requestAnimationFrame(draw) 会递归调用draw函数&#xff0c;替代setIntervalvar x 20; var speed 4; //电脑的帧率是1秒钟60Hz&#xff0c; 就相当于一秒钟可以播放60张图片&#xff0c;就相当于播放一张图片使用16.…

编译相关

编译的过程 &#xff1a; 1. 词法分析&#xff0c;程序被扫描成&#xff1a;关键字&#xff0c;标识符&#xff0c;字面量和特殊符号这些记号。 2. 语法分析&#xff0c;对记号进行语法分析产生语法树。&#xff08;代码最终由表达式组合&#xff09; 3. 语义分析&#xff0c;经…

带有Swagger的Spring Rest API –创建文档

使REST API易于使用的真正关键是好的文档。 但是&#xff0c;即使您的文档做得不错&#xff0c;您也需要设置公司流程的权利&#xff0c;以正确&#xff0c;及时地发布它。 确保利益相关者按时收到是一回事&#xff0c;但是您也要负责API和文档中的更新。 自动完成此过程可轻松…

关于React-native的介绍以及环境搭建

React-Native介绍&#xff08;后面内容的RN就是指react-native&#xff09; 由facebook公司推出的&#xff0c;基于react&#xff0c;能开发原生app 原理&#xff1a; 1. 利用react框架写好js代码 2. 利用python、C 把我们的js代码&#xff0c;翻译成java代码 3. 利用andr…

别说我不会玩,我来告诉你iPhone有多烂!iPhone缺点集

港行iPhone4S入手&#xff0c;帮朋友整的。朋友经常出国&#xff0c;所以指定要越狱&#xff0c;装墙外软件。 大sim卡是不支持的&#xff0c;还好商家给了剪卡器。首先发现移动卡不支持&#xff0c;别告诉我欢迎门&#xff0c;我用的就是19位的ICCID&#xff0c;反正把卡装进去…

使用PrimeFaces开发数据导出实用程序

我的日常工作涉及大量使用数据。 我们使用关系数据库来存储所有内容&#xff0c;因为我们依赖于企业级的数据管理。 有时&#xff0c;具有将数据提取为简单格式&#xff08;例如电子表格&#xff09;的功能很有用&#xff0c;以便我们可以按需进行操作。 这篇文章概述了我使用P…

函数名和变量名重名问题

1.如果输出一个函数名&#xff0c;那么输出的就是这个函数的代码。 function test(){console.log("哈哈");}console.log(test); 2.如果变量名 和函数名 重名会怎么样&#xff1f; //a.如果变量有值&#xff0c;那么输出的就是变量的值。//b.如果变量没有值&#xff…

css3 transition的应用

css3 的transition&#xff1a;允许css属性值在一定的时间区内平滑的过渡。 transition-property&#xff1a;变换延续的时间 transition-duration&#xff1a;在延续时间段 transition-timing-function&#xff1a;变换速度变化 transition-delay&#xff1a;变化延迟时间 a&a…

break和continue的区别

break 1.break 语句可用于跳出循环。 2.break所在的循环体已经结束。 continue 1.continue 语句中断循环中的迭代&#xff0c;如果出现了指定的条件&#xff0c;然后继续循环中的下一个迭代。 2.continue所在的循环体并没有结束。 demo演示 for (i0;i<5;i ){if (i3) br…

Tomcat到Wildfly:配置数据库连接

此摘录摘自《 从Tomcat到WildFly 》一书&#xff0c;您将在其中学习如何将现有的Tomcat体系结构移植到WildFly&#xff0c;包括服务器配置和在其顶部运行的应用程序。 WildFly是完全兼容的Java Enterprise Edition 7容器&#xff0c;与Tomcat相比&#xff0c;它具有更多的可用…

我的开始

今天是我第一天写在博客园写东西&#xff0c;怎么说呢&#xff0c;刚毕业 正着工作呢。一头雾水 不知道怎么办&#xff0c;就从同学那里拷了分简历&#xff0c;也学着写了一份。自己还算满意。不过呢 在智联上投了40多家单位了&#xff0c;只有一家让电话面试。有点不值所错&am…

js 深拷贝和浅拷贝

js 深拷贝和浅拷贝 先举一下项目中遇到的两个例子&#xff1a; 例子1&#xff1a; var json $.parseJSON(data.data); //data.data是后台返回的值 var a json.channels; var b json.channels; console.log(ab)//true 这个例子是浅拷贝&#xff0c;a、b两个对象是完…

在jOOQ之上构建的RESTful JDBC HTTP服务器

jOOQ生态系统和社区正在持续增长。 我们个人总是很高兴看到基于jOOQ构建的其他开源项目。 今天&#xff0c;我们非常高兴为您介绍BjrnHarrtell结合REST和RDBMS的一种非常有趣的方法。 BjrnHarrtell从小就是瑞典的程序员。 他通常在Sweco Position AB上忙于编写GIS系统和集成&a…

Tiny Wings 为什么能迅速成为 iOS App Store 付费应用第一名?

Tiny Wings 不知是有意无意&#xff0c;完美的利用了人的性意识。有节奏感的上上下下&#xff0c;找准G点后毫不犹豫的迎头猛扎下去。期待自己拥有绝佳技巧&#xff0c;不放过任何一次能high起来的机会。飞上天触到云的瞬间high得全身淋漓畅快&#xff0c;连续多触云几次基本上…