正在显示
14 个修改的文件
包含
1030 行增加
和
1 行删除
app/modules/monitor/__init__.py
0 → 100644
| 1 | +# coding=utf-8 | ||
| 2 | +# author: 4N | ||
| 3 | +#createtime: 2021/5/18 | ||
| 4 | +#email: nheweijun@sina.com | ||
| 5 | + | ||
| 6 | + | ||
| 7 | +from flasgger import swag_from | ||
| 8 | +from flask import Blueprint | ||
| 9 | +from app.util import BlueprintApi | ||
| 10 | +from . import monitor_info, monitoring, metrics, monitor_host_create, monitor_host_list, monitor_host_delete, monitor_host_edit | ||
| 11 | + | ||
| 12 | + | ||
| 13 | +user_socket_list = [] | ||
| 14 | +user_socket_dict = {} | ||
| 15 | + | ||
| 16 | + | ||
| 17 | +class Monitor(BlueprintApi): | ||
| 18 | + | ||
| 19 | + bp = Blueprint("Monitor", __name__, url_prefix="/API/Monitor") | ||
| 20 | + | ||
| 21 | + @staticmethod | ||
| 22 | + @bp.route('/Info', methods=['GET']) | ||
| 23 | + @swag_from(monitor_info.Api.api_doc) | ||
| 24 | + def monitor_info(): | ||
| 25 | + """ | ||
| 26 | + 性能监控 | ||
| 27 | + """ | ||
| 28 | + return monitor_info.Api().result | ||
| 29 | + | ||
| 30 | + @staticmethod | ||
| 31 | + @bp.route('/baseMonitoring', methods=['GET']) | ||
| 32 | + @swag_from(monitoring.Api.api_doc) | ||
| 33 | + def monitoring(): | ||
| 34 | + """ | ||
| 35 | + 基础监控 | ||
| 36 | + """ | ||
| 37 | + return monitoring.Api().result | ||
| 38 | + | ||
| 39 | + @staticmethod | ||
| 40 | + @bp.route('/metrics', methods=['GET']) | ||
| 41 | + @swag_from(metrics.Api.api_doc) | ||
| 42 | + def metrics(): | ||
| 43 | + ''' | ||
| 44 | + 指标统计 | ||
| 45 | + ''' | ||
| 46 | + return metrics.Api().result | ||
| 47 | + | ||
| 48 | + @staticmethod | ||
| 49 | + @bp.route('/RegisterHost', methods=['POST']) | ||
| 50 | + @swag_from(monitor_host_create.Api.api_doc) | ||
| 51 | + def monitor_host_create(): | ||
| 52 | + ''' | ||
| 53 | + 注册监控主机 | ||
| 54 | + ''' | ||
| 55 | + return monitor_host_create.Api().result | ||
| 56 | + | ||
| 57 | + @staticmethod | ||
| 58 | + @bp.route('/HostList', methods=['GET']) | ||
| 59 | + @swag_from(monitor_host_list.Api.api_doc) | ||
| 60 | + def monitor_host_list(): | ||
| 61 | + ''' | ||
| 62 | + 获取监控主机列表 | ||
| 63 | + ''' | ||
| 64 | + return monitor_host_list.Api().result | ||
| 65 | + | ||
| 66 | + @staticmethod | ||
| 67 | + @bp.route('/HostDelete', methods=['POST']) | ||
| 68 | + @swag_from(monitor_host_delete.Api.api_doc) | ||
| 69 | + def monitor_host_delete(): | ||
| 70 | + ''' | ||
| 71 | + 删除主机 | ||
| 72 | + ''' | ||
| 73 | + return monitor_host_delete.Api().result | ||
| 74 | + | ||
| 75 | + @staticmethod | ||
| 76 | + @bp.route('/HostEdit', methods=['POST']) | ||
| 77 | + @swag_from(monitor_host_edit.Api.api_doc) | ||
| 78 | + def monitor_host_edit(): | ||
| 79 | + ''' | ||
| 80 | + 编辑主机配置 | ||
| 81 | + ''' | ||
| 82 | + return monitor_host_edit.Api().result |
app/modules/monitor/metrics.py
0 → 100644
| 1 | +from datetime import datetime, timedelta | ||
| 2 | + | ||
| 3 | +from sqlalchemy.sql.functions import func | ||
| 4 | +from .models import MonitorLog, db | ||
| 5 | +from sqlalchemy import and_ | ||
| 6 | +from app.util.component.ApiTemplate import ApiTemplate | ||
| 7 | + | ||
| 8 | + | ||
| 9 | +class Api(ApiTemplate): | ||
| 10 | + api_name = "统计指标" | ||
| 11 | + | ||
| 12 | + def process(self): | ||
| 13 | + | ||
| 14 | + # 返回结果 | ||
| 15 | + res = {} | ||
| 16 | + res["data"] = {} | ||
| 17 | + logs = [] | ||
| 18 | + try: | ||
| 19 | + server = self.para.get("server") # server | ||
| 20 | + # metrics_type = self.para.get("metrics_type") | ||
| 21 | + grain = self.para.get("grain") | ||
| 22 | + count = int(self.para.get("count")) | ||
| 23 | + start_time = self.para.get("start") | ||
| 24 | + to_time = self.para.get("to") | ||
| 25 | + | ||
| 26 | + cur_now = datetime.now() | ||
| 27 | + start_datetime = datetime.strptime(start_time, "%Y-%m-%d %H:%M:%S") | ||
| 28 | + end_datetime = datetime.strptime(to_time, "%Y-%m-%d %H:%M:%S") | ||
| 29 | + | ||
| 30 | + if grain == "day": | ||
| 31 | + # 粒度是一天 | ||
| 32 | + format = "%Y-%m-%d" | ||
| 33 | + logs = db.session.query(MonitorLog.date_stamp.label("key"), func.avg(MonitorLog.cpu_usage).label("cpu_usage"), | ||
| 34 | + func.avg(MonitorLog.total_mem).label( | ||
| 35 | + "total_mem"), | ||
| 36 | + func.avg(MonitorLog.available_mem).label( | ||
| 37 | + "available_mem"), | ||
| 38 | + func.avg(MonitorLog.used_mem).label( | ||
| 39 | + "used_mem"), | ||
| 40 | + func.avg(MonitorLog.disk).label( | ||
| 41 | + "disk"), | ||
| 42 | + func.avg(MonitorLog.disk_usage).label( | ||
| 43 | + "disk_usage"), | ||
| 44 | + func.avg(MonitorLog.net_recv).label( | ||
| 45 | + "net_recv"), | ||
| 46 | + func.avg(MonitorLog.net_send).label("net_send")).filter(and_( | ||
| 47 | + MonitorLog.date_stamp <= end_datetime.strftime( | ||
| 48 | + format), | ||
| 49 | + MonitorLog.date_stamp > start_datetime.strftime( | ||
| 50 | + format), | ||
| 51 | + MonitorLog.server == server)).group_by(MonitorLog.date_stamp).order_by(MonitorLog.date_stamp.asc()).all() | ||
| 52 | + | ||
| 53 | + keys = [] | ||
| 54 | + keys_map = {} | ||
| 55 | + while start_datetime <= end_datetime: | ||
| 56 | + keys.append(self.get_monitor_log( | ||
| 57 | + start_datetime.strftime('%Y-%m-%d'))) | ||
| 58 | + keys_map[start_datetime.strftime('%Y-%m-%d')] = len(keys)-1 | ||
| 59 | + start_datetime += timedelta(days=1) | ||
| 60 | + | ||
| 61 | + res["data"] = self.get_result(logs, keys, keys_map) | ||
| 62 | + elif grain == "minu_five": | ||
| 63 | + # 粒度是5分钟 | ||
| 64 | + cur_minu = int(end_datetime.strftime("%M")) % 5 | ||
| 65 | + logs = db.session.query(MonitorLog.hour_stamp.label("hour_stamp"), | ||
| 66 | + MonitorLog.f_minu_stamp.label( | ||
| 67 | + "minu_stamp"), | ||
| 68 | + func.avg(MonitorLog.cpu_usage).label( | ||
| 69 | + "cpu_usage"), | ||
| 70 | + func.avg(MonitorLog.total_mem).label( | ||
| 71 | + "total_mem"), | ||
| 72 | + func.avg(MonitorLog.available_mem).label( | ||
| 73 | + "available_mem"), | ||
| 74 | + func.avg(MonitorLog.used_mem).label( | ||
| 75 | + "used_mem"), | ||
| 76 | + func.avg(MonitorLog.disk).label( | ||
| 77 | + "disk"), | ||
| 78 | + func.avg(MonitorLog.disk_usage).label( | ||
| 79 | + "disk_usage"), | ||
| 80 | + func.avg(MonitorLog.net_recv).label( | ||
| 81 | + "net_recv"), | ||
| 82 | + func.avg(MonitorLog.net_send).label("net_send")).filter(and_( | ||
| 83 | + MonitorLog.time_stamp <= "{}:00".format( | ||
| 84 | + end_datetime.strftime("%Y-%m-%d %H:%M")), | ||
| 85 | + MonitorLog.time_stamp >= "{}:00".format( | ||
| 86 | + start_datetime.strftime("%Y-%m-%d %H:%M")), | ||
| 87 | + MonitorLog.server == server)).group_by(MonitorLog.date_stamp, MonitorLog.hour_stamp, MonitorLog.f_minu_stamp).order_by( | ||
| 88 | + MonitorLog.hour_stamp.asc(), MonitorLog.f_minu_stamp.asc()).all() | ||
| 89 | + | ||
| 90 | + keys = [] | ||
| 91 | + keys_map = {} | ||
| 92 | + while start_datetime <= end_datetime: | ||
| 93 | + key = start_datetime.strftime('%H:%M') | ||
| 94 | + keys.append(self.get_monitor_log(key)) | ||
| 95 | + keys_map[key] = len(keys)-1 | ||
| 96 | + start_datetime += timedelta(minutes=5) | ||
| 97 | + | ||
| 98 | + logs = list(map(lambda log: | ||
| 99 | + {"key": "%02d:%02d" % (log.hour_stamp, log.minu_stamp*5+cur_minu), | ||
| 100 | + "cpu_usage": log.cpu_usage, "total_mem": log.total_mem, | ||
| 101 | + "available_mem": log.available_mem, "used_mem": log.used_mem, "disk": log.disk, "disk_usage": log.disk_usage, | ||
| 102 | + "net_recv": log.net_recv, "net_send": log.net_send}, | ||
| 103 | + logs)) | ||
| 104 | + | ||
| 105 | + res["data"] = self.get_result_from_list(logs, keys, keys_map) | ||
| 106 | + elif grain == "minu_ten": | ||
| 107 | + # 粒度是10分钟 | ||
| 108 | + cur_minu = int(end_datetime.strftime("%M")) % 10 | ||
| 109 | + logs = db.session.query(MonitorLog.hour_stamp.label("hour_stamp"), | ||
| 110 | + MonitorLog.d_minu_stamp.label( | ||
| 111 | + "minu_stamp"), | ||
| 112 | + func.avg(MonitorLog.cpu_usage).label( | ||
| 113 | + "cpu_usage"), | ||
| 114 | + func.avg(MonitorLog.total_mem).label( | ||
| 115 | + "total_mem"), | ||
| 116 | + func.avg(MonitorLog.available_mem).label( | ||
| 117 | + "available_mem"), | ||
| 118 | + func.avg(MonitorLog.used_mem).label( | ||
| 119 | + "used_mem"), | ||
| 120 | + func.avg(MonitorLog.disk).label( | ||
| 121 | + "disk"), | ||
| 122 | + func.avg(MonitorLog.disk_usage).label( | ||
| 123 | + "disk_usage"), | ||
| 124 | + func.avg(MonitorLog.net_recv).label( | ||
| 125 | + "net_recv"), | ||
| 126 | + func.avg(MonitorLog.net_send).label("net_send")).filter(and_( | ||
| 127 | + MonitorLog.time_stamp <= "{}:00".format( | ||
| 128 | + end_datetime.strftime("%Y-%m-%d %H:%M")), | ||
| 129 | + MonitorLog.time_stamp >= "{}:00".format( | ||
| 130 | + start_datetime.strftime("%Y-%m-%d %H:%M")), | ||
| 131 | + MonitorLog.server == server)).group_by(MonitorLog.date_stamp, | ||
| 132 | + MonitorLog.hour_stamp, | ||
| 133 | + MonitorLog.d_minu_stamp).order_by(MonitorLog.hour_stamp.asc(), MonitorLog.d_minu_stamp.asc()).all() | ||
| 134 | + keys = [] | ||
| 135 | + keys_map = {} | ||
| 136 | + while start_datetime <= end_datetime: | ||
| 137 | + key = start_datetime.strftime('%H:%M') | ||
| 138 | + keys.append(self.get_monitor_log(key)) | ||
| 139 | + keys_map[key] = len(keys)-1 | ||
| 140 | + start_datetime += timedelta(minutes=10) | ||
| 141 | + | ||
| 142 | + logs = list(map(lambda log: | ||
| 143 | + {"key": "%02d:%02d" % (log.hour_stamp, log.minu_stamp*10+cur_minu), | ||
| 144 | + "cpu_usage": log.cpu_usage, "total_mem": log.total_mem, | ||
| 145 | + "available_mem": log.available_mem, "used_mem": log.used_mem, "disk": log.disk, "disk_usage": log.disk_usage, | ||
| 146 | + "net_recv": log.net_recv, "net_send": log.net_send}, | ||
| 147 | + logs)) | ||
| 148 | + | ||
| 149 | + res["data"] = self.get_result_from_list(logs, keys, keys_map) | ||
| 150 | + elif grain == "hour": | ||
| 151 | + # 粒度是一小时 | ||
| 152 | + logs = db.session.query(MonitorLog.hour_stamp.label("key"), func.avg(MonitorLog.cpu_usage).label("cpu_usage"), | ||
| 153 | + func.avg(MonitorLog.total_mem).label( | ||
| 154 | + "total_mem"), | ||
| 155 | + func.avg(MonitorLog.available_mem).label( | ||
| 156 | + "available_mem"), | ||
| 157 | + func.avg(MonitorLog.used_mem).label( | ||
| 158 | + "used_mem"), | ||
| 159 | + func.avg(MonitorLog.disk).label( | ||
| 160 | + "disk"), | ||
| 161 | + func.avg(MonitorLog.disk_usage).label( | ||
| 162 | + "disk_usage"), | ||
| 163 | + func.avg(MonitorLog.net_recv).label( | ||
| 164 | + "net_recv"), | ||
| 165 | + func.avg(MonitorLog.net_send).label("net_send")).filter(and_( | ||
| 166 | + MonitorLog.time_stamp <= "{}:59:59".format( | ||
| 167 | + end_datetime.strftime("%Y-%m-%d %H")), | ||
| 168 | + MonitorLog.time_stamp >= "{}:59:59".format( | ||
| 169 | + start_datetime.strftime("%Y-%m-%d %H")), | ||
| 170 | + MonitorLog.server == server)).group_by(MonitorLog.hour_stamp).order_by(MonitorLog.hour_stamp.asc()).all() | ||
| 171 | + keys = [] | ||
| 172 | + keys_map = {} | ||
| 173 | + while start_datetime <= end_datetime: | ||
| 174 | + key = int(start_datetime.strftime('%H')) | ||
| 175 | + keys.append(self.get_monitor_log("%02d时" % key)) | ||
| 176 | + keys_map[str(key)] = len(keys)-1 | ||
| 177 | + start_datetime += timedelta(hours=1) | ||
| 178 | + | ||
| 179 | + res["data"] = self.get_result(logs, keys, keys_map) | ||
| 180 | + else: | ||
| 181 | + # 按分钟统计 | ||
| 182 | + logs = db.session.query(MonitorLog.hour_stamp.label("hour_stamp"), MonitorLog.minu_stamp.label("minu_stamp"), func.avg(MonitorLog.cpu_usage).label("cpu_usage"), | ||
| 183 | + func.avg(MonitorLog.total_mem).label( | ||
| 184 | + "total_mem"), | ||
| 185 | + func.avg(MonitorLog.available_mem).label( | ||
| 186 | + "available_mem"), | ||
| 187 | + func.avg(MonitorLog.used_mem).label("used_mem"), | ||
| 188 | + func.avg(MonitorLog.disk).label( | ||
| 189 | + "disk"), | ||
| 190 | + func.avg(MonitorLog.disk_usage).label( | ||
| 191 | + "disk_usage"), | ||
| 192 | + func.avg(MonitorLog.net_recv).label( | ||
| 193 | + "net_recv"), | ||
| 194 | + func.avg(MonitorLog.net_send).label("net_send")).filter(and_( | ||
| 195 | + MonitorLog.time_stamp <= end_datetime.strftime("%Y-%m-%d %H:%M:%S"), | ||
| 196 | + MonitorLog.time_stamp >= start_datetime.strftime("%Y-%m-%d %H:%M:%S"), | ||
| 197 | + MonitorLog.server == server)).group_by(MonitorLog.hour_stamp, MonitorLog.minu_stamp).order_by( | ||
| 198 | + MonitorLog.hour_stamp.asc(), MonitorLog.minu_stamp.asc()).all() | ||
| 199 | + keys = [] | ||
| 200 | + keys_map = {} | ||
| 201 | + while start_datetime <= end_datetime: | ||
| 202 | + key = start_datetime.strftime('%H:%M') | ||
| 203 | + keys.append(self.get_monitor_log(key)) | ||
| 204 | + keys_map[key] = len(keys)-1 | ||
| 205 | + start_datetime += timedelta(minutes=1) | ||
| 206 | + | ||
| 207 | + logs = list(map(lambda log: | ||
| 208 | + {"key": "%02d:%02d" % (log.hour_stamp, log.minu_stamp), | ||
| 209 | + "cpu_usage": log.cpu_usage, "total_mem": log.total_mem, | ||
| 210 | + "available_mem": log.available_mem, "used_mem": log.used_mem, "disk": log.disk, "disk_usage": log.disk_usage, | ||
| 211 | + "net_recv": log.net_recv, "net_send": log.net_send}, | ||
| 212 | + logs)) | ||
| 213 | + | ||
| 214 | + res["data"] = self.get_result_from_list(logs, keys, keys_map) | ||
| 215 | + res["result"] = True | ||
| 216 | + except Exception as e: | ||
| 217 | + raise e | ||
| 218 | + return res | ||
| 219 | + | ||
| 220 | + api_doc = { | ||
| 221 | + "tags": ["监控接口"], | ||
| 222 | + "parameters": [ | ||
| 223 | + {"name": "server", | ||
| 224 | + "in": "query", | ||
| 225 | + "type": "string", | ||
| 226 | + "description": "服务器地址"}, | ||
| 227 | + {"name": "grain", | ||
| 228 | + "in": "query", | ||
| 229 | + "type": "string", | ||
| 230 | + "description": "指标粒度:minu:分钟,minu_five:5分钟,minu_ten:10分钟,hour:1小时,day:每天"}, | ||
| 231 | + {"name": "count", | ||
| 232 | + "in": "query", | ||
| 233 | + "type": "string", | ||
| 234 | + "description": "个数"}, | ||
| 235 | + {"name": "to", | ||
| 236 | + "in": "query", | ||
| 237 | + "type": "string", | ||
| 238 | + "description": "查询终止时间"}, | ||
| 239 | + {"name": "start", | ||
| 240 | + "in": "query", | ||
| 241 | + "type": "string", | ||
| 242 | + "description": "查询起始时间"} | ||
| 243 | + ], | ||
| 244 | + "responses": { | ||
| 245 | + 200: { | ||
| 246 | + "schema": { | ||
| 247 | + "properties": { | ||
| 248 | + } | ||
| 249 | + } | ||
| 250 | + } | ||
| 251 | + } | ||
| 252 | + } | ||
| 253 | + | ||
| 254 | + def get_monitor_log(self, key): | ||
| 255 | + return {"key": key, | ||
| 256 | + "cpu_usage": None, "total_mem": None, | ||
| 257 | + "available_mem": None, "used_mem": None, "disk": None, "disk_usage": None, | ||
| 258 | + "net_recv": None, "net_send": None} | ||
| 259 | + | ||
| 260 | + def get_result(self, logs, keys, keys_map): | ||
| 261 | + keys_map_key=keys_map.keys() | ||
| 262 | + for log in logs: | ||
| 263 | + if str(log.key) in keys_map_key: | ||
| 264 | + tmp = keys[keys_map[str(log.key)]] | ||
| 265 | + if tmp != None: | ||
| 266 | + tmp['cpu_usage'] = log.cpu_usage | ||
| 267 | + tmp['total_mem'] = log.total_mem | ||
| 268 | + tmp['available_mem'] = log.available_mem | ||
| 269 | + tmp['used_mem'] = log.used_mem | ||
| 270 | + tmp['disk'] = log.disk | ||
| 271 | + tmp['disk_usage'] = log.disk_usage | ||
| 272 | + tmp['net_recv'] = log.net_recv | ||
| 273 | + tmp['net_send'] = log.net_send | ||
| 274 | + return keys | ||
| 275 | + | ||
| 276 | + def get_result_from_list(self, logs, keys, keys_map): | ||
| 277 | + keys_map_key=keys_map.keys() | ||
| 278 | + for log in logs: | ||
| 279 | + if str(log["key"]) in keys_map_key: | ||
| 280 | + tmp = keys[keys_map[str(log["key"])]] | ||
| 281 | + if tmp != None: | ||
| 282 | + tmp['cpu_usage'] = log["cpu_usage"] | ||
| 283 | + tmp['total_mem'] = log["total_mem"] | ||
| 284 | + tmp['available_mem'] = log["available_mem"] | ||
| 285 | + tmp['used_mem'] = log["used_mem"] | ||
| 286 | + tmp['disk'] = log["disk"] | ||
| 287 | + tmp['disk_usage'] = log["disk_usage"] | ||
| 288 | + tmp['net_recv'] = log["net_recv"] | ||
| 289 | + tmp['net_send'] = log["net_send"] | ||
| 290 | + return keys |
app/modules/monitor/models/__init__.py
0 → 100644
| 1 | +# coding=utf-8 | ||
| 2 | +# author: 4N | ||
| 3 | +#createtime: 2021/6/11 | ||
| 4 | +#email: nheweijun@sina.com | ||
| 5 | + | ||
| 6 | + | ||
| 7 | +from datetime import datetime | ||
| 8 | +from time import time | ||
| 9 | +from sqlalchemy import Column, Integer, String, ForeignKey, Text, DateTime, Time, Float, Binary | ||
| 10 | +from sqlalchemy.orm import relationship | ||
| 11 | +from sqlalchemy.sql.expression import column | ||
| 12 | +from app.models import db | ||
| 13 | + | ||
| 14 | + | ||
| 15 | +class MonitorLog(db.Model): | ||
| 16 | + ''' | ||
| 17 | + ''' | ||
| 18 | + __tablename__ = "dmap_monitor_log" | ||
| 19 | + guid = Column(String(256), primary_key=True) | ||
| 20 | + server = Column(String(256)) | ||
| 21 | + date_stamp = Column(Text) | ||
| 22 | + hour_stamp = Column(Integer) | ||
| 23 | + minu_stamp = Column(Integer) | ||
| 24 | + d_minu_stamp = Column(Integer) # 10min粒度 1-6 | ||
| 25 | + f_minu_stamp = Column(Integer) # 5min粒度 1~12 | ||
| 26 | + time_stamp = Column(DateTime) # 创建时间戳 | ||
| 27 | + cpu_usage = Column(Float) | ||
| 28 | + total_mem = Column(Float) | ||
| 29 | + available_mem = Column(Float) | ||
| 30 | + used_mem = Column(Float) | ||
| 31 | + disk = Column(Float) | ||
| 32 | + disk_usage = Column(Float) | ||
| 33 | + net_recv = Column(Float) | ||
| 34 | + net_send = Column(Float) | ||
| 35 | + | ||
| 36 | + | ||
| 37 | +class MonitorHost(db.Model): | ||
| 38 | + ''' | ||
| 39 | + 监控服务器配置 | ||
| 40 | + ''' | ||
| 41 | + __tablename__ = "dmap_monitor_host" | ||
| 42 | + srcid = Column(String(256), primary_key=True) | ||
| 43 | + host = Column(String(256)) | ||
| 44 | + user = Column(String(256)) | ||
| 45 | + password = Column(String(256)) | ||
| 46 | + type = Column(String(256)) | ||
| 47 | + host_name=Column(String(256)) |
app/modules/monitor/monitor_host_create.py
0 → 100644
| 1 | +from .models import MonitorHost, db | ||
| 2 | +from sqlalchemy import and_ | ||
| 3 | +from app.util.component.ApiTemplate import ApiTemplate | ||
| 4 | +import uuid | ||
| 5 | + | ||
| 6 | + | ||
| 7 | +class Api(ApiTemplate): | ||
| 8 | + api_name = "注册主机" | ||
| 9 | + | ||
| 10 | + def para_check(self): | ||
| 11 | + if not self.para.get("host"): | ||
| 12 | + raise Exception("缺乏host参数") | ||
| 13 | + if not self.para.get("user"): | ||
| 14 | + raise Exception("缺乏user参数") | ||
| 15 | + if not self.para.get("type"): | ||
| 16 | + raise Exception("缺乏type参数") | ||
| 17 | + if not self.para.get("passwd"): | ||
| 18 | + raise Exception("缺乏passwd参数") | ||
| 19 | + | ||
| 20 | + def process(self): | ||
| 21 | + | ||
| 22 | + # 返回结果 | ||
| 23 | + res = {} | ||
| 24 | + res["data"] = {} | ||
| 25 | + try: | ||
| 26 | + host = self.para.get("host") # server | ||
| 27 | + user = self.para.get("user") | ||
| 28 | + password = self.para.get("passwd") | ||
| 29 | + type = self.para.get("type") | ||
| 30 | + host_name = self.para.get("host_name") | ||
| 31 | + srcid = uuid.uuid1().__str__() | ||
| 32 | + | ||
| 33 | + if(db.session.query(MonitorHost.host).filter(MonitorHost.host == host).count() > 0): | ||
| 34 | + res['message'] = '禁止重复注册host' | ||
| 35 | + res["result"] = False | ||
| 36 | + else: | ||
| 37 | + monitorHost = MonitorHost( | ||
| 38 | + srcid=srcid, host=host, user=user, password=password, type=type, host_name=host_name) | ||
| 39 | + db.session.add(monitorHost) | ||
| 40 | + db.session.commit() | ||
| 41 | + res['data'] = {'host': host, 'srcid': srcid} | ||
| 42 | + res["result"] = True | ||
| 43 | + except Exception as e: | ||
| 44 | + db.session.rollback() | ||
| 45 | + raise e | ||
| 46 | + return res | ||
| 47 | + | ||
| 48 | + api_doc = { | ||
| 49 | + "tags": ["监控接口"], | ||
| 50 | + "parameters": [ | ||
| 51 | + {"name": "host", | ||
| 52 | + "in": "formData", | ||
| 53 | + "type": "string", | ||
| 54 | + "description": "主机地址", | ||
| 55 | + "required": "true"}, | ||
| 56 | + {"name": "user", | ||
| 57 | + "in": "formData", | ||
| 58 | + "type": "string", | ||
| 59 | + "description": "用户", | ||
| 60 | + "required": "true"}, | ||
| 61 | + {"name": "passwd", | ||
| 62 | + "in": "formData", | ||
| 63 | + "type": "string", | ||
| 64 | + "description": "密码", | ||
| 65 | + "required": "true"}, | ||
| 66 | + {"name": "type", | ||
| 67 | + "in": "formData", | ||
| 68 | + "type": "string", | ||
| 69 | + "description": "服务器类型", | ||
| 70 | + "required": "true"}, | ||
| 71 | + {"name": "host_name", | ||
| 72 | + "in": "formData", | ||
| 73 | + "type": "string", | ||
| 74 | + "description": "主机名"} | ||
| 75 | + ], | ||
| 76 | + "responses": { | ||
| 77 | + 200: { | ||
| 78 | + "schema": { | ||
| 79 | + "properties": { | ||
| 80 | + } | ||
| 81 | + } | ||
| 82 | + } | ||
| 83 | + } | ||
| 84 | + } |
app/modules/monitor/monitor_host_delete.py
0 → 100644
| 1 | +from .models import MonitorHost, db | ||
| 2 | +from sqlalchemy import and_ | ||
| 3 | +from app.util.component.ApiTemplate import ApiTemplate | ||
| 4 | +import uuid | ||
| 5 | + | ||
| 6 | + | ||
| 7 | +class Api(ApiTemplate): | ||
| 8 | + api_name = "注销主机" | ||
| 9 | + | ||
| 10 | + def para_check(self): | ||
| 11 | + if not self.para.get("srcid"): | ||
| 12 | + raise Exception("缺乏host参数") | ||
| 13 | + | ||
| 14 | + def process(self): | ||
| 15 | + | ||
| 16 | + # 返回结果 | ||
| 17 | + res = {} | ||
| 18 | + res["data"] = {} | ||
| 19 | + try: | ||
| 20 | + srcid = self.para.get("srcid") # server | ||
| 21 | + monitor_host = MonitorHost.query.filter_by( | ||
| 22 | + srcid=srcid).one_or_none() | ||
| 23 | + if monitor_host: | ||
| 24 | + db.session.delete(monitor_host) | ||
| 25 | + db.session.commit() | ||
| 26 | + res["result"] = True | ||
| 27 | + res["message"] = "删除成功,srcid:{}".format(srcid) | ||
| 28 | + else: | ||
| 29 | + res['message'] = 'host不存在,无法注销' | ||
| 30 | + res["result"] = False | ||
| 31 | + except Exception as e: | ||
| 32 | + db.session.rollback() | ||
| 33 | + raise e | ||
| 34 | + return res | ||
| 35 | + | ||
| 36 | + api_doc = { | ||
| 37 | + "tags": ["监控接口"], | ||
| 38 | + "parameters": [ | ||
| 39 | + {"name": "srcid", | ||
| 40 | + "in": "formData", | ||
| 41 | + "type": "string", | ||
| 42 | + "description": "srcid值", | ||
| 43 | + "required": "true"} | ||
| 44 | + ], | ||
| 45 | + "responses": { | ||
| 46 | + 200: { | ||
| 47 | + "schema": { | ||
| 48 | + "properties": { | ||
| 49 | + } | ||
| 50 | + } | ||
| 51 | + } | ||
| 52 | + } | ||
| 53 | + } |
app/modules/monitor/monitor_host_edit.py
0 → 100644
| 1 | +from .models import MonitorHost, MonitorLog, db | ||
| 2 | +from sqlalchemy import and_ | ||
| 3 | +from app.util.component.ApiTemplate import ApiTemplate | ||
| 4 | +import uuid | ||
| 5 | + | ||
| 6 | + | ||
| 7 | +class Api(ApiTemplate): | ||
| 8 | + api_name = "编辑主机配置" | ||
| 9 | + | ||
| 10 | + def para_check(self): | ||
| 11 | + if not self.para.get("srcid"): | ||
| 12 | + raise Exception("缺乏host参数") | ||
| 13 | + | ||
| 14 | + def process(self): | ||
| 15 | + | ||
| 16 | + # 返回结果 | ||
| 17 | + res = {} | ||
| 18 | + res["data"] = {} | ||
| 19 | + try: | ||
| 20 | + srcid = self.para.get("srcid") # server | ||
| 21 | + passwd = self.para.get("passwd") | ||
| 22 | + host_name = self.para.get("host_name") | ||
| 23 | + # Catalog.query.filter_by(guid=self.para.get("guid")).update({"name":self.para.get("name")}) | ||
| 24 | + | ||
| 25 | + if passwd or host_name: | ||
| 26 | + monitor_host = MonitorHost.query.filter_by(srcid=srcid) | ||
| 27 | + if passwd: | ||
| 28 | + monitor_host.update({"password": passwd}) | ||
| 29 | + if host_name: | ||
| 30 | + monitor_host.update({"host_name": host_name}) | ||
| 31 | + db.session.commit() | ||
| 32 | + | ||
| 33 | + res["result"] = True | ||
| 34 | + res["message"] = "更新成功".format(srcid) | ||
| 35 | + | ||
| 36 | + except Exception as e: | ||
| 37 | + db.session.rollback() | ||
| 38 | + raise e | ||
| 39 | + return res | ||
| 40 | + | ||
| 41 | + api_doc = { | ||
| 42 | + "tags": ["监控接口"], | ||
| 43 | + "parameters": [ | ||
| 44 | + {"name": "srcid", | ||
| 45 | + "in": "formData", | ||
| 46 | + "type": "string", | ||
| 47 | + "description": "srcid值", | ||
| 48 | + "required": "true"}, | ||
| 49 | + {"name": "host_name", | ||
| 50 | + "in": "formData", | ||
| 51 | + "type": "string", | ||
| 52 | + "description": "主机名"}, | ||
| 53 | + {"name": "passwd", | ||
| 54 | + "in": "formData", | ||
| 55 | + "type": "string", | ||
| 56 | + "description": "密码"} | ||
| 57 | + ], | ||
| 58 | + "responses": { | ||
| 59 | + 200: { | ||
| 60 | + "schema": { | ||
| 61 | + "properties": { | ||
| 62 | + } | ||
| 63 | + } | ||
| 64 | + } | ||
| 65 | + } | ||
| 66 | + } |
app/modules/monitor/monitor_host_list.py
0 → 100644
| 1 | +from sqlalchemy.sql.functions import func | ||
| 2 | +from .models import MonitorHost, db | ||
| 3 | +from sqlalchemy import and_ | ||
| 4 | +from app.util.component.ApiTemplate import ApiTemplate | ||
| 5 | + | ||
| 6 | + | ||
| 7 | +class Api(ApiTemplate): | ||
| 8 | + api_name = "监控主机列表" | ||
| 9 | + | ||
| 10 | + def process(self): | ||
| 11 | + | ||
| 12 | + # 返回结果 | ||
| 13 | + res = {} | ||
| 14 | + res["data"] = [] | ||
| 15 | + logs = [] | ||
| 16 | + try: | ||
| 17 | + datas = db.session.query( | ||
| 18 | + MonitorHost.host.label("host"), MonitorHost.srcid.label( | ||
| 19 | + "srcid"), MonitorHost.type.label("type"), | ||
| 20 | + MonitorHost.host_name.label("host_name"), | ||
| 21 | + MonitorHost.user.label("user")).all() | ||
| 22 | + res["data"] = list(map(lambda data: | ||
| 23 | + {'host': data.host, 'srcid': data.srcid, | ||
| 24 | + 'type': data.type, 'host_name': data.host_name, | ||
| 25 | + 'user': data.user}, | ||
| 26 | + datas)) | ||
| 27 | + res["result"] = True | ||
| 28 | + except Exception as e: | ||
| 29 | + raise e | ||
| 30 | + return res | ||
| 31 | + | ||
| 32 | + api_doc = { | ||
| 33 | + "tags": ["监控接口"], | ||
| 34 | + "parameters": [ | ||
| 35 | + ], | ||
| 36 | + "responses": { | ||
| 37 | + 200: { | ||
| 38 | + "schema": { | ||
| 39 | + "properties": { | ||
| 40 | + } | ||
| 41 | + } | ||
| 42 | + } | ||
| 43 | + } | ||
| 44 | + } |
app/modules/monitor/monitor_info.py
0 → 100644
| 1 | +# coding=utf-8 | ||
| 2 | +#author: 4N | ||
| 3 | +#createtime: 2021/7/9 | ||
| 4 | +#email: nheweijun@sina.com | ||
| 5 | + | ||
| 6 | +from app.models import * | ||
| 7 | + | ||
| 8 | +from app.util.component.ApiTemplate import ApiTemplate | ||
| 9 | +from app.util.component.ModelVisitor import ModelVisitor | ||
| 10 | +import psutil | ||
| 11 | + | ||
| 12 | +class Api(ApiTemplate): | ||
| 13 | + api_name = "监控" | ||
| 14 | + | ||
| 15 | + def process(self): | ||
| 16 | + | ||
| 17 | + # 返回结果 | ||
| 18 | + res = {} | ||
| 19 | + res["data"] = {} | ||
| 20 | + try: | ||
| 21 | + # 业务逻辑 | ||
| 22 | + cpu_count = psutil.cpu_count(False) | ||
| 23 | + cpu_per = int(psutil.cpu_percent()) | ||
| 24 | + res["data"]["cpu"] ={"count":cpu_count,"percent":"{}%".format(cpu_per)} | ||
| 25 | + | ||
| 26 | + | ||
| 27 | + mem_total = int(psutil.virtual_memory()[0]) | ||
| 28 | + mem_used = int(psutil.virtual_memory()[3]) | ||
| 29 | + mem_per = int(psutil.virtual_memory()[2]) | ||
| 30 | + | ||
| 31 | + network_sent = int(psutil.net_io_counters()[0] / 8 ) # 每秒接受的kb | ||
| 32 | + network_recv = int(psutil.net_io_counters()[1] / 8 ) | ||
| 33 | + | ||
| 34 | + res["data"]["memory"] = { | ||
| 35 | + 'total': self.format_value(mem_total), | ||
| 36 | + 'used': self.format_value(mem_used), | ||
| 37 | + 'percent': "{}%".format(mem_per) | ||
| 38 | + } | ||
| 39 | + | ||
| 40 | + | ||
| 41 | + | ||
| 42 | + | ||
| 43 | + | ||
| 44 | + res["data"]["network"] = { | ||
| 45 | + 'sent': self.format_value(network_sent), | ||
| 46 | + 'recv': self.format_value(network_recv) | ||
| 47 | + } | ||
| 48 | + | ||
| 49 | + | ||
| 50 | + res["result"] = True | ||
| 51 | + except Exception as e: | ||
| 52 | + raise e | ||
| 53 | + return res | ||
| 54 | + | ||
| 55 | + api_doc = { | ||
| 56 | + | ||
| 57 | + "tags": ["监控接口"], | ||
| 58 | + "parameters": [ | ||
| 59 | + ], | ||
| 60 | + "responses": { | ||
| 61 | + 200: { | ||
| 62 | + "schema": { | ||
| 63 | + "properties": { | ||
| 64 | + } | ||
| 65 | + } | ||
| 66 | + } | ||
| 67 | + } | ||
| 68 | + } | ||
| 69 | + | ||
| 70 | + def format_value(self,value): | ||
| 71 | + if value>1024**3: | ||
| 72 | + value = "{}GB".format(format(value/1024.0**3,'.1f')) | ||
| 73 | + elif value>1024**2: | ||
| 74 | + value = "{}MB".format(format(value / 1024.0 ** 2, '.1f')) | ||
| 75 | + elif value>1024: | ||
| 76 | + value = "{}KB".format(format(value / 1024.0, '.1f')) | ||
| 77 | + else: | ||
| 78 | + value = "{}B".format(format(value, '.1f')) | ||
| 79 | + return value |
app/modules/monitor/monitoring.py
0 → 100644
| 1 | +from app.models import * | ||
| 2 | +from app.util.component.ApiTemplate import ApiTemplate | ||
| 3 | +import json | ||
| 4 | +import os | ||
| 5 | + | ||
| 6 | +class Api(ApiTemplate): | ||
| 7 | + api_name = "远程监控" | ||
| 8 | + | ||
| 9 | + def process(self): | ||
| 10 | + | ||
| 11 | + # 返回结果 | ||
| 12 | + res = {} | ||
| 13 | + res["data"] = {} | ||
| 14 | + try: | ||
| 15 | + base_dir = os.getcwd() | ||
| 16 | + | ||
| 17 | + # 监控文件 | ||
| 18 | + monitor_filepath = os.path.join(base_dir, 'file', 'monitor_log.txt') | ||
| 19 | + monitor_file = open(monitor_filepath, "r") | ||
| 20 | + log = monitor_file.read() | ||
| 21 | + monitor_file.close() | ||
| 22 | + res["data"]=json.loads(log) | ||
| 23 | + res["result"] = True | ||
| 24 | + except Exception as e: | ||
| 25 | + raise e | ||
| 26 | + return res | ||
| 27 | + | ||
| 28 | + api_doc = { | ||
| 29 | + | ||
| 30 | + "tags": ["监控接口"], | ||
| 31 | + "parameters": [ | ||
| 32 | + ], | ||
| 33 | + "responses": { | ||
| 34 | + 200: { | ||
| 35 | + "schema": { | ||
| 36 | + "properties": { | ||
| 37 | + } | ||
| 38 | + } | ||
| 39 | + } | ||
| 40 | + } | ||
| 41 | + } | ||
| 42 | + | ||
| 43 | + def format_value(self, value): | ||
| 44 | + # 1024*1024*1024 | ||
| 45 | + if value > 1_073_741_824: | ||
| 46 | + value = "{}GB".format(format(value/1_073_741_824, '.1f')) | ||
| 47 | + elif value > 1024**2: | ||
| 48 | + value = "{}MB".format(format(value / 1_048_576, '.1f')) | ||
| 49 | + elif value > 1024: | ||
| 50 | + # 1024*1024 | ||
| 51 | + value = "{}KB".format(format(value / 1024.0, '.1f')) | ||
| 52 | + else: | ||
| 53 | + value = "{}B".format(format(value, '.1f')) | ||
| 54 | + return value | ||
| 55 | + | ||
| 56 | + | ||
| 57 | + def Mb_format_value(self,value): | ||
| 58 | + if value > 1024: | ||
| 59 | + value = "{}GB".format(format(value/1024, '.1f')) | ||
| 60 | + else: | ||
| 61 | + value = "{}MB".format(format(value, '.1f')) | ||
| 62 | + return value |
app/modules/monitor/schedule.py
0 → 100644
| 1 | +# import schedule | ||
| 2 | +import os | ||
| 3 | +import paramiko | ||
| 4 | +from .models import MonitorHost, MonitorLog | ||
| 5 | +import datetime | ||
| 6 | +import math | ||
| 7 | +import time | ||
| 8 | +import uuid | ||
| 9 | +import schedule | ||
| 10 | +from app.util.component.RunContinuous import run_continuously | ||
| 11 | +from app.util.component.PGUtil import PGUtil | ||
| 12 | +import configure | ||
| 13 | + | ||
| 14 | + | ||
| 15 | +def background_job(): | ||
| 16 | + 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 | + | ||
| 37 | + sys_session = PGUtil.get_db_session( | ||
| 38 | + configure.SQLALCHEMY_DATABASE_URI) | ||
| 39 | + sys_ds = PGUtil.open_pg_data_source( | ||
| 40 | + 0, configure.SQLALCHEMY_DATABASE_URI) | ||
| 41 | + | ||
| 42 | + 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 | + | ||
| 155 | + | ||
| 156 | +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() | ||
| 161 | + # Do some other things... | ||
| 162 | + # # Stop the background thread | ||
| 163 | + # time.sleep(10) | ||
| 164 | + # 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 |
app/util/component/RunContinuous.py
0 → 100644
| 1 | +import schedule | ||
| 2 | +import threading | ||
| 3 | +import time | ||
| 4 | + | ||
| 5 | +##多线程类 | ||
| 6 | +def run_continuously(interval=1): | ||
| 7 | + """Continuously run, while executing pending jobs at each | ||
| 8 | + elapsed time interval. | ||
| 9 | + @return cease_continuous_run: threading. Event which can | ||
| 10 | + be set to cease continuous run. Please note that it is | ||
| 11 | + *intended behavior that run_continuously() does not run | ||
| 12 | + missed jobs*. For example, if you've registered a job that | ||
| 13 | + should run every minute and you set a continuous run | ||
| 14 | + interval of one hour then your job won't be run 60 times | ||
| 15 | + at each interval but only once. | ||
| 16 | + """ | ||
| 17 | + cease_continuous_run = threading.Event() | ||
| 18 | + | ||
| 19 | + class ScheduleThread(threading.Thread): | ||
| 20 | + @classmethod | ||
| 21 | + def run(cls): | ||
| 22 | + while not cease_continuous_run.is_set(): | ||
| 23 | + schedule.run_pending() | ||
| 24 | + time.sleep(interval) | ||
| 25 | + | ||
| 26 | + continuous_thread = ScheduleThread() | ||
| 27 | + #启动 | ||
| 28 | + continuous_thread.start() | ||
| 29 | + return cease_continuous_run |
| @@ -4,10 +4,12 @@ import logging | @@ -4,10 +4,12 @@ import logging | ||
| 4 | deploy_ip_host = "172.26.40.105:8840" | 4 | deploy_ip_host = "172.26.40.105:8840" |
| 5 | # 系统数据库 | 5 | # 系统数据库 |
| 6 | 6 | ||
| 7 | + | ||
| 7 | # SQLALCHEMY_DATABASE_URI = "postgresql://postgres:chinadci@172.26.60.100:5432/dmap_manager_test" | 8 | # SQLALCHEMY_DATABASE_URI = "postgresql://postgres:chinadci@172.26.60.100:5432/dmap_manager_test" |
| 8 | SQLALCHEMY_DATABASE_URI = "postgresql://postgres:chinadci@172.26.60.100:5432/dmap_manager" | 9 | SQLALCHEMY_DATABASE_URI = "postgresql://postgres:chinadci@172.26.60.100:5432/dmap_manager" |
| 9 | # SQLALCHEMY_DATABASE_URI = "postgresql://postgres:postgres@localhost:5433/dmap_dms_test" | 10 | # SQLALCHEMY_DATABASE_URI = "postgresql://postgres:postgres@localhost:5433/dmap_dms_test" |
| 10 | 11 | ||
| 12 | + | ||
| 11 | # 指定精华表所在位置(必须为空间库),设置为None则存放在各自的实体库中 | 13 | # 指定精华表所在位置(必须为空间库),设置为None则存放在各自的实体库中 |
| 12 | #VACUATE_DB_URI = None | 14 | #VACUATE_DB_URI = None |
| 13 | VACUATE_DB_URI = SQLALCHEMY_DATABASE_URI | 15 | VACUATE_DB_URI = SQLALCHEMY_DATABASE_URI |
| @@ -2,8 +2,11 @@ | @@ -2,8 +2,11 @@ | ||
| 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 | os.environ['AUTHLIB_INSECURE_TRANSPORT'] = '1' | 7 | os.environ['AUTHLIB_INSECURE_TRANSPORT'] = '1' |
| 6 | app: Flask = create_app() | 8 | app: Flask = create_app() |
| 7 | if __name__ == '__main__': | 9 | if __name__ == '__main__': |
| 10 | + # start_schedule() | ||
| 8 | app.run(host="0.0.0.0", port="8840", threaded=True, debug=True) | 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) | 12 | # app.run(host="0.0.0.0", port="8840", threaded=True) |
请
注册
或
登录
后发表评论