diff --git a/flask-consul/manager.py b/flask-consul/manager.py index d058409..c4b5c24 100755 --- a/flask-consul/manager.py +++ b/flask-consul/manager.py @@ -7,7 +7,7 @@ skey_path = 'ConsulManager/assets/secret/skey' if consul_kv.get_kv_dict(skey_path) == {}: consul_kv.put_kv(skey_path,{'sk':''.join(str(uuid.uuid4()).split('-'))}) -from views import login, blackbox, consul, jobs, nodes, selfnode, selfrds, avd, exp, jms, edit_cloud, ldap, rds +from views import login, blackbox, consul, jobs, nodes, selfnode, selfrds, selfredis, avd, exp, jms, edit_cloud, ldap, rds, redis from views.prom import cloud_mysql_metrics from units.cloud import huaweicloud,alicloud,tencent_cloud from units.avd import avd_list @@ -24,6 +24,7 @@ app.register_blueprint(jobs.blueprint) app.register_blueprint(nodes.blueprint) app.register_blueprint(selfnode.blueprint) app.register_blueprint(selfrds.blueprint) +app.register_blueprint(selfredis.blueprint) app.register_blueprint(avd.blueprint) app.register_blueprint(exp.blueprint) app.register_blueprint(jms.blueprint) @@ -31,6 +32,8 @@ app.register_blueprint(edit_cloud.blueprint) app.register_blueprint(cloud_mysql_metrics.blueprint) app.register_blueprint(ldap.blueprint) app.register_blueprint(rds.blueprint) +app.register_blueprint(redis.blueprint) + class Config(object): JOBS = [] SCHEDULER_API_ENABLED = True diff --git a/flask-consul/requirements.txt b/flask-consul/requirements.txt index ec9d27c..2b02321 100644 --- a/flask-consul/requirements.txt +++ b/flask-consul/requirements.txt @@ -11,12 +11,13 @@ xlrd==1.2.0 pycryptodome==3.14.1 beautifulsoup4==4.11.1 ldap3==2.9.1 -huaweicloudsdkcore==3.1.8 -huaweicloudsdkecs==3.1.8 -huaweicloudsdkeps==3.1.8 -huaweicloudsdkbss==3.1.8 -huaweicloudsdkrds==3.1.8 -huaweicloudsdkces==3.1.8 +huaweicloudsdkcore==3.1.11 +huaweicloudsdkecs==3.1.11 +huaweicloudsdkeps==3.1.11 +huaweicloudsdkbss==3.1.11 +huaweicloudsdkrds==3.1.11 +huaweicloudsdkces==3.1.11 +huaweicloudsdkdcs==3.1.11 alibabacloud_resourcemanager20200331==2.1.1 alibabacloud_ecs20140526==2.1.1 alibabacloud_rds20140815==2.1.1 diff --git a/flask-consul/units/cloud/huaweicloud.py b/flask-consul/units/cloud/huaweicloud.py index 2d8a35a..7084ef6 100644 --- a/flask-consul/units/cloud/huaweicloud.py +++ b/flask-consul/units/cloud/huaweicloud.py @@ -8,10 +8,13 @@ from huaweicloudsdkecs.v2 import * from huaweicloudsdkecs.v2.region.ecs_region import EcsRegion from huaweicloudsdkrds.v3 import * from huaweicloudsdkrds.v3.region.rds_region import RdsRegion +from huaweicloudsdkdcs.v2 import * +from huaweicloudsdkdcs.v2.region.dcs_region import DcsRegion import sys,datetime,hashlib from units import consul_kv from units.cloud import sync_ecs from units.cloud import sync_rds +from units.cloud import sync_redis from units.cloud import notify def exp(account,collect_days,notify_days,notify_amount): @@ -220,3 +223,53 @@ def rds(account,region): except Exception as e: data = {'count':'无','update':f'失败','status':50000,'msg':str(e)} consul_kv.put_kv(f'ConsulManager/record/jobs/huaweicloud/{account}/rds/{region}', data) + +def redis(account,region): + ak,sk = consul_kv.get_aksk('huaweicloud',account) + now = datetime.datetime.now().strftime('%m.%d/%H:%M') + group_dict = consul_kv.get_value(f'ConsulManager/assets/huaweicloud/group/{account}') + credentials = BasicCredentials(ak, sk) + try: + client = DcsClient.new_builder() \ + .with_credentials(credentials) \ + .with_region(DcsRegion.value_of(region)) \ + .build() + request = ListInstancesRequest() + request.include_failure = "false" + request.include_delete = "false" + request.limit = 1000 + info = client.list_instances(request).to_dict()['instances'] + + redis_dict = {i['instance_id']:{'name':i['name'], + 'domain':i['domain_name'], + 'ip':i['ip'], + 'port':i['port'], + 'region':region, + 'group':group_dict[i['enterprise_project_id']], + 'status':i['status'], + 'itype':i['spec_code'], + 'ver':i['engine_version'], + 'mem':f"{i['max_memory']}MB", + 'exp': '-' + } for i in info} + count = len(redis_dict) + off,on = sync_redis.w2consul('huaweicloud',account,region,redis_dict) + data = {'count':count,'update':now,'status':20000,'on':on,'off':off,'msg':f'REDIS同步成功!总数:{count},开机:{on},关机:{off}'} + consul_kv.put_kv(f'ConsulManager/record/jobs/huaweicloud/{account}/redis/{region}', data) + print('【JOB】===>', 'huaweicloud_redis', account,region, data, flush=True) + except exceptions.ClientRequestException as e: + print(e.status_code, flush=True) + print(e.request_id, flush=True) + print(e.error_code, flush=True) + print(e.error_msg, flush=True) + data = consul_kv.get_value(f'ConsulManager/record/jobs/huaweicloud/{account}/redis/{region}') + if data == {}: + data = {'count':'无','update':f'失败{e.status_code}','status':50000,'on':0,'off':0,'msg':e.error_msg} + else: + data['update'] = f'失败{e.status_code}' + data['msg'] = e.error_msg + consul_kv.put_kv(f'ConsulManager/record/jobs/huaweicloud/{account}/redis/{region}', data) + except Exception as e: + data = {'count':'无','update':f'失败','status':50000,'msg':str(e)} + consul_kv.put_kv(f'ConsulManager/record/jobs/huaweicloud/{account}/redis/{region}', data) + diff --git a/flask-consul/units/cloud/sync_redis.py b/flask-consul/units/cloud/sync_redis.py new file mode 100644 index 0000000..10f6839 --- /dev/null +++ b/flask-consul/units/cloud/sync_redis.py @@ -0,0 +1,76 @@ +#!/usr/bin/python3 +import requests,json +from units import consul_kv +from config import consul_token,consul_url,vendors,regions +headers = {'X-Consul-Token': consul_token} +geturl = f'{consul_url}/agent/services' +delurl = f'{consul_url}/agent/service/deregister' +puturl = f'{consul_url}/agent/service/register' +def w2consul(vendor,account,region,redis_dict): + service_name = f'{vendor}_{account}_redis' + params = {'filter': f'Service == "{service_name}" and "{region}" in Tags and Meta.account == "{account}"'} + try: + consul_redis_iid_list = requests.get(geturl, headers=headers, params=params).json().keys() + except: + consul_redis_iid_list = [] + + #在consul中删除云厂商不存在的redis + for del_redis in [x for x in consul_redis_iid_list if x not in redis_dict.keys()]: + dereg = requests.put(f'{delurl}/{del_redis}', headers=headers) + if dereg.status_code == 200: + print({"code": 20000,"data": f"{account}-删除成功!"}, flush=True) + else: + print({"code": 50000,"data": f'{dereg.status_code}:{dereg.text}'}, flush=True) + off,on = 0,0 + for k,v in redis_dict.items(): + iid = k + #对consul中关机的redis做标记。 + if v['status'] in ['SHUTDOWN']: + off = off + 1 + tags = ['shutoff',v['itype'],v['ver'], region] + stat = 'off' + else: + on = on + 1 + tags = [v['itype'],v['ver'],region] + stat = 'on' + custom_redis = consul_kv.get_value(f'ConsulManager/assets/sync_redis_custom/{iid}') + port = custom_redis.get('port') + ip = custom_redis.get('ip') + if port == None: + port = v['port'] + if ip == None: + ip = v['ip'] + instance = f'{ip}:{port}' + data = { + 'id': iid, + 'name': service_name, + 'Address': ip, + 'port': port, + 'tags': tags, + 'Meta': { + 'iid': iid, + 'name': v['name'], + 'region': regions[vendor].get(region,'未找到'), + 'group': v['group'], + 'instance': instance, + 'account': account, + 'itype': v['itype'], + 'vendor': vendors.get(vendor,'未找到'), + 'mem': v['mem'], + 'ver': v['ver'], + 'domain':v['domain'], + 'stat': stat + }, + "check": { + "tcp": f"{ip}:{port}", + "interval": "60s" + } + } + reg = requests.put(puturl, headers=headers, data=json.dumps(data)) + if reg.status_code == 200: + pass + #print({f"{account}:code": 20000,"data": "增加成功!"}, flush=True) + else: + print({f"{account}:code": 50000,"data": f'{reg.status_code}:{reg.text}'}, flush=True) + #return {"code": 50000,"data": f'{reg.status_code}:{reg.text}'} + return off,on diff --git a/flask-consul/units/selfredis_manager.py b/flask-consul/units/selfredis_manager.py new file mode 100644 index 0000000..e2fb4c3 --- /dev/null +++ b/flask-consul/units/selfredis_manager.py @@ -0,0 +1,72 @@ +import requests,json +import sys +sys.path.append("..") +from config import consul_token,consul_url + +headers = {'X-Consul-Token': consul_token} + +def get_all_list(vendor,account,region,group): + vendor = f'and Meta.vendor=="{vendor}"' if vendor != '' else f'and Meta.vendor != ""' + account = f'and Meta.account=="{account}"' if account != '' else f'and Meta.account != ""' + region = f'and Meta.region=="{region}"' if region != '' else f'and Meta.region != ""' + group = f'and Meta.group=="{group}"' if group != '' else f'and Meta.group != ""' + url = f'{consul_url}/agent/services?filter=Service == selfredis_exporter {vendor} {account} {region} {group}' + response = requests.get(url, headers=headers) + if response.status_code == 200: + info = response.json() + all_list = [i['Meta'] for i in info.values()] + vendor_list = sorted(list(set([i['vendor'] for i in all_list]))) + account_list = sorted(list(set([i['account'] for i in all_list]))) + region_list = sorted(list(set([i['region'] for i in all_list]))) + group_list = sorted(list(set([i['group'] for i in all_list]))) + return {'code': 20000,'all_list':all_list,'vendor_list':vendor_list, + 'account_list':account_list,'region_list':region_list,'group_list':group_list} + else: + return {'code': 50000, 'data': f'{response.status_code}:{response.text}'} + +def get_service(): + response = requests.get(f'{consul_url}/agent/services?filter=Service == selfredis_exporter', headers=headers) + if response.status_code == 200: + info = response.json() + all_list = [i['Meta'] for i in info.values()] + vendor_list = sorted(list(set([i['vendor'] for i in all_list]))) + account_list = sorted(list(set([i['account'] for i in all_list]))) + region_list = sorted(list(set([i['region'] for i in all_list]))) + group_list = sorted(list(set([i['group'] for i in all_list]))) + return {'code': 20000,'all_list':all_list,'vendor_list':vendor_list, + 'account_list':account_list,'region_list':region_list,'group_list':group_list} + else: + return {'code': 50000, 'data': f'{response.status_code}:{response.text}'} + +def add_service(vendor,account,region,group,name,ip,port,os): + if port is None or name is None: + return {"code": 50000, "data": f"名称或IP不能为空!"} + sid = f"{vendor}/{account}/{region}/{group}@{name}" + instance = f'{ip}:{port}' + if '//' in sid or sid.startswith('/') or sid.endswith('/'): + return {"code": 50000, "data": f"服务ID【{sid}】首尾不能包含'/',并且不能包含两个连续的'/'"} + data = { + "id": sid, + "name": 'selfredis_exporter', + 'Address': ip, + 'port': int(port), + "tags": [vendor,os], + "Meta": {'vendor':vendor,'account':account,'region':region,'group':group, + 'name':name,'instance':instance,'os':os}, + "check": {"tcp": instance,"interval": "60s"} + } + reg = requests.put(f'{consul_url}/agent/service/register', headers=headers, data=json.dumps(data)) + if reg.status_code == 200: + return {"code": 20000, "data": f"【{sid}】增加成功!"} + else: + return {"code": 50000, "data": f"{reg.status_code}【{sid}】{reg.text}"} + +def del_service(vendor,account,region,group,name): + sid = f"{vendor}/{account}/{region}/{group}@{name}" + reg = requests.put(f'{consul_url}/agent/service/deregister/{sid}', headers=headers) + if reg.status_code == 200: + return {"code": 20000, "data": f"【{sid}】删除成功!"} + else: + print(f"{reg.status_code}【{sid}】{reg.text}") + return {"code": 50000, "data": f"{reg.status_code}【{sid}】{reg.text}"} + diff --git a/flask-consul/units/upload.py b/flask-consul/units/upload.py index d6fa49c..192185d 100644 --- a/flask-consul/units/upload.py +++ b/flask-consul/units/upload.py @@ -47,6 +47,22 @@ def importconsul(row,imptype): 'name':name,'instance':instance,'os':os}, "check": {"tcp": instance,"interval": "60s"} } + elif imptype == 'selfredis': + vendor,account,region,group,name,instance,os = row + print(row) + sid = f"{vendor}/{account}/{region}/{group}@{name}" + ip = instance.split(':')[0] + port = instance.split(':')[1] + data = { + "id": sid, + "name": 'selfredis_exporter', + 'Address': ip, + 'port': int(port), + "tags": [vendor,os], + "Meta": {'vendor':vendor,'account':account,'region':region,'group':group, + 'name':name,'instance':instance,'os':os}, + "check": {"tcp": instance,"interval": "60s"} + } except Exception as e: print("【import】导入失败",e,flush=True) return {"code": 50000, "data": f"导入内容格式异常!{row}"} diff --git a/flask-consul/views/edit_cloud.py b/flask-consul/views/edit_cloud.py index 9c5f66b..acdbf30 100644 --- a/flask-consul/views/edit_cloud.py +++ b/flask-consul/views/edit_cloud.py @@ -58,6 +58,7 @@ class Edit(Resource): proj_interval = int(editjob_dict['proj_interval']) ecs_interval = int(editjob_dict['ecs_interval']) rds_interval = int(editjob_dict['rds_interval']) + redis_interval = int(editjob_dict['redis_interval']) print(editjob_dict) if editjob_dict['akskswitch']: ak = editjob_dict['ak'] @@ -73,6 +74,7 @@ class Edit(Resource): ecs_jobid = f'{vendor}/{account}/ecs/{region}' rds_jobid = f'{vendor}/{account}/rds/{region}' + redis_jobid = f'{vendor}/{account}/redis/{region}' if 'ecs' in restype: isecs = [x for x in self.job_list if x['id'] == f'{vendor}/{account}/ecs/{region}'] if len(isecs) == 1: @@ -82,7 +84,10 @@ class Edit(Resource): modjob_interval(ecs_jobid,ecs_interval) if len(isecs[0]['args']) != 3 or isextip != isecs[0]['args'][2]: - isecs[0]['args'][2] = isextip + try: + isecs[0]['args'][2] = isextip + except: + isecs[0]['args'].append(isextip) consul_kv.put_kv(f'ConsulManager/jobs/{ecs_jobid}',isecs[0]) modjob_args(ecs_jobid,isecs[0]['args']) else: @@ -121,5 +126,28 @@ class Edit(Resource): deljob(rds_jobid) except: pass + + if 'redis' in restype: + isredis = [x for x in self.job_list if x['id'] == f'{vendor}/{account}/redis/{region}'] + if len(isredis) == 1: + if redis_interval != isredis[0]['minutes']: + isredis[0]['minutes'] = redis_interval + consul_kv.put_kv(f'ConsulManager/jobs/{redis_jobid}',isredis[0]) + modjob_interval(redis_jobid,redis_interval) + else: + job_func = f"__main__:{vendor}.redis" + job_args = [account,region] + job_interval = redis_interval + addjob(redis_jobid, job_func, job_args, job_interval) + job_dict = {'id':redis_jobid,'func':job_func,'args':job_args,'minutes':job_interval, + "trigger": "interval","replace_existing": True} + consul_kv.put_kv(f'ConsulManager/jobs/{redis_jobid}',job_dict) + else: + try: + consul_kv.del_key(f'ConsulManager/jobs/{redis_jobid}') + deljob(redis_jobid) + except: + pass + return {'code': 20000, 'data': f'{vendor}/{account}/{region}:编辑成功!'} api.add_resource(Edit, '/api/edit/') diff --git a/flask-consul/views/redis.py b/flask-consul/views/redis.py new file mode 100644 index 0000000..3014f2f --- /dev/null +++ b/flask-consul/views/redis.py @@ -0,0 +1,92 @@ +from flask import Blueprint +from flask_restful import reqparse, Resource, Api +from flask_apscheduler import APScheduler +#import sys +#sys.path.append("..") +from units import token_auth,consul_kv,gen_config,consul_svc + +blueprint = Blueprint('redis',__name__) +api = Api(blueprint) + +parser = reqparse.RequestParser() +parser.add_argument('job_id',type=str) +parser.add_argument('services_dict',type=dict) +parser.add_argument('cst_redis_dict',type=dict) +parser.add_argument('iid',type=str) +parser.add_argument('jobredis_name',type=str) +parser.add_argument('checked',type=str) + +class Redis(Resource): + decorators = [token_auth.auth.login_required] + def get(self, stype): + job_id = parser.parse_args()['job_id'] + if stype == 'jobredis': + jobredis = consul_kv.get_keys_list('ConsulManager/jobs') + jobredis_list = [i.split('/jobs/')[1] for i in jobredis if '/redis/' in i] + return {'code': 20000,'jobredis':jobredis_list} + elif stype == 'redis_services': + jobecs = consul_kv.get_keys_list('ConsulManager/jobs') + jobecs_list = [i.split('/jobs/')[1] for i in jobecs if '/redis/' in i] + services_list = [] + for i in jobecs_list: + serivces = i.split("/") + services_list.append(f'{serivces[0]}_{serivces[1]}_{serivces[2]}') + return {'code': 20000,'services_list': sorted(set(services_list))} + elif stype == 'redisrules': + return gen_config.get_redisrules() + elif stype == 'cstredisconf': + args = parser.parse_args() + iid = args['iid'] + cst_redis_config = consul_kv.get_value(f'ConsulManager/assets/sync_redis_custom/{iid}') + cst_redis_config.update({'iid': iid,'ipswitch': False,'portswitch': False}) + if 'ip' in cst_redis_config and cst_redis_config['ip'] != '': + cst_redis_config['ipswitch'] = True + if 'port' in cst_redis_config and cst_redis_config['port'] != '': + cst_redis_config['portswitch'] = True + return {'code': 20000, 'cst_redis': cst_redis_config} + elif stype == 'cstredislist': + args = parser.parse_args() + jobredis_name = args['jobredis_name'] + checked = args['checked'] + cst_redis_dict = consul_kv.get_kv_dict('ConsulManager/assets/sync_redis_custom/') + cst_redis_keylist = [k.split('/')[-1] for k,v in cst_redis_dict.items() if v != {}] + redis_info = consul_kv.get_res_services(jobredis_name) + if checked == 'false': + return redis_info + else: + cst_redis_list = [i for i in redis_info['res_list'] if i['iid'] in cst_redis_keylist] + return {'code': 20000, 'res_list': cst_redis_list} + + def post(self, stype): + if stype == 'redispconfig': + args = parser.parse_args() + services_dict = args['services_dict'] + return gen_config.redis_config(services_dict['jobredis_list'],services_dict['cm_exporter'],services_dict['services_list'],services_dict['exporter']) + elif stype == 'cstredis': + args = parser.parse_args() + cst_redis_dict = args['cst_redis_dict'] + consul_redis_cst = {} + iid = cst_redis_dict['iid'] + try: + sid_dict = consul_svc.get_sid(iid)['instance'] + if cst_redis_dict['portswitch'] and cst_redis_dict['port'] != '': + consul_redis_cst['port'] = int(cst_redis_dict['port']) + sid_dict['Port'] = consul_redis_cst['port'] + if cst_redis_dict['ipswitch'] and cst_redis_dict['ip'] != '': + consul_redis_cst['ip'] = cst_redis_dict['ip'] + sid_dict['Address'] = consul_redis_cst['ip'] + consul_kv.put_kv(f'ConsulManager/assets/sync_redis_custom/{iid}',consul_redis_cst) + del sid_dict['Weights'] + del sid_dict['ContentHash'] + del sid_dict['Datacenter'] + sid_dict['name'] = sid_dict.pop('Service') + sid_dict['Meta']['instance'] = f"{sid_dict['Address']}:{sid_dict['Port']}" + sid_dict["check"] = { "tcp": sid_dict['Meta']['instance'],"interval": "60s" } + consul_svc.del_sid(iid) + consul_svc.add_sid(sid_dict) + return {'code': 20000, 'data': '自定义实例信息修改成功!'} + except Exception as e: + print(e,flush=True) + return {'code': 50000, "data": '提交自定义实例信息格式错误!'} + +api.add_resource(Redis, '/api/redis/') diff --git a/flask-consul/views/selfredis.py b/flask-consul/views/selfredis.py new file mode 100644 index 0000000..43460e2 --- /dev/null +++ b/flask-consul/views/selfredis.py @@ -0,0 +1,69 @@ +from flask import Blueprint +from flask_restful import reqparse, Resource, Api +import sys +sys.path.append("..") +from units import token_auth,selfredis_manager +from werkzeug.datastructures import FileStorage +from units import upload + +blueprint = Blueprint('selfredis',__name__) +api = Api(blueprint) + +parser = reqparse.RequestParser() +parser.add_argument('vendor',type=str) +parser.add_argument('account',type=str) +parser.add_argument('region',type=str) +parser.add_argument('group',type=str) +parser.add_argument('name',type=str) +parser.add_argument('ip',type=str) +parser.add_argument('port',type=str) +parser.add_argument('os',type=str) +parser.add_argument('del_dict',type=dict) +parser.add_argument('up_dict',type=dict) +parser.add_argument('file',type=FileStorage, location="files", help="File is wrong.") + +class Upload(Resource): + @token_auth.auth.login_required + def post(self): + file = parser.parse_args().get("file") + try: + return upload.read_execl(file.read(),'selfredis') + except Exception as e: + print("【selfredis】导入失败",e,flush=True) + return {"code": 50000, "data": f"导入失败!"} + +class GetAllList(Resource): + @token_auth.auth.login_required + def get(self): + args = parser.parse_args() + return selfredis_manager.get_all_list(args['vendor'],args['account'],args['region'],args['group']) + +class SelfredisApi(Resource): + decorators = [token_auth.auth.login_required] + def get(self): + return selfredis_manager.get_service() + def post(self): + args = parser.parse_args() + print('=======\n',args,flush=True) + return selfredis_manager.add_service(args['vendor'],args['account'],args['region'], + args['group'],args['name'],args['ip'],args['port'],args['os']) + def put(self): + args = parser.parse_args() + del_dict = args['del_dict'] + up_dict = args['up_dict'] + resp_del = selfredis_manager.del_service(del_dict['vendor'],del_dict['account'], + del_dict['region'],del_dict['group'],del_dict['name']) + resp_add = selfredis_manager.add_service(up_dict['vendor'],up_dict['account'],up_dict['region'], + up_dict['group'],up_dict['name'],up_dict['ip'], + up_dict['port'],up_dict['os']) + if resp_del["code"] == 20000 and resp_add["code"] == 20000: + return {"code": 20000, "data": f"更新成功!"} + else: + return {"code": 50000, "data": f"更新失败!"} + def delete(self): + args = parser.parse_args() + return selfredis_manager.del_service(args['vendor'],args['account'],args['region'],args['group'],args['name']) + +api.add_resource(GetAllList,'/api/selfredis/alllist') +api.add_resource(SelfredisApi, '/api/selfredis/service') +api.add_resource(Upload,'/api/selfredis/upload') diff --git a/vue-consul/src/api/redis.js b/vue-consul/src/api/redis.js new file mode 100644 index 0000000..1a54678 --- /dev/null +++ b/vue-consul/src/api/redis.js @@ -0,0 +1,61 @@ +import request from '@/utils/request-ops' + +export function getResList(job_id) { + return request({ + url: '/api/nodes/res', + method: 'get', + params: { job_id } + }) +} + +export function getJobRedis() { + return request({ + url: '/api/redis/jobredis', + method: 'get' + }) +} + +export function getRedisServicesList() { + return request({ + url: '/api/redis/redis_services', + method: 'get' + }) +} + +export function getRedisConfig(services_dict) { + return request({ + url: '/api/redis/redispconfig', + method: 'post', + data: { services_dict } + }) +} +export function getRedisRules() { + return request({ + url: '/api/redis/redisrules', + method: 'get' + }) +} + +export function postCstRedis(cst_redis_dict) { + return request({ + url: '/api/redis/cstredis', + method: 'post', + data: { cst_redis_dict } + }) +} + +export function getCstRedisConfig(iid) { + return request({ + url: '/api/redis/cstredisconf', + method: 'get', + params: { iid } + }) +} + +export function getCstRedisList(jobredis_name, checked) { + return request({ + url: '/api/redis/cstredislist', + method: 'get', + params: { jobredis_name, checked } + }) +} diff --git a/vue-consul/src/api/selfredis.js b/vue-consul/src/api/selfredis.js new file mode 100644 index 0000000..a428d1f --- /dev/null +++ b/vue-consul/src/api/selfredis.js @@ -0,0 +1,37 @@ +import request from '@/utils/request-ops' + +export function getAllList(vendor, account, region, group) { + return request({ + url: '/api/selfredis/alllist', + method: 'get', + params: { vendor, account, region, group } + }) +} + +export function getAllInfo() { + return request({ + url: '/api/selfredis/service', + method: 'get' + }) +} +export function addService(data) { + return request({ + url: '/api/selfredis/service', + method: 'post', + data + }) +} +export function updateService(del_dict, up_dict) { + return request({ + url: '/api/selfredis/service', + method: 'put', + data: { del_dict, up_dict } + }) +} +export function delService(data) { + return request({ + url: '/api/selfredis/service', + method: 'delete', + data + }) +} diff --git a/vue-consul/src/router/index.js b/vue-consul/src/router/index.js index 4ceaafe..c03782f 100644 --- a/vue-consul/src/router/index.js +++ b/vue-consul/src/router/index.js @@ -182,6 +182,44 @@ export const constantRoutes = [ meta: { title: 'Grafana 看板', icon: 'el-icon-data-line' } } ] + }, + { + path: 'redis', + name: 'REDIS', + component: () => import('@/views/redis/index'), + meta: { title: 'REDIS管理', icon: 'el-icon-guide' }, + children: [ + { + path: 'lists', + name: '云REDIS列表', + component: () => import('@/views/redis/lists'), + meta: { title: '云REDIS列表', icon: 'el-icon-cloudy' } + }, + { + path: 'self', + name: '自建REDIS管理', + component: () => import('@/views/redis/self'), + meta: { title: '自建REDIS管理', icon: 'el-icon-s-platform' } + }, + { + path: 'pconfig', + name: 'redis-pconfig', + component: () => import('@/views/redis/pconfig'), + meta: { title: 'Prometheus 配置', icon: 'el-icon-set-up' } + }, + { + path: 'rules', + name: 'redis-rules', + component: () => import('@/views/redis/rules'), + meta: { title: '告警规则', icon: 'el-icon-bell' } + }, + { + path: 'grafana', + name: 'redis-grafana', + component: () => import('@/views/redis/grafana'), + meta: { title: 'Grafana 看板', icon: 'el-icon-data-line' } + } + ] } ] }, diff --git a/vue-consul/src/views/node-exporter/jobs.vue b/vue-consul/src/views/node-exporter/jobs.vue index 0e33260..bfe5d20 100644 --- a/vue-consul/src/views/node-exporter/jobs.vue +++ b/vue-consul/src/views/node-exporter/jobs.vue @@ -86,7 +86,7 @@ - + @@ -123,6 +123,7 @@ 分组 ECS MySQL + REDIS @@ -145,6 +146,9 @@ + + + - + @@ -194,6 +198,7 @@ 分组 ECS MySQL + REDIS @@ -216,6 +221,9 @@ + + +