正在显示
10 个修改的文件
包含
93 行增加
和
181 行删除
| @@ -97,3 +97,39 @@ def create_app(): | @@ -97,3 +97,39 @@ def create_app(): | ||
| 97 | # start_schedule() | 97 | # start_schedule() |
| 98 | return app | 98 | return app |
| 99 | 99 | ||
| 100 | +def create_schedule(): | ||
| 101 | + monitor = Flask(__name__) | ||
| 102 | + monitor.config['SQLALCHEMY_DATABASE_URI'] = configure.SQLALCHEMY_DATABASE_URI | ||
| 103 | + monitor.config['echo'] = True | ||
| 104 | + monitor.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True | ||
| 105 | + monitor.config['JSON_AS_ASCII'] = False | ||
| 106 | + monitor.config['SECRET_KEY'] = configure.SECRET_KEY | ||
| 107 | + | ||
| 108 | + # allows cookies and credentials to be submitted across domains | ||
| 109 | + monitor.config['CORS_SUPPORTS_CREDENTIALS'] = true | ||
| 110 | + monitor.config['CORS_ORIGINS ']="*" | ||
| 111 | + | ||
| 112 | + # swagger设置 | ||
| 113 | + swagger_config = Swagger.DEFAULT_CONFIG | ||
| 114 | + swagger_config.update(configure.swagger_configure) | ||
| 115 | + Swagger(monitor, config=swagger_config) | ||
| 116 | + | ||
| 117 | + # 创建数据库 | ||
| 118 | + db.init_app(monitor) | ||
| 119 | + db.create_all(app=monitor) | ||
| 120 | + | ||
| 121 | + # 跨域设置 | ||
| 122 | + CORS(monitor) | ||
| 123 | + | ||
| 124 | + # 日志 | ||
| 125 | + logging.basicConfig(level=configure.log_level) | ||
| 126 | + log_file = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "logs", "monitor_log.txt") | ||
| 127 | + handler = logging.FileHandler(log_file, encoding='UTF-8') # 设置日志字符集和存储路径名字 | ||
| 128 | + logging_format = logging.Formatter('[%(levelname)s] %(asctime)s %(message)s') | ||
| 129 | + handler.setFormatter(logging_format) | ||
| 130 | + monitor.logger.addHandler(handler) | ||
| 131 | + | ||
| 132 | + # 不检测https | ||
| 133 | + os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1' | ||
| 134 | + start_schedule() | ||
| 135 | + return monitor |
app/modules/monitor.zip
deleted
100644 → 0
不能预览此文件类型
app/modules/monitor/backgroud_job.py
deleted
100644 → 0
| 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 |
| @@ -57,7 +57,7 @@ class Api(ApiTemplate): | @@ -57,7 +57,7 @@ class Api(ApiTemplate): | ||
| 57 | while interval_end_datatime <= end_datetime: | 57 | while interval_end_datatime <= end_datetime: |
| 58 | logs = db.session.query(MonitorInfo.time_stamp.label('key'), MonitorInfo.value).filter( | 58 | logs = db.session.query(MonitorInfo.time_stamp.label('key'), MonitorInfo.value).filter( |
| 59 | and_(MonitorInfo.time_stamp <= interval_end_datatime.strftime(format), | 59 | and_(MonitorInfo.time_stamp <= interval_end_datatime.strftime(format), |
| 60 | - MonitorInfo.time_stamp > interval_start_datetime.strftime( | 60 | + MonitorInfo.time_stamp > interval_start_datetime.strftime( |
| 61 | format), MonitorInfo.server == server, MonitorInfo.metrics == metrics_type)).order_by(MonitorInfo.time_stamp).group_by( | 61 | format), MonitorInfo.server == server, MonitorInfo.metrics == metrics_type)).order_by(MonitorInfo.time_stamp).group_by( |
| 62 | MonitorInfo.time_stamp, MonitorInfo.value).all() | 62 | MonitorInfo.time_stamp, MonitorInfo.value).all() |
| 63 | tmp_data = list(map(lambda log: | 63 | tmp_data = list(map(lambda log: |
| @@ -129,15 +129,15 @@ class Api(ApiTemplate): | @@ -129,15 +129,15 @@ class Api(ApiTemplate): | ||
| 129 | if size > 1: | 129 | if size > 1: |
| 130 | stamp = {'P0': 1, | 130 | stamp = {'P0': 1, |
| 131 | 'P50': math.floor(0.5*size), | 131 | 'P50': math.floor(0.5*size), |
| 132 | - # 'P90': math.floor(0.9*size), | ||
| 133 | - # 'P95': math.floor(0.95*size), | 132 | + 'P90': math.floor(0.9*size), |
| 133 | + 'P95': math.floor(0.95*size), | ||
| 134 | # 'P99': math.floor(0.99*size), | 134 | # 'P99': math.floor(0.99*size), |
| 135 | 'P100': size} | 135 | 'P100': size} |
| 136 | elif size == 1: | 136 | elif size == 1: |
| 137 | stamp = {'P0': 1, | 137 | stamp = {'P0': 1, |
| 138 | 'P50': size, | 138 | 'P50': size, |
| 139 | - # 'P90': size, | ||
| 140 | - # 'P95': size, | 139 | + 'P90': size, |
| 140 | + 'P95': size, | ||
| 141 | # 'P99': size, | 141 | # 'P99': size, |
| 142 | 'P100': size} | 142 | 'P100': size} |
| 143 | else: | 143 | else: |
| @@ -8,7 +8,6 @@ from flask import json | @@ -8,7 +8,6 @@ from flask import json | ||
| 8 | from .models import MonitorHost, MonitorInfo | 8 | from .models import MonitorHost, MonitorInfo |
| 9 | import datetime | 9 | import datetime |
| 10 | import math | 10 | import math |
| 11 | -import time | ||
| 12 | import uuid | 11 | import uuid |
| 13 | import schedule | 12 | import schedule |
| 14 | from app.util.component.RunContinuous import run_continuously | 13 | from app.util.component.RunContinuous import run_continuously |
| @@ -93,15 +92,15 @@ def get_sample_data(orginal, name, host): | @@ -93,15 +92,15 @@ def get_sample_data(orginal, name, host): | ||
| 93 | if size > 1: | 92 | if size > 1: |
| 94 | stamp = {'P0': 1, | 93 | stamp = {'P0': 1, |
| 95 | 'P50': math.floor(0.5*size), | 94 | 'P50': math.floor(0.5*size), |
| 96 | - # 'P90': math.floor(0.9*size), | ||
| 97 | - # 'P95': math.floor(0.95*size), | 95 | + 'P90': math.floor(0.9*size), |
| 96 | + 'P95': math.floor(0.95*size), | ||
| 98 | # 'P99': math.floor(0.99*size), | 97 | # 'P99': math.floor(0.99*size), |
| 99 | 'P100': size} | 98 | 'P100': size} |
| 100 | elif size == 1: | 99 | elif size == 1: |
| 101 | stamp = {'P0': 1, | 100 | stamp = {'P0': 1, |
| 102 | 'P50': size, | 101 | 'P50': size, |
| 103 | - # 'P90': size, | ||
| 104 | - # 'P95': size, | 102 | + 'P90': size, |
| 103 | + 'P95': size, | ||
| 105 | # 'P99': size, | 104 | # 'P99': size, |
| 106 | 'P100': size} | 105 | 'P100': size} |
| 107 | else: | 106 | else: |
| @@ -40,6 +40,7 @@ ServerRoot "/etc/httpd" | @@ -40,6 +40,7 @@ ServerRoot "/etc/httpd" | ||
| 40 | # | 40 | # |
| 41 | #Listen 12.34.56.78:80 | 41 | #Listen 12.34.56.78:80 |
| 42 | Listen 80 | 42 | Listen 80 |
| 43 | +Listen 81 | ||
| 43 | 44 | ||
| 44 | # | 45 | # |
| 45 | # Dynamic Shared Object (DSO) Support | 46 | # Dynamic Shared Object (DSO) Support |
| @@ -355,13 +356,27 @@ IncludeOptional conf.d/*.conf | @@ -355,13 +356,27 @@ IncludeOptional conf.d/*.conf | ||
| 355 | LoadModule wsgi_module "/usr/lib64/httpd/modules/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so" | 356 | LoadModule wsgi_module "/usr/lib64/httpd/modules/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so" |
| 356 | "/var/gdal" | 357 | "/var/gdal" |
| 357 | 358 | ||
| 358 | - dmapmanager processes=4 threads=16 display-name=%{GROUP} | ||
| 359 | - dmapmanager | ||
| 360 | -#Authorization请求头顺利转发 | ||
| 361 | - On | ||
| 362 | - %{GLOBAL} | 359 | +<VirtualHost *:80> |
| 360 | + dmapmanager processes=4 threads=16 display-name=%{GROUP} | ||
| 361 | + dmapmanager | ||
| 362 | + On | ||
| 363 | + %{GLOBAL} | ||
| 364 | + / /usr/src/app/run.wsgi | ||
| 365 | + <Directory /usr/> | ||
| 366 | + Require all granted | ||
| 367 | + </Directory> | ||
| 368 | +</VirtualHost> | ||
| 369 | + | ||
| 370 | +<VirtualHost *:81> | ||
| 371 | + monitormanager processes=1 threads=8 display-name=%{GROUP} | ||
| 372 | + monitormanager | ||
| 373 | + %{GLOBAL} | ||
| 374 | + / /usr/src/app/monitor.wsgi | ||
| 375 | + <Directory /usr/> | ||
| 376 | + Require all granted | ||
| 377 | + </Directory> | ||
| 378 | +</VirtualHost> | ||
| 363 | 379 | ||
| 364 | - / /usr/src/app/run.wsgi | ||
| 365 | <Directory /usr/> | 380 | <Directory /usr/> |
| 366 | Require all granted | 381 | Require all granted |
| 367 | </Directory> | 382 | </Directory> |
monitor.wsgi
0 → 100644
| @@ -21,10 +21,21 @@ port=$1 | @@ -21,10 +21,21 @@ port=$1 | ||
| 21 | echo "端口设置为$1 ..." | 21 | echo "端口设置为$1 ..." |
| 22 | fi | 22 | fi |
| 23 | 23 | ||
| 24 | +port2="" | ||
| 25 | +if [ ! -n "$2" ] ;then | ||
| 26 | +port="8841" | ||
| 27 | +echo "未设置端口2,使用默认8840端口..." | ||
| 28 | +else | ||
| 29 | +port2=$2 | ||
| 30 | +echo "端口2设置为$2 ..." | ||
| 31 | +fi | ||
| 32 | + | ||
| 33 | + | ||
| 24 | #启动容器和apache | 34 | #启动容器和apache |
| 25 | echo "正在启动容器..." | 35 | echo "正在启动容器..." |
| 26 | set="--privileged=true -e TZ="Asia/Shanghai" --restart=always -e ALLOW_IP_RANGE=0.0.0.0/0" | 36 | set="--privileged=true -e TZ="Asia/Shanghai" --restart=always -e ALLOW_IP_RANGE=0.0.0.0/0" |
| 27 | -docker run -d --name $dn $set -p $port:80 -v $curPath/logs/apache.error:/var/log/httpd/error_log -v $curPath:/usr/src/app -v $curPath/httpd.conf:/etc/httpd/conf/httpd.conf dci/dmapmanager:4.1 /usr/sbin/init | 37 | +docker run -d --name $dn $set -p $port:80 -p $port2:81 -v $curPath/logs/apache.error:/var/log/httpd/error_log -v $curPath:/usr/src/app -v $curPath/httpd.conf:/etc/httpd/conf/httpd.conf dci/dmapmanager:4.1 /usr/sbin/init |
| 28 | docker exec -d $dn systemctl start httpd | 38 | docker exec -d $dn systemctl start httpd |
| 29 | sleep 5 | 39 | sleep 5 |
| 30 | curl localhost:$port/release | 40 | curl localhost:$port/release |
| 41 | +curl localhost:$port2 |
run_monitor.py
0 → 100644
| 1 | +# coding=utf-8 | ||
| 2 | +from flask import Flask | ||
| 3 | +from app import create_schedule | ||
| 4 | +import os | ||
| 5 | +os.environ['AUTHLIB_INSECURE_TRANSPORT'] = '1' | ||
| 6 | +monitor:Flask=create_schedule() | ||
| 7 | +if __name__ == '__main__': | ||
| 8 | + monitor.run(host="0.0.0.0", port="8840", threaded=True, debug=True) | ||
| 9 | + # app.run(host="0.0.0.0", port="8840", threaded=True) |
请
注册
或
登录
后发表评论