zabbix監(jiān)控docker容器狀態(tài)【推薦】
前言:前段時(shí)間在部署zabbix,有個(gè)需求就是需要監(jiān)控容器的狀態(tài) 也就是cpu 內(nèi)存 io的占用,于是就自己寫(xiě)了一個(gè)腳本,以及模板,在這里分享一下 嘿嘿 : )
廢話(huà)我也就不多說(shuō),直接開(kāi)始
首選,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 腳本,采用自動(dòng)發(fā)現(xiàn)規(guī)則來(lái)發(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()
這里說(shuō)一下自動(dòng)發(fā)現(xiàn)規(guī)則的坑。。。我被坑了好久才找出來(lái).....一是必須返回json格式內(nèi)容,二是 info['{#CONTAINERNAME}' ] 這個(gè)key一定要這么寫(xiě){#CONTAINERNAME}......
返回結(jié)果如下,一定要是這樣的層級(jí)關(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"}]}
另外那個(gè)函數(shù)的很簡(jiǎn)單了,就是調(diào)用docker 命令在獲取數(shù)據(jù)的。
自動(dòng)發(fā)現(xiàn)規(guī)則呢 也就是這樣
只監(jiān)控的這幾個(gè)狀態(tài),以及還有一個(gè)觸發(fā)器就是ping 來(lái)檢測(cè)當(dāng)前這個(gè)容器狀態(tài)是否運(yùn)行,如果不是就報(bào)警。
模板如下
<?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ù)就沒(méi)問(wèn)題。獲取不了的,可以zabbix_get 來(lái)調(diào)試 找到問(wèn)題出在哪去解決。
總結(jié)
以上所述是小編給大家介紹的zabbix監(jiān)控docker容器狀態(tài),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
在Docker中的ubuntu中安裝Python3和Pip的問(wèn)題
這篇文章主要介紹了在Docker中的ubuntu中安裝Python3和Pip的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02將普通用戶(hù)加入Docker組,使用docker問(wèn)題
這篇文章主要介紹了將普通用戶(hù)加入Docker組,使用docker問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06dockerfile-maven-plugin使用指南小結(jié)
最近在將應(yīng)用部署到容器平臺(tái),需要在打包時(shí)生成docker鏡像,在網(wǎng)上首先搜到了docker-maven-plugin這個(gè)插件,本文就來(lái)介紹了dockerfile-maven-plugin使用小結(jié),感興趣的可以了解一下2021-09-09docker啟動(dòng)報(bào)錯(cuò)205/limit的解決方案
Dcoker啟動(dòng)報(bào)錯(cuò)經(jīng)常能看到 205/limit這個(gè)錯(cuò)誤提示,這是告訴你linux操作系統(tǒng)的文件描述符設(shè)置的和Docker的不匹配,或者是設(shè)置的比較小了,本文介紹了docker啟動(dòng)報(bào)錯(cuò)205/limit的解決方案,需要的朋友可以參考下2024-06-06Docker安裝wordpress并配置數(shù)據(jù)庫(kù)超詳細(xì)介紹版
安裝WordPress是一項(xiàng)常見(jiàn)的任務(wù),使用Docker可以使這個(gè)過(guò)程更加簡(jiǎn)單和可靠,下面這篇文章主要給大家介紹了關(guān)于Docker安裝wordpress并配置數(shù)據(jù)庫(kù)的相關(guān)資料,需要的朋友可以參考下2023-11-11Docker上傳鏡像至私有倉(cāng)庫(kù)的方法示例
這篇文章主要介紹了Docker上傳鏡像至私有倉(cāng)庫(kù)的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01