kv_store_monitor.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. from datetime import datetime
  2. from typing import Optional
  3. import pytz
  4. from alibabacloud_r_kvstore20150101.client import Client as KVStoreClient
  5. from alibabacloud_r_kvstore20150101.models import *
  6. from alibabacloud_tea_openapi import models
  7. from resource.enums.region import Region
  8. from resource.enums.resource import Resource
  9. from resource.monitor.basic_monitor import BasicMonitor
  10. from resource.utils import *
  11. charge_type_map = {
  12. "PrePaid": "预付费",
  13. "PostPaid": "后付费",
  14. }
  15. architecture_type_map = {
  16. "cluster": "集群版",
  17. "standard": "标准版",
  18. "rwsplit": "读写分离版"
  19. }
  20. status_map = {
  21. "Normal": "正常",
  22. "Creating": "创建中",
  23. "Changing": "修改中",
  24. "Inactive": "被禁用",
  25. "Flushing": "清除中",
  26. "Released": "已释放",
  27. "Transforming": "转换中",
  28. "Unavailable": "服务停止",
  29. "Error": "创建失败",
  30. "Migrating": "迁移中",
  31. "BackupRecovering": "备份恢复中",
  32. "MinorVersionUpgrading": "小版本升级中",
  33. "NetworkModifying": "网络变更中",
  34. "SSLModifying": "SSL 变更中",
  35. "MajorVersionUpgrading": "大版本升级中,可正常访问"
  36. }
  37. class KVStoreMonitor(BasicMonitor):
  38. resource = Resource.KV_STORE
  39. def __init__(self):
  40. super().__init__()
  41. self.region_client_map: Dict[Region, KVStoreClient] = {}
  42. self.fei_shu_sheet_id = "25dce4"
  43. def create_client(self, region: Region) -> KVStoreClient:
  44. config = models.Config(
  45. access_key_id=self.access_key_id,
  46. access_key_secret=self.access_key_secret,
  47. endpoint=region.kv_store_endpoint,
  48. )
  49. return KVStoreClient(config)
  50. def get_kvstore_client(self, region: Region) -> KVStoreClient:
  51. if region in self.region_client_map:
  52. return self.region_client_map[region]
  53. client = self.create_client(region)
  54. self.region_client_map[region] = client
  55. return client
  56. def get_all_instance(self, region: Region) -> List[DescribeInstancesResponseBodyInstancesKVStoreInstance]:
  57. page_number = 1
  58. result: List[DescribeInstancesResponseBodyInstancesKVStoreInstance] = []
  59. while True:
  60. response = self.describe_instances(region, page_number)
  61. if not response or not response.kvstore_instance:
  62. break
  63. result.extend(response.kvstore_instance)
  64. page_number += 1
  65. return result
  66. def describe_instances(self, region: Region, page_number: int = 1, page_size: int = 50) -> Optional[DescribeInstancesResponseBodyInstances]:
  67. request = DescribeInstancesRequest(region_id=region.region, page_number=page_number, page_size=page_size)
  68. client = self.get_kvstore_client(region)
  69. return client.describe_instances(request).body.instances
  70. def describe_instance_attribute(self, instance_id: str, region: Region) -> Optional[List[DescribeInstanceAttributeResponseBodyInstancesDBInstanceAttribute]]:
  71. request = DescribeInstanceAttributeRequest(instance_id=instance_id)
  72. response = self.get_kvstore_client(region).describe_instance_attribute(request)
  73. return response.body.instances.dbinstance_attribute
  74. def describe_history_monitor_values(self, instance_id: str, region: Region, start_time: datetime, end_time: datetime, monitor_keys: str) -> Optional[DescribeHistoryMonitorValuesResponseBody]:
  75. request = DescribeHistoryMonitorValuesRequest(
  76. instance_id=instance_id,
  77. start_time=start_time.astimezone(pytz.UTC).strftime('%Y-%m-%dT%H:%M:%SZ'),
  78. end_time=end_time.astimezone(pytz.UTC).strftime('%Y-%m-%dT%H:%M:%SZ'),
  79. monitor_keys=monitor_keys,
  80. interval_for_history="01m"
  81. )
  82. response = self.get_kvstore_client(region).describe_history_monitor_values(request)
  83. return response.body
  84. def run(self):
  85. region_list = [Region.HANG_ZHOU, Region.HONG_KONG, Region.US_WEST, Region.SOUTHEAST]
  86. for region in region_list:
  87. all_instances = self.get_all_instance(region=region)
  88. for instance in all_instances:
  89. dt = datetime.now().strftime('%Y-%m-%d')
  90. instance_id = instance.instance_id # 实例ID
  91. instance_name = instance.instance_name # 实例名
  92. instance_status = value_with_mapped_note(instance.instance_status, status_map) # 实例状态
  93. instance_type = instance.instance_type # 实例类型
  94. zone_id = instance.zone_id # 可用区ID
  95. architecture_type = value_with_mapped_note(instance.architecture_type, architecture_type_map) # 架构类型
  96. engine_version = instance.engine_version # 兼容的Redis版本
  97. charge_type = value_with_mapped_note(instance.charge_type, charge_type_map) # 付费类型
  98. capacity = convert_storage_unit(instance.capacity, "mb", "gb") # 容量
  99. values = [[dt, region.desc, zone_id, instance_id, instance_name, instance_status, instance_type, architecture_type, engine_version, charge_type, capacity]]
  100. start_col = "A2"
  101. end_col = calculate_excel_range_bottom_right_cell(start_col, values)
  102. self.fei_shu_service.spreadsheet_values_prepend(
  103. self.fei_shu_tenant_access_token(),
  104. self.fei_shu_spread_sheet_token,
  105. f"{self.fei_shu_sheet_id}!{start_col}:{end_col}",
  106. values
  107. )