正在显示
3 个修改的文件
包含
191 行增加
和
162 行删除
app/modules/monitor/backgroud_job.py
0 → 100644
| 1 | +import paramiko | ||
| 2 | +from .models import MonitorHost, MonitorLog | ||
| 3 | +import datetime | ||
| 4 | +import math | ||
| 5 | +import time | ||
| 6 | +import uuid | ||
| 7 | +from app.util.component.PGUtil import PGUtil | ||
| 8 | +import configure | ||
| 9 | +from app.util.component.StructuredPrint import StructurePrint | ||
| 10 | +import traceback | ||
| 11 | + | ||
| 12 | +def background_job(): | ||
| 13 | + try: | ||
| 14 | + # servers = [{'sid': 'src1', 'hostname': '172.26.99.160', | ||
| 15 | + # 'username': 'monitor', 'password': '123456'}, | ||
| 16 | + # {'sid': 'src2', 'hostname': '172.26.60.100', | ||
| 17 | + # 'username': 'root', 'password': 'DMap@123'}] | ||
| 18 | + | ||
| 19 | + cur_time = datetime.datetime.now() | ||
| 20 | + time_stamp = cur_time.strftime( | ||
| 21 | + "%Y-%m-%d %H:%M:%S") | ||
| 22 | + struct_time = time.strptime(time_stamp, "%Y-%m-%d %H:%M:%S") | ||
| 23 | + d_minu_stamp = math.floor(struct_time.tm_min/10) | ||
| 24 | + f_minu_stamp = math.floor(struct_time.tm_min/5) | ||
| 25 | + | ||
| 26 | + sys_session = PGUtil.get_db_session( | ||
| 27 | + configure.SQLALCHEMY_DATABASE_URI) | ||
| 28 | + sys_ds = PGUtil.open_pg_data_source( | ||
| 29 | + 0, configure.SQLALCHEMY_DATABASE_URI) | ||
| 30 | + | ||
| 31 | + hosts = sys_session.query( | ||
| 32 | + MonitorHost.host, MonitorHost.user, MonitorHost.password, MonitorHost.type, MonitorHost.srcid) | ||
| 33 | + servers = list(map(lambda host: | ||
| 34 | + {'hostname': host.host, 'username': host.user, | ||
| 35 | + 'password': host.password, 'type': host.type, | ||
| 36 | + 'sid': host.srcid}, | ||
| 37 | + hosts)) | ||
| 38 | + logs = [] | ||
| 39 | + for info in servers: | ||
| 40 | + try: | ||
| 41 | + StructurePrint().print("schedule,host:{},user:{}".format( | ||
| 42 | + info['hostname'], info['username'])) | ||
| 43 | + # 业务逻辑 | ||
| 44 | + client = paramiko.SSHClient() | ||
| 45 | + client.set_missing_host_key_policy(paramiko.AutoAddPolicy) | ||
| 46 | + client.connect(hostname=info['hostname'], | ||
| 47 | + username=info['username'], password=info['password']) | ||
| 48 | + | ||
| 49 | + # cpu | ||
| 50 | + order = "top -b -n1 | sed -n '3p' | awk '{print $2}'" | ||
| 51 | + stdin, stdout, stderr = client.exec_command(order) | ||
| 52 | + cpu_usage = stdout.read().decode().split("\n")[0] # cpu使用率 | ||
| 53 | + | ||
| 54 | + # 内存 | ||
| 55 | + order = "free -m | sed -n '2p' | awk '{print $2}'" | ||
| 56 | + stdin, stdout, stderr = client.exec_command(order) | ||
| 57 | + totalMem = stdout.read().decode().split("\n")[0] # 总内存 | ||
| 58 | + | ||
| 59 | + order = "free -m | sed -n '2p' | awk '{print $7}'" | ||
| 60 | + stdin, stdout, stderr = client.exec_command(order) | ||
| 61 | + availableMem = stdout.read().decode().split("\n")[0] # 可用内存 | ||
| 62 | + | ||
| 63 | + order = "free -m | sed -n '2p' | awk '{print $3}'" | ||
| 64 | + stdin, stdout, stderr = client.exec_command(order) | ||
| 65 | + usedMem = stdout.read().decode().split("\n")[0] # 已用内存 | ||
| 66 | + | ||
| 67 | + # disk | ||
| 68 | + order = "df -m | grep -v 'overlay\|Filesystem' | awk '{print $1,$2,$3}' | grep /dev | awk '{print $2}' | awk -v total=0 '{total+=$1}END{print total}'" | ||
| 69 | + stdin, stdout, stderr = client.exec_command(order) | ||
| 70 | + totalDisk = int(stdout.read().decode().split("\n") | ||
| 71 | + [0]) # 总磁盘空间,单位Mb | ||
| 72 | + | ||
| 73 | + order = "df -m | grep -v 'overlay\|Filesystem' | awk '{print $1,$2,$3}' | grep /dev | awk '{print $3}' | awk -v total=0 '{total+=$1}END{print total}'" | ||
| 74 | + stdin, stdout, stderr = client.exec_command(order) | ||
| 75 | + usedDisk = int(stdout.read().decode().split("\n") | ||
| 76 | + [0]) # 已使用磁盘空间,单位Mb | ||
| 77 | + | ||
| 78 | + # network | ||
| 79 | + # 接收的字节数 | ||
| 80 | + rx_time = [] | ||
| 81 | + rx_bytes = [] | ||
| 82 | + tx_time = [] | ||
| 83 | + tx_bytes = [] | ||
| 84 | + | ||
| 85 | + # 接收的字节数 | ||
| 86 | + order = "ifconfig | grep RX | grep -v 'errors'| awk -v total=0 '{total+=$5}END{print total}'" | ||
| 87 | + i = 0 | ||
| 88 | + while i < 2: | ||
| 89 | + i = i+1 | ||
| 90 | + stdin, stdout, stderr = client.exec_command(order) | ||
| 91 | + rx_time.append(time.time()) | ||
| 92 | + rx_bytes.append(int(stdout.read().decode().split("\n")[0])) | ||
| 93 | + | ||
| 94 | + # 发送的字节数 | ||
| 95 | + order = "ifconfig | grep TX | grep -v 'errors'| awk -v total=0 '{total+=$5}END{print total}'" | ||
| 96 | + i = 0 | ||
| 97 | + while i < 2: | ||
| 98 | + i = i+1 | ||
| 99 | + stdin, stdout, stderr = client.exec_command(order) | ||
| 100 | + tx_time.append(time.time()) | ||
| 101 | + tx_bytes.append(int(stdout.read().decode().split("\n")[0])) | ||
| 102 | + | ||
| 103 | + log_guid = uuid.uuid1().__str__() | ||
| 104 | + monitor_log = MonitorLog(guid=log_guid, | ||
| 105 | + server=info["hostname"], | ||
| 106 | + time_stamp=cur_time, | ||
| 107 | + cpu_usage=float( | ||
| 108 | + "%.2f" % float(cpu_usage)), | ||
| 109 | + total_mem=totalMem, | ||
| 110 | + available_mem=availableMem, | ||
| 111 | + used_mem=usedMem, | ||
| 112 | + disk=totalDisk, | ||
| 113 | + disk_usage=usedDisk, | ||
| 114 | + net_recv=float("%.2f" % float(( | ||
| 115 | + rx_bytes[1] - rx_bytes[0])/(rx_time[1]-rx_time[0]))), | ||
| 116 | + net_send=float("%.2f" % float(( | ||
| 117 | + tx_bytes[1] - tx_bytes[0])/(tx_time[1]-tx_time[0]))), | ||
| 118 | + date_stamp=cur_time.strftime( | ||
| 119 | + "%Y-%m-%d"), | ||
| 120 | + hour_stamp=struct_time.tm_hour, | ||
| 121 | + minu_stamp=struct_time.tm_min, | ||
| 122 | + d_minu_stamp=1 if d_minu_stamp == 0 else d_minu_stamp, | ||
| 123 | + f_minu_stamp=1 if f_minu_stamp == 0 else f_minu_stamp) | ||
| 124 | + | ||
| 125 | + logs.append(monitor_log) | ||
| 126 | + | ||
| 127 | + except Exception as e: | ||
| 128 | + StructurePrint().print(e.__str__()+":" + traceback.format_exc(), "error") | ||
| 129 | + sys_session.rollback() | ||
| 130 | + sys_session.add_all(logs) | ||
| 131 | + sys_session.commit() | ||
| 132 | + except Exception as e2: | ||
| 133 | + StructurePrint().print(e2.__str__()+":" + traceback.format_exc(), "error") | ||
| 134 | + finally: | ||
| 135 | + sys_session.rollback() | ||
| 136 | + client.close() | ||
| 137 | + if sys_session: | ||
| 138 | + sys_session.close() | ||
| 139 | + if sys_ds: | ||
| 140 | + sys_ds.Destroy() | ||
| 141 | + | ||
| 142 | + | ||
| 143 | + | ||
| 144 | +def format_value(value): | ||
| 145 | + # 1024*1024*1024 | ||
| 146 | + if value > 1_073_741_824: | ||
| 147 | + value = "{}GB".format(format(value/1_073_741_824, '.1f')) | ||
| 148 | + elif value > 1_048_576: | ||
| 149 | + # 1024*1024 | ||
| 150 | + value = "{}MB".format(format(value / 1_048_576, '.1f')) | ||
| 151 | + elif value > 1024: | ||
| 152 | + value = "{}KB".format(format(value / 1024.0, '.1f')) | ||
| 153 | + else: | ||
| 154 | + value = "{}B".format(format(value, '.1f')) | ||
| 155 | + return value | ||
| 156 | + | ||
| 157 | + | ||
| 158 | +def Mb_format_value(value): | ||
| 159 | + if value > 1024: | ||
| 160 | + value = "{}GB".format(format(value/1024, '.1f')) | ||
| 161 | + else: | ||
| 162 | + value = "{}MB".format(format(value, '.1f')) | ||
| 163 | + return value |
| 1 | # import schedule | 1 | # import schedule |
| 2 | -import os | 2 | +from flask import json |
| 3 | import paramiko | 3 | import paramiko |
| 4 | +from sqlalchemy.sql.sqltypes import JSON | ||
| 4 | from .models import MonitorHost, MonitorLog | 5 | from .models import MonitorHost, MonitorLog |
| 5 | import datetime | 6 | import datetime |
| 6 | import math | 7 | import math |
| @@ -10,177 +11,44 @@ import schedule | @@ -10,177 +11,44 @@ import schedule | ||
| 10 | from app.util.component.RunContinuous import run_continuously | 11 | from app.util.component.RunContinuous import run_continuously |
| 11 | from app.util.component.PGUtil import PGUtil | 12 | from app.util.component.PGUtil import PGUtil |
| 12 | import configure | 13 | import configure |
| 14 | +from app.util.component.StructuredPrint import StructurePrint | ||
| 15 | +import traceback | ||
| 13 | 16 | ||
| 14 | 17 | ||
| 15 | -def background_job(): | 18 | +def pull_metric(): |
| 16 | try: | 19 | try: |
| 17 | - # print('Hello from the background thread') | ||
| 18 | - # base_dir = os.getcwd() | ||
| 19 | - | ||
| 20 | - # 命令文件 | ||
| 21 | - # cmd_filepath = os.path.join(base_dir, "file", "monitor.txt") | ||
| 22 | - # cmd_file = open(cmd_filepath, "r") | ||
| 23 | - # cmd = cmd_file.read() | ||
| 24 | - # cmd_file.close() | ||
| 25 | - # servers = [{'sid': 'src1', 'hostname': '172.26.99.160', | ||
| 26 | - # 'username': 'monitor', 'password': '123456'}, | ||
| 27 | - # {'sid': 'src2', 'hostname': '172.26.60.100', | ||
| 28 | - # 'username': 'root', 'password': 'DMap@123'}] | ||
| 29 | - | ||
| 30 | - cur_time = datetime.datetime.now() | ||
| 31 | - time_stamp = cur_time.strftime( | ||
| 32 | - "%Y-%m-%d %H:%M:%S") | ||
| 33 | - struct_time = time.strptime(time_stamp, "%Y-%m-%d %H:%M:%S") | ||
| 34 | - d_minu_stamp = math.floor(struct_time.tm_min/10) | ||
| 35 | - f_minu_stamp = math.floor(struct_time.tm_min/5) | ||
| 36 | - | 20 | + # 获获取服务器信息 |
| 37 | sys_session = PGUtil.get_db_session( | 21 | sys_session = PGUtil.get_db_session( |
| 38 | configure.SQLALCHEMY_DATABASE_URI) | 22 | configure.SQLALCHEMY_DATABASE_URI) |
| 39 | sys_ds = PGUtil.open_pg_data_source( | 23 | sys_ds = PGUtil.open_pg_data_source( |
| 40 | 0, configure.SQLALCHEMY_DATABASE_URI) | 24 | 0, configure.SQLALCHEMY_DATABASE_URI) |
| 25 | + | ||
| 26 | + #拉取服务器信息 | ||
| 41 | 27 | ||
| 42 | hosts = sys_session.query( | 28 | hosts = sys_session.query( |
| 43 | - MonitorHost.host, MonitorHost.user, MonitorHost.password, MonitorHost.type, MonitorHost.srcid) | ||
| 44 | - servers = list(map(lambda host: | ||
| 45 | - {'hostname': host.host, 'username': host.user, | ||
| 46 | - 'password': host.password, 'type': host.type, | ||
| 47 | - 'sid': host.srcid}, | ||
| 48 | - hosts)) | ||
| 49 | - for info in servers: | ||
| 50 | - try: | ||
| 51 | - # 业务逻辑 | ||
| 52 | - client = paramiko.SSHClient() | ||
| 53 | - client.set_missing_host_key_policy(paramiko.AutoAddPolicy) | ||
| 54 | - client.connect(hostname=info['hostname'], | ||
| 55 | - username=info['username'], password=info['password']) | ||
| 56 | - | ||
| 57 | - # cpu | ||
| 58 | - order = "top -b -n1 | sed -n '3p' | awk '{print $2}'" | ||
| 59 | - stdin, stdout, stderr = client.exec_command(order) | ||
| 60 | - cpu_usage = stdout.read().decode().split("\n")[0] # cpu使用率 | ||
| 61 | - | ||
| 62 | - # 内存 | ||
| 63 | - order = "free -m | sed -n '2p' | awk '{print $2}'" | ||
| 64 | - stdin, stdout, stderr = client.exec_command(order) | ||
| 65 | - totalMem = stdout.read().decode().split("\n")[0] # 总内存 | ||
| 66 | - | ||
| 67 | - order = "free -m | sed -n '2p' | awk '{print $7}'" | ||
| 68 | - stdin, stdout, stderr = client.exec_command(order) | ||
| 69 | - availableMem = stdout.read().decode().split("\n")[0] # 可用内存 | ||
| 70 | - | ||
| 71 | - order = "free -m | sed -n '2p' | awk '{print $3}'" | ||
| 72 | - stdin, stdout, stderr = client.exec_command(order) | ||
| 73 | - usedMem = stdout.read().decode().split("\n")[0] # 已用内存 | ||
| 74 | - | ||
| 75 | - # disk | ||
| 76 | - order = "df -m | grep -v 'overlay\|Filesystem' | awk '{print $1,$2,$3}' | grep /dev | awk '{print $2}' | awk -v total=0 '{total+=$1}END{print total}'" | ||
| 77 | - stdin, stdout, stderr = client.exec_command(order) | ||
| 78 | - totalDisk = int(stdout.read().decode().split("\n") | ||
| 79 | - [0]) # 总磁盘空间,单位Mb | ||
| 80 | - | ||
| 81 | - order = "df -m | grep -v 'overlay\|Filesystem' | awk '{print $1,$2,$3}' | grep /dev | awk '{print $3}' | awk -v total=0 '{total+=$1}END{print total}'" | ||
| 82 | - stdin, stdout, stderr = client.exec_command(order) | ||
| 83 | - usedDisk = int(stdout.read().decode().split("\n") | ||
| 84 | - [0]) # 已使用磁盘空间,单位Mb | ||
| 85 | - | ||
| 86 | - # network | ||
| 87 | - # 接收的字节数 | ||
| 88 | - rx_time = [] | ||
| 89 | - rx_bytes = [] | ||
| 90 | - tx_time = [] | ||
| 91 | - tx_bytes = [] | ||
| 92 | - | ||
| 93 | - # 接收的字节数 | ||
| 94 | - order = "ifconfig | grep RX | grep -v 'errors'| awk -v total=0 '{total+=$5}END{print total}'" | ||
| 95 | - i = 0 | ||
| 96 | - while i < 2: | ||
| 97 | - i = i+1 | ||
| 98 | - stdin, stdout, stderr = client.exec_command(order) | ||
| 99 | - rx_time.append(time.time()) | ||
| 100 | - rx_bytes.append(int(stdout.read().decode().split("\n")[0])) | ||
| 101 | - | ||
| 102 | - # 发送的字节数 | ||
| 103 | - order = "ifconfig | grep TX | grep -v 'errors'| awk -v total=0 '{total+=$5}END{print total}'" | ||
| 104 | - i = 0 | ||
| 105 | - while i < 2: | ||
| 106 | - i = i+1 | ||
| 107 | - stdin, stdout, stderr = client.exec_command(order) | ||
| 108 | - tx_time.append(time.time()) | ||
| 109 | - tx_bytes.append(int(stdout.read().decode().split("\n")[0])) | ||
| 110 | - | ||
| 111 | - log_guid = uuid.uuid1().__str__() | ||
| 112 | - monitor_log = MonitorLog(guid=log_guid, | ||
| 113 | - server=info["hostname"], | ||
| 114 | - time_stamp=cur_time, | ||
| 115 | - cpu_usage=float( | ||
| 116 | - "%.2f" % float(cpu_usage)), | ||
| 117 | - total_mem=totalMem, | ||
| 118 | - available_mem=availableMem, | ||
| 119 | - used_mem=usedMem, | ||
| 120 | - disk=totalDisk, | ||
| 121 | - disk_usage=usedDisk, | ||
| 122 | - net_recv=float("%.2f" % float(( | ||
| 123 | - rx_bytes[1] - rx_bytes[0])/(rx_time[1]-rx_time[0]))), | ||
| 124 | - net_send=float("%.2f" % float(( | ||
| 125 | - tx_bytes[1] - tx_bytes[0])/(tx_time[1]-tx_time[0]))), | ||
| 126 | - date_stamp=cur_time.strftime( | ||
| 127 | - "%Y-%m-%d"), | ||
| 128 | - hour_stamp=struct_time.tm_hour, | ||
| 129 | - minu_stamp=struct_time.tm_min, | ||
| 130 | - d_minu_stamp=1 if d_minu_stamp == 0 else d_minu_stamp, | ||
| 131 | - f_minu_stamp=1 if f_minu_stamp == 0 else f_minu_stamp) | ||
| 132 | - | ||
| 133 | - sys_session.add(monitor_log) | ||
| 134 | - sys_session.commit() | ||
| 135 | - | ||
| 136 | - # for line in stdout: | ||
| 137 | - # data = json.loads(line) | ||
| 138 | - # # print(type(data)) | ||
| 139 | - # print(data) | ||
| 140 | - except Exception as e: | ||
| 141 | - sys_session.rollback() | ||
| 142 | - except e: | ||
| 143 | - print('发生了异常:', e) | ||
| 144 | - finally: | ||
| 145 | - client.close() | ||
| 146 | - if sys_session: | ||
| 147 | - sys_session.close() | ||
| 148 | - if sys_ds: | ||
| 149 | - sys_ds.Destroy() | ||
| 150 | - | ||
| 151 | - | ||
| 152 | -# 记录30条记录 | ||
| 153 | -logs = [] | ||
| 154 | - | 29 | + MonitorHost.host) |
| 30 | + for host in hosts: | ||
| 31 | + request_uri="http://{}".format(host.host) | ||
| 32 | + | ||
| 33 | + | ||
| 34 | + | ||
| 35 | + # 获取数据并汇聚为1min的数据入库 | ||
| 36 | + # 结束 | ||
| 37 | + pass | ||
| 38 | + except Exception as e: | ||
| 39 | + StructurePrint().print(e.__str__()+":" + traceback.format_exc(), "error") | ||
| 40 | + pass | ||
| 155 | 41 | ||
| 156 | def start_schedule(): | 42 | def start_schedule(): |
| 157 | - # # 1分钟巡检一次 | ||
| 158 | - schedule.every(2).minutes.do(background_job) | ||
| 159 | - # schedule.every(5).seconds.do(background_job) | ||
| 160 | - stop_run_continuously = run_continuously() | 43 | + # # 2分钟巡检一次 |
| 44 | + try: | ||
| 45 | + StructurePrint().print("start_schedule") | ||
| 46 | + schedule.every(1).minutes.do(pull_metric) | ||
| 47 | + stop_run_continuously = run_continuously() | ||
| 48 | + except Exception as e: | ||
| 49 | + StructurePrint().print(e.__str__()+":" + traceback.format_exc(), "error") | ||
| 50 | + | ||
| 161 | # Do some other things... | 51 | # Do some other things... |
| 162 | # # Stop the background thread | 52 | # # Stop the background thread |
| 163 | # time.sleep(10) | 53 | # time.sleep(10) |
| 164 | # stop_run_continuously.set() | 54 | # stop_run_continuously.set() |
| 165 | - | ||
| 166 | - | ||
| 167 | -def format_value(value): | ||
| 168 | - # 1024*1024*1024 | ||
| 169 | - if value > 1_073_741_824: | ||
| 170 | - value = "{}GB".format(format(value/1_073_741_824, '.1f')) | ||
| 171 | - elif value > 1_048_576: | ||
| 172 | - # 1024*1024 | ||
| 173 | - value = "{}MB".format(format(value / 1_048_576, '.1f')) | ||
| 174 | - elif value > 1024: | ||
| 175 | - value = "{}KB".format(format(value / 1024.0, '.1f')) | ||
| 176 | - else: | ||
| 177 | - value = "{}B".format(format(value, '.1f')) | ||
| 178 | - return value | ||
| 179 | - | ||
| 180 | - | ||
| 181 | -def Mb_format_value(value): | ||
| 182 | - if value > 1024: | ||
| 183 | - value = "{}GB".format(format(value/1024, '.1f')) | ||
| 184 | - else: | ||
| 185 | - value = "{}MB".format(format(value, '.1f')) | ||
| 186 | - return value |
| @@ -2,11 +2,9 @@ | @@ -2,11 +2,9 @@ | ||
| 2 | from flask import Flask | 2 | from flask import Flask |
| 3 | from app import create_app | 3 | from app import create_app |
| 4 | import os | 4 | import os |
| 5 | -from app.modules.monitor.schedule import start_schedule | ||
| 6 | 5 | ||
| 7 | os.environ['AUTHLIB_INSECURE_TRANSPORT'] = '1' | 6 | os.environ['AUTHLIB_INSECURE_TRANSPORT'] = '1' |
| 8 | app: Flask = create_app() | 7 | app: Flask = create_app() |
| 9 | if __name__ == '__main__': | 8 | if __name__ == '__main__': |
| 10 | - # start_schedule() | ||
| 11 | app.run(host="0.0.0.0", port="8840", threaded=True, debug=True) | 9 | app.run(host="0.0.0.0", port="8840", threaded=True, debug=True) |
| 12 | # app.run(host="0.0.0.0", port="8840", threaded=True) | 10 | # app.run(host="0.0.0.0", port="8840", threaded=True) |
请
注册
或
登录
后发表评论