python 脚本监控 docker 容器
思路
1.python 脚本脚本定时访问docker 容器的接口.
2.接口出现超时或者异常,判定接口异常.
3.异常的接口调用 docker 命令重启.
4.同时记录请求的日志,方便的grafana 图表中展示当前容器的运行状态.
代码
#-*- encoding:utf-8 -*-
from datetime import datetime, timedelta
import requests
import json
import time
import traceback
import logging
import sys #reload()之前必须要引入模块
import subprocess
reload(sys)
sys.setdefaultencoding('utf-8')
#日志配置
logging.basicConfig(format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s',
level=logging.DEBUG,
filename='xxxxxx.log',
filemode='a')
def parse_date(data):
return datetime.strptime(data, "%Y-%m-%d %H:%M:%S")
# 发送巡检结果到监控应用
def insertLog(jsonStr):
response = requests.post('http:// xxxx/abcdef/', data=jsonStr)
logging.info('请求参数='+jsonStr+',返回值'+response.content)
while True:
#dict_data 存放 docker 容器请求地址和对应容器的 docker 容器 id
dict_data = {
"http://xxxxx/abc/11/33333.json": "5678",
"http://xxxxx/abc/11/33333.json": "5566777"
}
for url, dockerId in dict_data.items():
# print url,dockerId
try:
start = time.time()
response3 = requests.get(url, timeout=(30, 30))
end_time = time.time()
timeCost = (end_time - start) * 1000
logging.info('url=' + url + ',耗时:' + str(timeCost))
params = {}
params['num'] = timeCost
params['ip'] = "监控 docker 容器的 ip 地址"
params['type'] = 7
params['desc'] = "心跳"
paramsAll = {}
paramsAll['aaaa'] = params
datastr = json.dumps(paramsAll)
insertLog(datastr)
except Exception as e:
logging.error(traceback.format_exc())
params = {}
params['num'] = -1000
params['app_ip'] = "监控 docker 容器的 ip 地址"
params['type'] = 7
params['desc'] = "心跳"
paramsAll = {}
paramsAll['aaaa'] = params
datastr = json.dumps(paramsAll)
insertLog(datastr)
#重启docker容器
# 执行 docker restart abcdes 命令
process = subprocess.Popen("docker restart " + dockerId, shell=True, stdout=subprocess.PIPE)
# 获取命令执行的输出和错误
out, err = process.communicate()
# 输出命令执行结果
logging.info(out)
logging.info(err)
time.sleep(30)
time.sleep(60)
-1000 的节点,是接口请求异常的节点,异常后,会重启 docker 容器