from datetime import datetime from typing import Optional import pytz from alibabacloud_r_kvstore20150101.client import Client as KVStoreClient from alibabacloud_r_kvstore20150101.models import * from alibabacloud_tea_openapi import models from resource.enums.region import Region from resource.enums.resource import Resource from resource.monitor.basic_monitor import BasicMonitor from resource.utils import * charge_type_map = { "PrePaid": "预付费", "PostPaid": "后付费", } architecture_type_map = { "cluster": "集群版", "standard": "标准版", "rwsplit": "读写分离版" } status_map = { "Normal": "正常", "Creating": "创建中", "Changing": "修改中", "Inactive": "被禁用", "Flushing": "清除中", "Released": "已释放", "Transforming": "转换中", "Unavailable": "服务停止", "Error": "创建失败", "Migrating": "迁移中", "BackupRecovering": "备份恢复中", "MinorVersionUpgrading": "小版本升级中", "NetworkModifying": "网络变更中", "SSLModifying": "SSL 变更中", "MajorVersionUpgrading": "大版本升级中,可正常访问" } class KVStoreMonitor(BasicMonitor): resource = Resource.KV_STORE def __init__(self): super().__init__() self.region_client_map: Dict[Region, KVStoreClient] = {} self.fei_shu_sheet_id = "25dce4" def create_client(self, region: Region) -> KVStoreClient: config = models.Config( access_key_id=self.access_key_id, access_key_secret=self.access_key_secret, endpoint=region.kv_store_endpoint, ) return KVStoreClient(config) def get_kvstore_client(self, region: Region) -> KVStoreClient: if region in self.region_client_map: return self.region_client_map[region] client = self.create_client(region) self.region_client_map[region] = client return client def get_all_instance(self, region: Region) -> List[DescribeInstancesResponseBodyInstancesKVStoreInstance]: page_number = 1 result: List[DescribeInstancesResponseBodyInstancesKVStoreInstance] = [] while True: response = self.describe_instances(region, page_number) if not response or not response.kvstore_instance: break result.extend(response.kvstore_instance) page_number += 1 return result def describe_instances(self, region: Region, page_number: int = 1, page_size: int = 50) -> Optional[DescribeInstancesResponseBodyInstances]: request = DescribeInstancesRequest(region_id=region.region, page_number=page_number, page_size=page_size) client = self.get_kvstore_client(region) return client.describe_instances(request).body.instances def describe_instance_attribute(self, instance_id: str, region: Region) -> Optional[List[DescribeInstanceAttributeResponseBodyInstancesDBInstanceAttribute]]: request = DescribeInstanceAttributeRequest(instance_id=instance_id) response = self.get_kvstore_client(region).describe_instance_attribute(request) return response.body.instances.dbinstance_attribute def describe_history_monitor_values(self, instance_id: str, region: Region, start_time: datetime, end_time: datetime, monitor_keys: str) -> Optional[DescribeHistoryMonitorValuesResponseBody]: request = DescribeHistoryMonitorValuesRequest( instance_id=instance_id, start_time=start_time.astimezone(pytz.UTC).strftime('%Y-%m-%dT%H:%M:%SZ'), end_time=end_time.astimezone(pytz.UTC).strftime('%Y-%m-%dT%H:%M:%SZ'), monitor_keys=monitor_keys, interval_for_history="01m" ) response = self.get_kvstore_client(region).describe_history_monitor_values(request) return response.body def run(self): region_list = [Region.HANG_ZHOU, Region.HONG_KONG, Region.US_WEST, Region.SOUTHEAST] for region in region_list: all_instances = self.get_all_instance(region=region) for instance in all_instances: dt = datetime.now().strftime('%Y-%m-%d') instance_id = instance.instance_id # 实例ID instance_name = instance.instance_name # 实例名 instance_status = value_with_mapped_note(instance.instance_status, status_map) # 实例状态 instance_type = instance.instance_type # 实例类型 zone_id = instance.zone_id # 可用区ID architecture_type = value_with_mapped_note(instance.architecture_type, architecture_type_map) # 架构类型 engine_version = instance.engine_version # 兼容的Redis版本 charge_type = value_with_mapped_note(instance.charge_type, charge_type_map) # 付费类型 capacity = convert_storage_unit(instance.capacity, "mb", "gb") # 容量 values = [[dt, region.desc, zone_id, instance_id, instance_name, instance_status, instance_type, architecture_type, engine_version, charge_type, capacity]] start_col = "A2" end_col = calculate_excel_range_bottom_right_cell(start_col, values) self.fei_shu_service.spreadsheet_values_prepend( self.fei_shu_tenant_access_token(), self.fei_shu_spread_sheet_token, f"{self.fei_shu_sheet_id}!{start_col}:{end_col}", values )