zabbix監(jiān)控docker容器狀態(tài)【推薦】
前言:前段時間在部署zabbix,有個需求就是需要監(jiān)控容器的狀態(tài) 也就是cpu 內(nèi)存 io的占用,于是就自己寫了一個腳本,以及模板,在這里分享一下 嘿嘿 : )
廢話我也就不多說,直接開始
首選,zabbix_agentd 配置 vim /usr/local/zabbix/etc/zabbix_agentd.conf
UserParameter=docker.discovery,/usr/local/zabbix/script/docker.py UserParameter=docker.[*],/usr/local/zabbix/script/docker.py $1 $2
下面是docker.py 腳本,采用自動發(fā)現(xiàn)規(guī)則來發(fā)現(xiàn)容器,然后指定容器獲取狀態(tài)信息
#!/usr/bin/python import sys import os import json def discover(): d = {} d['data'] = [] with os.popen("docker ps -a --format {{.Names}}") as pipe: for line in pipe: info = {} info['{#CONTAINERNAME}'] = line.replace("\n","") d['data'].append(info) print json.dumps(d) def status(name,action): if action == "ping": cmd = 'docker inspect --format="{{.State.Running}}" %s' %name result = os.popen(cmd).read().replace("\n","") if result == "true": print 1 else: print 0 else: cmd = 'docker stats %s --no-stream --format "{{.%s}}"' % (name,action) result = os.popen(cmd).read().replace("\n","") if "%" in result: print float(result.replace("%","")) else: print result if __name__ == '__main__': try: name, action = sys.argv[1], sys.argv[2] status(name,action) except IndexError: discover()
這里說一下自動發(fā)現(xiàn)規(guī)則的坑。。。我被坑了好久才找出來.....一是必須返回json格式內(nèi)容,二是 info['{#CONTAINERNAME}' ] 這個key一定要這么寫{#CONTAINERNAME}......
返回結(jié)果如下,一定要是這樣的層級關(guān)系....
{"data": [{"{#CONTAINERNAME}": "node-3"}, {"{#CONTAINERNAME}": "node-2"}, {"{#CONTAINERNAME}": "node-1"}, {"{#CONTAINERNAME}": "web"}, {"{#CONTAINERNAME}": "cadvisor"}, {"{#CONTAINERNAME}": "updatol"}, {"{#CONTAINERNAME}": "research"}, {"{#CONTAINERNAME}": "services"}, {"{#CONTAINERNAME}": "data"}, {"{#CONTAINERNAME}": "rabbitmq"}, {"{#CONTAINERNAME}": "redis"}, {"{#CONTAINERNAME}": "mysql"}, {"{#CONTAINERNAME}": "ssdb"}]}
另外那個函數(shù)的很簡單了,就是調(diào)用docker 命令在獲取數(shù)據(jù)的。
自動發(fā)現(xiàn)規(guī)則呢 也就是這樣
只監(jiān)控的這幾個狀態(tài),以及還有一個觸發(fā)器就是ping 來檢測當(dāng)前這個容器狀態(tài)是否運(yùn)行,如果不是就報警。
模板如下
<?xml version="1.0" encoding="UTF-8"?> <zabbix_export> <version>3.2</version> <date>2018-06-04T04:12:36Z</date> <groups> <group> <name>Templates</name> </group> </groups> <templates> <template> <template>docker-status</template> <name>docker-status</name> <description/> <groups> <group> <name>Templates</name> </group> </groups> <applications> <application> <name>docker_test</name> </application> </applications> <items/> <discovery_rules> <discovery_rule> <name>docker.discovery</name> <type>0</type> <snmp_community/> <snmp_oid/> <key>docker.discovery</key> <delay>60</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/> <delay_flex/> <params/> <ipmi_sensor/> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <filter> <evaltype>0</evaltype> <formula/> <conditions> <condition> <macro>{#CONTAINERNAME}</macro> <value>@ CONTAINER NAME</value> <operator>8</operator> <formulaid>A</formulaid> </condition> </conditions> </filter> <lifetime>30</lifetime> <description/> <item_prototypes> <item_prototype> <name>Container {#CONTAINERNAME} Diskio usage:</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>docker.[{#CONTAINERNAME} ,BlockIO]</key> <delay>60</delay> <history>90</history> <trends>0</trends> <status>0</status> <value_type>1</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>docker_test</name> </application> </applications> <valuemap/> <logtimefmt/> <application_prototypes/> </item_prototype> <item_prototype> <name>Container{#CONTAINERNAME} CPU usage:</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>docker.[{#CONTAINERNAME},CPUPerc]</key> <delay>60</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>0</value_type> <allowed_hosts/> <units>%</units> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>docker_test</name> </application> </applications> <valuemap/> <logtimefmt/> <application_prototypes/> </item_prototype> <item_prototype> <name>Container {#CONTAINERNAME} mem usage:</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>docker.[{#CONTAINERNAME},MemPerc]</key> <delay>60</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>0</value_type> <allowed_hosts/> <units>%</units> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>docker_test</name> </application> </applications> <valuemap/> <logtimefmt/> <application_prototypes/> </item_prototype> <item_prototype> <name>Container {#CONTAINERNAME} NETio usage:</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>docker.[{#CONTAINERNAME},NetIO]</key> <delay>60</delay> <history>90</history> <trends>0</trends> <status>0</status> <value_type>1</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>docker_test</name> </application> </applications> <valuemap/> <logtimefmt/> <application_prototypes/> </item_prototype> <item_prototype> <name>Container{#CONTAINERNAME} is_run :</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>docker.[{#CONTAINERNAME} ,ping]</key> <delay>30</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_contextname/> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authprotocol>0</snmpv3_authprotocol> <snmpv3_authpassphrase/> <snmpv3_privprotocol>0</snmpv3_privprotocol> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>docker_test</name> </application> </applications> <valuemap/> <logtimefmt/> <application_prototypes/> </item_prototype> </item_prototypes> <trigger_prototypes> <trigger_prototype> <expression>{docker-status:docker.[{#CONTAINERNAME} ,ping].last()}=0</expression> <recovery_mode>0</recovery_mode> <recovery_expression/> <name>docker_{#CONTAINERNAME}_down</name> <correlation_mode>0</correlation_mode> <correlation_tag/> <url/> <status>0</status> <priority>5</priority> <description/> <type>0</type> <manual_close>0</manual_close> <dependencies/> <tags/> </trigger_prototype> </trigger_prototypes> <graph_prototypes/> <host_prototypes/> </discovery_rule> </discovery_rules> <httptests/> <macros/> <templates/> <screens/> </template> </templates> </zabbix_export>
修改Zabbix_agentd 配置,docker.py腳本放在指定路徑下,不要忘了給權(quán)限,導(dǎo)入模板,能獲取數(shù)據(jù)就沒問題。獲取不了的,可以zabbix_get 來調(diào)試 找到問題出在哪去解決。
總結(jié)
以上所述是小編給大家介紹的zabbix監(jiān)控docker容器狀態(tài),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
在Docker中的ubuntu中安裝Python3和Pip的問題
這篇文章主要介紹了在Docker中的ubuntu中安裝Python3和Pip的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02dockerfile-maven-plugin使用指南小結(jié)
最近在將應(yīng)用部署到容器平臺,需要在打包時生成docker鏡像,在網(wǎng)上首先搜到了docker-maven-plugin這個插件,本文就來介紹了dockerfile-maven-plugin使用小結(jié),感興趣的可以了解一下2021-09-09Docker安裝wordpress并配置數(shù)據(jù)庫超詳細(xì)介紹版
安裝WordPress是一項(xiàng)常見的任務(wù),使用Docker可以使這個過程更加簡單和可靠,下面這篇文章主要給大家介紹了關(guān)于Docker安裝wordpress并配置數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下2023-11-11