mysql_monitor.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. import uuid
  2. from datetime import datetime
  3. from typing import Dict, List, Tuple
  4. from alibabacloud_rds20140815.client import Client as RDSClient
  5. from alibabacloud_rds20140815.models import DescribeDBInstancesResponseBodyItemsDBInstance, DescribeDBInstancesRequest, DescribeDBInstanceAttributeRequest, \
  6. DescribeDBInstanceAttributeResponseBodyItemsDBInstanceAttribute
  7. from alibabacloud_tea_openapi import models
  8. from resource.enums.region import Region
  9. from resource.enums.resource import Resource
  10. from resource.monitor.basic_monitor import BasicMonitor
  11. from resource.utils import *
  12. instance_type_map = {
  13. "Primary": "主实例",
  14. "Readonly": "只读实例",
  15. "Guard": "灾备实例",
  16. "Temp": "临时实例"
  17. }
  18. status_map = {
  19. "Creating": "创建中",
  20. "Running": "使用中",
  21. "Deleting": "删除中",
  22. "Rebooting": "重启中",
  23. "Stopping": "暂停中",
  24. "Stopped": "已暂停",
  25. "DBInstanceClassChanging": "升降级中",
  26. "TRANSING": "迁移中",
  27. "EngineVersionUpgrading": "迁移版本中",
  28. "TransingToOthers": "迁移数据到其他RDS中",
  29. "GuardDBInstanceCreating": "生产灾备实例中",
  30. "Restoring": "备份恢复中",
  31. "Importing": "数据导入中",
  32. "ImportingFromOthers": "从其他RDS实例导入数据中",
  33. "DBInstanceNetTypeChanging": "内外网切换中",
  34. "GuardSwitching": "容灾切换中",
  35. "INS_CLONING": "实例克隆中",
  36. "Released": "已释放实例"
  37. }
  38. storage_type_map = {
  39. "local_ssd": "高性能本地盘",
  40. "ephemeral_ssd": "性能本地盘",
  41. "cloud_ssd": "SSD 云盘",
  42. "general_essd": "高性能云盘",
  43. "cloud_essd0": "ESSD PL0 云盘",
  44. "cloud_essd": "ESSD PL1 云盘",
  45. "cloud_essd2": "ESSD PL2 云盘",
  46. "cloud_essd3": "ESSD PL3 云盘"
  47. }
  48. pay_type_map = {
  49. "Postpaid": "按量付费",
  50. "Prepaid": "包年包月",
  51. "SERVERLESS": "Serverless"
  52. }
  53. category_map = {
  54. "Basic": "基础系列",
  55. "HighAvailability": "高可用系列",
  56. "cluster": "MySQL 集群系列",
  57. "AlwaysOn": "SQL Server 集群系列",
  58. "Finance": "三节点企业系列",
  59. "Serverless_basic": "Serverless 基础系列"
  60. }
  61. class MySQLMonitor(BasicMonitor):
  62. resource = Resource.MySQL
  63. def __init__(self):
  64. super().__init__()
  65. self.region_client_map: Dict[Region, RDSClient] = {}
  66. self.fei_shu_sheet_id = "R50CB5"
  67. def create_client(self, region: Region) -> RDSClient:
  68. config = models.Config(
  69. access_key_id=self.access_key_id,
  70. access_key_secret=self.access_key_secret,
  71. endpoint=region.rds_endpoint
  72. )
  73. return RDSClient(config)
  74. def get_rds_client(self, region: Region) -> RDSClient:
  75. if region in self.region_client_map:
  76. return self.region_client_map[region]
  77. client = self.create_client(region)
  78. self.region_client_map[region] = client
  79. return client
  80. def get_all_instance(self, region: Region) -> List[DescribeDBInstancesResponseBodyItemsDBInstance]:
  81. page_number = 0
  82. all_instances: List[DescribeDBInstancesResponseBodyItemsDBInstance] = []
  83. while True:
  84. next_token, instances = self.get_instances(region=region, page_number=page_number)
  85. if not instances:
  86. break
  87. all_instances.extend(instances)
  88. page_number += 1
  89. return all_instances
  90. def get_instances(self, region: Region, page_size: int = 100, page_number: int = 0, next_token: str = "") -> Tuple[str, List[DescribeDBInstancesResponseBodyItemsDBInstance]]:
  91. client = self.get_rds_client(region)
  92. request = DescribeDBInstancesRequest(
  93. client_token=self.gen_request_id(),
  94. page_size=page_size,
  95. page_number=page_number,
  96. region_id=region.region,
  97. instance_level=1,
  98. )
  99. response = client.describe_dbinstances(request)
  100. body = response.body
  101. return body.next_token, body.items.dbinstance
  102. def get_instance_detail(self, region: Region, instance_id: str) -> List[DescribeDBInstanceAttributeResponseBodyItemsDBInstanceAttribute]:
  103. client = self.get_rds_client(region)
  104. request = DescribeDBInstanceAttributeRequest(
  105. dbinstance_id=instance_id
  106. )
  107. response = client.describe_dbinstance_attribute(request)
  108. return response.body.items.dbinstance_attribute
  109. @staticmethod
  110. def gen_request_id():
  111. return str(uuid.uuid4()).replace("-", "")
  112. def run(self):
  113. region_list = [Region.HANG_ZHOU, Region.HONG_KONG, Region.US_WEST, Region.SOUTHEAST]
  114. for region in region_list:
  115. all_instances = self.get_all_instance(region=region)
  116. for instance in all_instances:
  117. dt = datetime.now().strftime('%Y-%m-%d')
  118. instance_id = instance.dbinstance_id
  119. instance_name = instance.dbinstance_description
  120. category = value_with_mapped_note(instance.category, category_map)
  121. memory = convert_storage_unit(instance.dbinstance_memory, "mb", "gb")
  122. cpu = instance.dbinstance_cpu
  123. status = value_with_mapped_note(instance.dbinstance_status, status_map)
  124. instance_type = value_with_mapped_note(instance.dbinstance_type, instance_type_map)
  125. engine = instance.engine
  126. engine_version = instance.engine_version
  127. zone_id = instance.zone_id
  128. attributes = self.get_instance_detail(region, instance_id)
  129. attribute = attributes[0]
  130. disk_used = convert_storage_unit(attribute.dbinstance_disk_used, "b", "gb")
  131. storage = attribute.dbinstance_storage
  132. storage_type = value_with_mapped_note(attribute.dbinstance_storage_type, storage_type_map)
  133. pay_type = value_with_mapped_note(attribute.pay_type, pay_type_map)
  134. values = [[dt, region.desc, zone_id, instance_id, instance_name, category, status, instance_type, pay_type, engine, engine_version, memory, cpu, disk_used, storage, storage_type]]
  135. start_col = "A2"
  136. end_col = calculate_excel_range_bottom_right_cell(start_col, values)
  137. self.fei_shu_service.spreadsheet_values_prepend(
  138. self.fei_shu_tenant_access_token(),
  139. self.fei_shu_spread_sheet_token,
  140. f"{self.fei_shu_sheet_id}!{start_col}:{end_col}",
  141. values
  142. )