From 484332b147b7711cc0d64f498d9f005d9b1a050c Mon Sep 17 00:00:00 2001 From: "StarsL.cn" Date: Thu, 3 Nov 2022 02:05:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=98=BF=E9=87=8C=E4=BA=91?= =?UTF-8?q?=E3=80=81=E8=85=BE=E8=AE=AF=E4=BA=91=E7=9A=84RDS=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- flask-consul/requirements.txt | 14 +++-- flask-consul/units/cloud/alicloud.py | 73 +++++++++++++++++++++-- flask-consul/units/cloud/tencent_cloud.py | 53 ++++++++++++++++ vue-consul/src/main.js | 2 +- vue-consul/src/views/dashboard/index.vue | 8 ++- vue-consul/src/views/rds/grafana.vue | 3 +- 6 files changed, 138 insertions(+), 15 deletions(-) diff --git a/flask-consul/requirements.txt b/flask-consul/requirements.txt index 4c5217c..652a57c 100644 --- a/flask-consul/requirements.txt +++ b/flask-consul/requirements.txt @@ -15,10 +15,12 @@ huaweicloudsdkecs==3.1.5 huaweicloudsdkeps==3.1.5 huaweicloudsdkbss==3.1.5 huaweicloudsdkrds==3.1.5 -alibabacloud_resourcemanager20200331==2.1.0 -alibabacloud_ecs20140526==2.1.0 +alibabacloud_resourcemanager20200331==2.1.1 +alibabacloud_ecs20140526==2.1.1 +alibabacloud_rds20140815==2.1.1 alibabacloud_bssopenapi20171214==2.0.5 -tencentcloud-sdk-python-common==3.0.607 -tencentcloud-sdk-python-cvm==3.0.607 -tencentcloud-sdk-python-dcdb==3.0.607 -tencentcloud-sdk-python-billing==3.0.607 +tencentcloud-sdk-python-common==3.0.763 +tencentcloud-sdk-python-cvm==3.0.763 +tencentcloud-sdk-python-cdb==3.0.763 +tencentcloud-sdk-python-dcdb==3.0.763 +tencentcloud-sdk-python-billing==3.0.763 diff --git a/flask-consul/units/cloud/alicloud.py b/flask-consul/units/cloud/alicloud.py index 5db4f91..33f9b6e 100644 --- a/flask-consul/units/cloud/alicloud.py +++ b/flask-consul/units/cloud/alicloud.py @@ -1,17 +1,21 @@ -from alibabacloud_resourcemanager20200331.client import Client as ResourceManager20200331Client +from Tea.exceptions import TeaException from alibabacloud_tea_openapi import models as open_api_models +from alibabacloud_tea_util import models as util_models +from alibabacloud_tea_util.client import Client as UtilClient + +from alibabacloud_resourcemanager20200331.client import Client as ResourceManager20200331Client from alibabacloud_resourcemanager20200331 import models as resource_manager_20200331_models from alibabacloud_ecs20140526.client import Client as Ecs20140526Client from alibabacloud_ecs20140526 import models as ecs_20140526_models -from Tea.exceptions import TeaException from alibabacloud_bssopenapi20171214.client import Client as BssOpenApi20171214Client from alibabacloud_bssopenapi20171214 import models as bss_open_api_20171214_models -from alibabacloud_tea_util import models as util_models -from alibabacloud_tea_util.client import Client as UtilClient +from alibabacloud_rds20140815.client import Client as Rds20140815Client +from alibabacloud_rds20140815 import models as rds_20140815_models import sys,datetime,hashlib from units import consul_kv,consul_svc from units.cloud import sync_ecs +from units.cloud import sync_rds from units.cloud import notify def exp(account,collect_days,notify_days,notify_amount): @@ -168,3 +172,64 @@ def ecs(account,region): except Exception as e: data = {'count':'无','update':f'失败','status':50000,'msg':str(e)} consul_kv.put_kv(f'ConsulManager/record/jobs/alicloud/{account}/ecs/{region}', data) + +def rds(account,region): + ak,sk = consul_kv.get_aksk('alicloud',account) + now = datetime.datetime.now().strftime('%m.%d/%H:%M') + group_dict = consul_kv.get_value(f'ConsulManager/assets/alicloud/group/{account}') + + config = open_api_models.Config(access_key_id=ak,access_key_secret=sk) + config.endpoint = 'rds.aliyuncs.com' + client = Rds20140815Client(config) + + try: + runtime = util_models.RuntimeOptions() + describe_dbinstances_request = rds_20140815_models.DescribeDBInstancesRequest( + max_results=100, + region_id=region + ) + rdsbaseinfo = client.describe_dbinstances_with_options(describe_dbinstances_request, runtime) + rdsbase_list = rdsbaseinfo.body.to_map()['Items']["DBInstance"] + + + describe_dbinstances_as_csv_request = rds_20140815_models.DescribeDBInstancesAsCsvRequest(region_id=region) + rdsplusinfo = client.describe_dbinstances_as_csv_with_options(describe_dbinstances_as_csv_request, runtime) + rdsplus_list = rdsplusinfo.body.to_map()['Items']["DBInstanceAttribute"] + + rds_dict = {i['DBInstanceId']:{'name':i['DBInstanceDescription'], + 'domain':i['ConnectionString'], + 'ip':i['ConnectionString'], + 'port':3306, + 'region':region, + 'group':group_dict.get(i['ResourceGroupId'],'无'), + 'status':i['DBInstanceStatus'], + 'itype':i['DBInstanceType'], + 'ver':i['EngineVersion'], + 'exp': '-' if i['ExpireTime'] == None else i['ExpireTime'].split('T')[0] + } for i in rdsbase_list} + + rds_plus = {i['DBInstanceId']:{'cpu':f"{i['DBInstanceCPU']}核", + 'mem':f"{round(i['DBInstanceMemory']/1024)}GB", + 'disk':f"{i['DBInstanceStorage']}GB" + } for i in rdsplus_list} + for k,v in rds_plus.items(): + rds_dict[k].update(v) + + count = len(rds_dict) + off,on = sync_rds.w2consul('alicloud',account,region,rds_dict) + data = {'count':count,'update':now,'status':20000,'on':on,'off':off,'msg':f'rds同步成功!总数:{count},开机:{on},关机:{off}'} + consul_kv.put_kv(f'ConsulManager/record/jobs/alicloud/{account}/rds/{region}', data) + print('【JOB】===>', 'alicloud_rds', account,region, data, flush=True) + except TeaException as e: + emsg = e.message.split('. ',1)[0] + print("【code:】",e.code,"\n【message:】",emsg, flush=True) + data = consul_kv.get_value(f'ConsulManager/record/jobs/alicloud/{account}/rds/{region}') + if data == {}: + data = {'count':'无','update':f'失败{e.code}','status':50000,'msg':emsg} + else: + data['update'] = f'失败{e.code}' + data['msg'] = emsg + consul_kv.put_kv(f'ConsulManager/record/jobs/alicloud/{account}/rds/{region}', data) + except Exception as e: + data = {'count':'无','update':f'失败','status':50000,'msg':str(e)} + consul_kv.put_kv(f'ConsulManager/record/jobs/alicloud/{account}/rds/{region}', data) diff --git a/flask-consul/units/cloud/tencent_cloud.py b/flask-consul/units/cloud/tencent_cloud.py index 451f250..16e8f0e 100644 --- a/flask-consul/units/cloud/tencent_cloud.py +++ b/flask-consul/units/cloud/tencent_cloud.py @@ -9,7 +9,9 @@ import sys,datetime,hashlib #import consul_kv,sync_ecs from units import consul_kv from units.cloud import sync_ecs +from units.cloud import sync_rds from units.cloud import notify + def exp(account,collect_days,notify_days,notify_amount): from tencentcloud.billing.v20180709 import billing_client, models ak,sk = consul_kv.get_aksk('tencent_cloud',account) @@ -161,3 +163,54 @@ def ecs(account,region): except Exception as e: data = {'count':'无','update':f'失败','status':50000,'msg':str(e)} consul_kv.put_kv(f'ConsulManager/record/jobs/tencent_cloud/{account}/ecs/{region}', data) + +def rds(account,region): + from tencentcloud.cdb.v20170320 import cdb_client, models + ak,sk = consul_kv.get_aksk('tencent_cloud',account) + now = datetime.datetime.now().strftime('%m.%d/%H:%M') + group_dict = consul_kv.get_value(f'ConsulManager/assets/tencent_cloud/group/{account}') + try: + cred = credential.Credential(ak, sk) + httpProfile = HttpProfile() + httpProfile.endpoint = "cdb.tencentcloudapi.com" + + clientProfile = ClientProfile() + clientProfile.httpProfile = httpProfile + client = cdb_client.CdbClient(cred, region, clientProfile) + req = models.DescribeDBInstancesRequest() + params = {"Limit": 2000} + req.from_json_string(json.dumps(params)) + resp = client.DescribeDBInstances(req) + rds_list = resp.Items + total = resp.TotalCount + rds_dict = {i.InstanceId:{'name':i.InstanceName, + 'domain':i.Vip, + 'ip':i.Vip, + 'port':i.Vport, + 'region':region, + 'group':group_dict.get(str(i.ProjectId),'无'), + 'status': '运行中' if i.Status == 1 else '非运行中', + 'itype':{1:'主实例',2:'灾备实例',3:'只读实例'}[i.InstanceType], + 'ver':i.EngineVersion, + 'exp': '-' if i.DeadlineTime == "0000-00-00 00:00:00" else i.DeadlineTime.split(' ')[0], + 'cpu':f"{i.Cpu}核", + 'mem':f"{round(i.Memory/1024)}GB", + 'disk':f"{i.Volume}GB" + } for i in rds_list} + count = len(rds_dict) + off,on = sync_rds.w2consul('tencent_cloud',account,region,rds_dict) + data = {'count':count,'update':now,'status':20000,'on':on,'off':off,'msg':f'rds同步成功!总数:{count},开机:{on},关机:{off}'} + consul_kv.put_kv(f'ConsulManager/record/jobs/tencent_cloud/{account}/rds/{region}', data) + print('【JOB】===>', 'tencent_cloud_rds', account,region, data, flush=True) + except TencentCloudSDKException as err: + print(err, flush=True) + data = consul_kv.get_value(f'ConsulManager/record/jobs/tencent_cloud/{account}/rds/{region}') + if data == {}: + data = {'count':'无','update':f'失败','status':50000,'msg':str(err)} + else: + data['update'] = f'失败' + data['msg'] = str(err) + consul_kv.put_kv(f'ConsulManager/record/jobs/tencent_cloud/{account}/rds/{region}', data) + except Exception as e: + data = {'count':'无','update':f'失败','status':50000,'msg':str(e)} + consul_kv.put_kv(f'ConsulManager/record/jobs/tencent_cloud/{account}/rds/{region}', data) diff --git a/vue-consul/src/main.js b/vue-consul/src/main.js index 2888b0a..93f5282 100644 --- a/vue-consul/src/main.js +++ b/vue-consul/src/main.js @@ -46,7 +46,7 @@ Object.keys(filters).forEach(key => { }) Vue.config.productionTip = false -Vue.prototype.VER = 'v0.9.1' +Vue.prototype.VER = 'v0.9.2' new Vue({ el: '#app', diff --git a/vue-consul/src/views/dashboard/index.vue b/vue-consul/src/views/dashboard/index.vue index 354b947..16e4a1c 100644 --- a/vue-consul/src/views/dashboard/index.vue +++ b/vue-consul/src/views/dashboard/index.vue @@ -4,11 +4,13 @@ StarsL.cn - + -

v0.9.0

+

v0.9.2

镜像存储更换到华为云,请查看仓库根目录下的docker-compose.yml,更新您的镜像地址。

-

增加RDS云数据库监控接入:支持同步华为云的RDS信息到Consul并接入到Prometheus监控!

+

增加RDS云数据库监控接入:支持同步华为云、阿里云、腾讯云的RDS信息到Consul并接入到Prometheus监控!

+

更新了阿里云、华为云、腾讯云的SDK。

+

优化了菜单展示,资源分类更加直观。

增加了MySQL的Grafana监控看板。

增加了从Consul同步RDS到Prometheus的配置生成界面,可生成Prometheus的配置。

增加了RDS的Prometheus告警规则信息生成页面。

diff --git a/vue-consul/src/views/rds/grafana.vue b/vue-consul/src/views/rds/grafana.vue index 5ced0b2..cbbae08 100644 --- a/vue-consul/src/views/rds/grafana.vue +++ b/vue-consul/src/views/rds/grafana.vue @@ -5,7 +5,8 @@ Grafana 看板详情: - 如何优雅的使用一个mysqld_exporter监控所有的MySQL实例

+ https://grafana.com/grafana/dashboards/17320

+ Grafana 看板ID:17320