# !/usr/bin/python
# coding=utf-8

import json
import datetime
import sys
from multiprocessing import Process as pro
from aliyunsdkcore import client

ACCEPT_FORMAT = 'json'
API_ID="L11111111111111111111"
API_KEY="ekElR22222222222222222222222222"
API_REGION="cn-qingdao"
DATA_FILE_PATH = "/home/test/rds_monitor/tmp/"
PERFORMANCE_ITEM = "MySQL_InnoDBBufferRatio,MySQL_InnoDBDataReadWriten,MySQL_InnoDBLogRequests,MySQL_InnoDBLogWrites,MySQL_InnoDBBufferRatio,MySQL_NetworkTraffic,MySQL_QPSTPS,MySQL_Sessions,MySQL_TempDiskTableCreates,MySQL_COMDML,MySQL_RowDML,MySQL_MemCpuUsage,MySQL_IOPS,MySQL_DetailedSpaceUsage,slavestat"


def describe_db_instances(**instance_set):
    # RDS实例列表
    from aliyunsdkrds.request.v20140815 import DescribeDBInstancesRequest
    request = DescribeDBInstancesRequest.DescribeDBInstancesRequest()
    request.set_accept_format(ACCEPT_FORMAT)
    clt = client.AcsClient(API_ID, API_KEY, API_REGION)
    response = clt.do_action_with_exception(request)
    json_response = json.loads(response)
    for i in range(0, json_response["TotalRecordCount"] - 1 + 1):
        db_instance_id = json_response["Items"]["DBInstance"][i]["DBInstanceId"]
        instance_set[db_instance_id] = json_response["Items"]["DBInstance"][i]["DBInstanceDescription"]
    return instance_set


def describe_db_instance_attribute(db_instance_id,**key_value_dic):
    # 查看RDS实例详情
    from aliyunsdkrds.request.v20140815 import DescribeDBInstanceAttributeRequest
    request = DescribeDBInstanceAttributeRequest.DescribeDBInstanceAttributeRequest()
    request.set_accept_format(ACCEPT_FORMAT)
    request.set_DBInstanceId(db_instance_id);

    clt = client.AcsClient(API_ID, API_KEY, API_REGION)
    response = clt.do_action_with_exception(request)
    json_response = json.loads(response)
    key_value_dic["DBInstanceAttribute_DBInstanceDescription"] = json_response["Items"]["DBInstanceAttribute"][0][
        "DBInstanceDescription"]
    key_value_dic["DBInstanceAttribute_Category"] = json_response["Items"]["DBInstanceAttribute"][0]["Category"]
    key_value_dic["DBInstanceAttribute_LockMode"] = json_response["Items"]["DBInstanceAttribute"][0]["LockMode"]
    key_value_dic["DBInstanceAttribute_ConnectionString"] = json_response["Items"]["DBInstanceAttribute"][0][
        "ConnectionString"]
    key_value_dic["DBInstanceAttribute_CreationTime"] = json_response["Items"]["DBInstanceAttribute"][0]["CreationTime"]
    key_value_dic["DBInstanceAttribute_DBInstanceNetType"] = json_response["Items"]["DBInstanceAttribute"][0][
        "DBInstanceNetType"]
    key_value_dic["DBInstanceAttribute_MaxConnections"] = json_response["Items"]["DBInstanceAttribute"][0][
        "MaxConnections"]
    key_value_dic["DBInstanceAttribute_Engine"] = json_response["Items"]["DBInstanceAttribute"][0]["Engine"]
    key_value_dic["DBInstanceAttribute_ExpireTime"] = json_response["Items"]["DBInstanceAttribute"][0]["ExpireTime"]
    key_value_dic["DBInstanceAttribute_DBInstanceMemory"] = json_response["Items"]["DBInstanceAttribute"][0][
        "DBInstanceMemory"]
    key_value_dic["DBInstanceAttribute_DBInstanceCPU"] = json_response["Items"]["DBInstanceAttribute"][0][
        "DBInstanceCPU"]
    key_value_dic["DBInstanceAttribute_DBInstanceType"] = json_response["Items"]["DBInstanceAttribute"][0][
        "DBInstanceType"]
    if json_response["Items"]["DBInstanceAttribute"][0]["DBInstanceStatus"] == "Running":
        key_value_dic["DBInstanceAttribute_DBInstanceStatus"] = 1
    else:
        key_value_dic["DBInstanceAttribute_DBInstanceStatus"] = 0
    key_value_dic["DBInstanceAttribute_AvailabilityValue"] = json_response["Items"]["DBInstanceAttribute"][0][
        "AvailabilityValue"]
    key_value_dic["DBInstanceAttribute_ZoneId"] = json_response["Items"]["DBInstanceAttribute"][0]["ZoneId"]
    key_value_dic["DBInstanceAttribute_EngineVersion"] = json_response["Items"]["DBInstanceAttribute"][0][
        "EngineVersion"]
    key_value_dic["DBInstanceAttribute_InstanceNetworkType"] = json_response["Items"]["DBInstanceAttribute"][0][
        "InstanceNetworkType"]
    key_value_dic["DBInstanceAttribute_MaxIOPS"] = json_response["Items"]["DBInstanceAttribute"][0]["MaxIOPS"]
    key_value_dic["DBInstanceAttribute_DBInstanceStorage"] = json_response["Items"]["DBInstanceAttribute"][0][
        "DBInstanceStorage"]
    key_value_dic["DBInstanceAttribute_DBInstanceId"] = json_response["Items"]["DBInstanceAttribute"][0]["DBInstanceId"]
    key_value_dic["DBInstanceAttribute_MaintainTime"] = json_response["Items"]["DBInstanceAttribute"][0]["MaintainTime"]
    key_value_dic["DBInstanceAttribute_DBInstanceClass"] = json_response["Items"]["DBInstanceAttribute"][0][
        "DBInstanceClass"]
    key_value_dic["DBInstanceAttribute_Port"] = json_response["Items"]["DBInstanceAttribute"][0]["Port"]
    return key_value_dic


def describe_resource_usage(db_instance_id,**key_value_dic):
    from aliyunsdkrds.request.v20140815 import DescribeResourceUsageRequest
    request = DescribeResourceUsageRequest.DescribeResourceUsageRequest()
    request.set_accept_format(ACCEPT_FORMAT)

    request.set_DBInstanceId(db_instance_id);
    clt = client.AcsClient(API_ID, API_KEY, API_REGION)
    response = clt.do_action_with_exception(request)
    json_response = json.loads(response)

    key_value_dic["ResourceUsage_SQLSize"] = json_response["SQLSize"]
    key_value_dic["ResourceUsage_DiskUsed"] = json_response["DiskUsed"]
    key_value_dic["ResourceUsage_LogSize"] = json_response["LogSize"]
    key_value_dic["ResourceUsage_BackupSize"] = json_response["BackupSize"]
    key_value_dic["ResourceUsage_ColdBackupSize"] = json_response["ColdBackupSize"]
    key_value_dic["ResourceUsage_DataSize"] = json_response["DataSize"]
    return key_value_dic


def describe_resource_diagnosis(db_instance_id,**key_value_dic):
    # 资源使用情况分析,可精确到300s
    # GMT to UTC
    now = datetime.datetime.now() - datetime.timedelta(hours=8)
    now_before = now - datetime.timedelta(seconds=300)
    END_TIME = now.strftime('%Y-%m-%dT%H:%MZ')
    START_TIME = now_before.strftime('%Y-%m-%dT%H:%MZ')

    from aliyunsdkrds.request.v20140815 import DescribeResourceDiagnosisRequest
    request = DescribeResourceDiagnosisRequest.DescribeResourceDiagnosisRequest()
    request.set_accept_format(ACCEPT_FORMAT)

    request.set_StartTime(START_TIME);
    request.set_EndTime(END_TIME);
    request.set_DBInstanceId(db_instance_id);

    clt = client.AcsClient(API_ID, API_KEY, API_REGION)
    response = clt.do_action_with_exception(request)
    json_response = json.loads(response)

    key_value_dic["ResourceDiagnosis_StorageMax"] = json_response["Storage"]["Max"]
    key_value_dic["ResourceDiagnosis_StorageAvg"] = json_response["Storage"]["Avg"]
    key_value_dic["ResourceDiagnosis_StorageMin"] = json_response["Storage"]["Min"]
    key_value_dic["ResourceDiagnosis_ConnectionMax"] = json_response["Connection"]["Max"]
    key_value_dic["ResourceDiagnosis_ConnectionAvg"] = json_response["Connection"]["Avg"]
    key_value_dic["ResourceDiagnosis_ConnectionMin"] = json_response["Connection"]["Min"]
    key_value_dic["ResourceDiagnosis_IOPSMax"] = json_response["IOPS"]["Max"]
    key_value_dic["ResourceDiagnosis_IOPSAvg"] = json_response["IOPS"]["Avg"]
    key_value_dic["ResourceDiagnosis_IOPSMin"] = json_response["IOPS"]["Min"]
    key_value_dic["ResourceDiagnosis_MemoryMax"] = json_response["Memory"]["Max"]
    key_value_dic["ResourceDiagnosis_MemoryAvg"] = json_response["Memory"]["Avg"]
    key_value_dic["ResourceDiagnosis_MemoryMin"] = json_response["Memory"]["Min"]
    key_value_dic["ResourceDiagnosis_CPUMax"] = json_response["CPU"]["Max"]
    key_value_dic["ResourceDiagnosis_CPUAvg"] = json_response["CPU"]["Avg"]
    key_value_dic["ResourceDiagnosis_CPUMin"] = json_response["CPU"]["Min"]
    return key_value_dic


def db_instance_performance_request(db_instance_id):
    # GMT to UTC
    now = datetime.datetime.now() - datetime.timedelta(hours=8)
    now_before = now - datetime.timedelta(seconds=300)
    END_TIME = now.strftime('%Y-%m-%dT%H:%MZ')
    START_TIME = now_before.strftime('%Y-%m-%dT%H:%MZ')

    from aliyunsdkrds.request.v20140815 import DescribeDBInstancePerformanceRequest
    request = DescribeDBInstancePerformanceRequest.DescribeDBInstancePerformanceRequest()
    request.set_accept_format(ACCEPT_FORMAT)
    request.set_DBInstanceId(db_instance_id);
    request.set_StartTime(START_TIME);
    request.set_EndTime(END_TIME);
    request.set_Key(PERFORMANCE_ITEM)
    clt = client.AcsClient(API_ID, API_KEY, API_REGION)
    response = clt.do_action_with_exception(request)
    json_response = json.loads(response)
    # print json_response
    # print json_response.keys()
    # print json_response["DBInstanceId"]
    item_total = len(json_response["PerformanceKeys"]["PerformanceKey"])
    key_value_dic = {}
    for item_no in range(item_total):
        key = json_response["PerformanceKeys"]["PerformanceKey"][item_no]["Key"]
        unit = json_response["PerformanceKeys"]["PerformanceKey"][item_no]["Unit"]
        values = json_response["PerformanceKeys"]["PerformanceKey"][item_no]["Values"]
        values_value = values["PerformanceValue"][0]["Value"]
        value_format = json_response["PerformanceKeys"]["PerformanceKey"][item_no]["ValueFormat"]
        if key == "MySQL_InnoDBBufferRatio":
            apart = values_value.index('&')
            apart_second = values_value.index('&', apart + 1)
            key_value_dic["DBInstancePerformance_InnoDBReadHit"] = values_value[0:apart]
            key_value_dic["DBInstancePerformance_InnoDBUseRatio"] = values_value[apart + 1:apart_second]
            key_value_dic["DBInstancePerformance_InnoDBDirtyRatio"] = values_value[apart_second + 1:]
        elif key == "MySQL_NetworkTraffic":
            apart = values_value.index('&')
            key_value_dic["DBInstancePerformance_NetworkTrafficRecv"] = values_value[0:apart]
            key_value_dic["DBInstancePerformance_NetworkTrafficSent"] = values_value[apart + 1:]
        elif key == "MySQL_QPSTPS":
            apart = values_value.index('&')
            key_value_dic["DBInstancePerformance_QPS"] = values_value[0:apart]
            key_value_dic["DBInstancePerformance_TPS"] = values_value[apart + 1:]
        elif key == "MySQL_Sessions":
            apart = values_value.index('&')
            key_value_dic["DBInstancePerformance_SessionsActive"] = values_value[0:apart]
            key_value_dic["DBInstancePerformance_SessionsTotal"] = values_value[apart + 1:]
        elif key == "MySQL_InnoDBDataReadWriten":
            apart = values_value.index('&')
            key_value_dic["DBInstancePerformance_InnoDBDataRead"] = values_value[0:apart]
            key_value_dic["DBInstancePerformance_InnoDBDataWriten"] = values_value[apart + 1:]
        elif key == "MySQL_InnoDBLogRequests":
            apart = values_value.index('&')
            key_value_dic["DBInstancePerformance_InnoDBLogRequestsRead"] = values_value[0:apart]
            key_value_dic["DBInstancePerformance_InnoDBLogRequestsWriten"] = values_value[apart + 1:]
        elif key == "MySQL_InnoDBLogWrites":
            apart = values_value.index('&')
            apart_second = values_value.index('&', apart + 1)
            key_value_dic["DBInstancePerformance_InnoDBLogResquests"] = values_value[0:apart]
            key_value_dic["DBInstancePerformance_InnoDBLogWrites"] = values_value[apart + 1:apart_second]
            key_value_dic["DBInstancePerformance_InnoDBLogFsyncs"] = values_value[apart_second + 1:]
        elif key == "MySQL_TempDiskTableCreates":
            key_value_dic["DBInstancePerformance_TempDiskTableCreates"] = values_value
        elif key == "MySQL_COMDML":
            apart = values_value.index('&')
            apart_second = values_value.index('&', apart + 1)
            apart_thrid = values_value.index('&', apart_second + 1)
            apart_fourth = values_value.index('&', apart_thrid + 1)
            apart_fifth = values_value.index('&', apart_fourth + 1)
            apart_sixth = values_value.index('&', apart_fifth + 1)
            key_value_dic["DBInstancePerformance_COMDML__delete"] = values_value[0:apart]
            key_value_dic["DBInstancePerformance_COMDML__insert"] = values_value[apart + 1:apart_second]
            key_value_dic["DBInstancePerformance_COMDML__insertSelect"] = values_value[apart_second + 1:apart_thrid]
            key_value_dic["DBInstancePerformance_COMDML__replace"] = values_value[apart_thrid + 1:apart_fourth]
            key_value_dic["DBInstancePerformance_COMDML__replaceSelect"] = values_value[apart_fourth + 1:apart_fifth]
            key_value_dic["DBInstancePerformance_COMDML__select"] = values_value[apart_fifth + 1:apart_sixth]
            key_value_dic["DBInstancePerformance_COMDML__update"] = values_value[apart_sixth + 1:]
        elif key == "MySQL_COMDML":
            apart = values.value.index('&')
            apart_second = values.value.index('&', apart + 1)
            apart_thrid = values.value.index('&', apart_second + 1)
            apart_fourth = values.value.index('&', apart_thrid + 1)
            key_value_dic["DBInstancePerformance_Row_readed"] = values.value[0:apart]
            key_value_dic["DBInstancePerformance_Row_update"] = values.value[apart + 1:apart_second]
            key_value_dic["DBInstancePerformance_Row_delete"] = values.value[apart_second + 1:apart_thrid]
            key_value_dic["DBInstancePerformance_Row_insert"] = values.value[apart_thrid + 1:apart_fourth]
            key_value_dic["DBInstancePerformance_Row_writes"] = values.value[apart_fourth + 1:]
        elif key == "MySQL_MemCpuUsage":
            apart = values_value.index('&')
            key_value_dic["DBInstancePerformance_MemUsage"] = 100.00 - float(values_value[0:apart])
            key_value_dic["DBInstancePerformance_CpuUsage"] = 100.00 - float(values_value[apart + 1:])
        elif key == "MySQL_IOPS":
            key_value_dic["DBInstancePerformance_IOPS"] = values_value
        elif key == "MySQL_DetailedSpaceUsage":
            apart = values_value.index('&')
            apart_second = values_value.index('&', apart + 1)
            apart_thrid = values_value.index('&', apart_second + 1)
            apart_fourth = values_value.index('&', apart_thrid + 1)
            key_value_dic["DBInstancePerformance_DetailedSpaceUsage_ins"] = values_value[0:apart]
            key_value_dic["DBInstancePerformance_DetailedSpaceUsage_data"] = values_value[apart + 1:apart_second]
            key_value_dic["DBInstancePerformance_DetailedSpaceUsage_log"] = values_value[apart_second + 1:apart_thrid]
            key_value_dic["DBInstancePerformance_DetailedSpaceUsage_tmp"] = values_value[apart_thrid + 1:apart_fourth]
            key_value_dic["DBInstancePerformance_DetailedSpaceUsage_other"] = values_value[apart_fourth + 1:]
        elif key == "slavestat":
            apart = values_value.index('&')
            apart_second = values_value.index('&', apart + 1)
            key_value_dic["DBInstancePerformance_iothread"] = values_value[0:apart]
            key_value_dic["DBInstancePerformance_sqlthread"] = values_value[apart + 1:apart_second]
            key_value_dic["DBInstancePerformance_slaveLag"] = values_value[apart_second + 1:]
        elif key == "MySQL_InnoDBBufferRatio":
            apart = values_value.index('&')
            apart_second = values_value.index('&', apart + 1)
            key_value_dic["DBInstancePerformance_InnoDBReadHit"] = values_value[0:apart]
            key_value_dic["DBInstancePerformance_InnoDBUseRatio"] = values_value[apart + 1:apart_second]
            key_value_dic["DBInstancePerformance_InnoDBDirtyRatio"] = values_value[apart_second + 1:]
    print key_value_dic
    return key_value_dic


def get_value(db_instance_id):
    """
    MySQL_NetworkTraffic    MySQL实例平均每秒钟的输入流量,MySQL实例平均每秒钟的输出流量。单位为KB。
    MySQL_QPSTPS    平均每秒SQL语句执行次数,平均每秒事务数
    MySQL_Sessions  当前活跃连接数,当前总连接数
    MySQL_InnoDBBufferRatio InnoDB缓冲池的读命中率,InnoDB缓冲池的利用率,InnoDB缓冲池脏块的百分率
    MySQL_InnoDBDataReadWriten  InnoDB平均每秒钟读取的数据量,InnoDB平均每秒钟写入的数据量。单位为KB
    MySQL_InnoDBLogRequests 平均每秒向InnoDB缓冲池的读次数,平均每秒向InnoDB缓冲池的写次数
    MySQL_InnoDBLogWrites   平均每秒日志写请求数,平均每秒向日志文件的物理写次数,平均每秒向日志文件完成的fsync()写数量
    MySQL_TempDiskTableCreates  MySQL执行语句时在硬盘上自动创建的临时表的数量
    MySQL_MyISAMKeyBufferRatio  MyISAM平均每秒Key Buffer利用率,MyISAM平均每秒Key Buffer读命中率,MyISAM平均每秒Key Buffer写命中率
    MySQL_MyISAMKeyReadWrites   MyISAM平均每秒钟从缓冲池中的读取次数,MyISAM平均每秒钟从缓冲池中的写入次数,MyISAM平均每秒钟从硬盘上读取的次数,MyISAM平均每秒钟从硬盘上写入的次数
    MySQL_COMDML    平均每秒Delete语句执行次数,平均每秒Insert语句执行次数, 平均每秒Insert_Select语句执行次数,平均每秒Replace语句执行次数,平均每秒Replace_Select语句执行次数,平均每秒Select语句执行次数,平均每秒Update语句执行次数
    MySQL_RowDML    平均每秒从InnoDB表读取的行数,平均每秒从InnoDB表更新的行数,平均每秒从InnoDB表删除的行数,平均每秒从InnoDB表插入的行数,平均每秒向日志文件的物理写次数
    MySQL_MemCpuUsage   MySQL实例CPU使用率(占操作系统总数),MySQL实例内存使用率(占操作系统总数)
    MySQL_IOPS  MySQL实例的IOPS(每秒IO请求次数)
    MySQL_DetailedSpaceUsage    MySQL实例空间占用详情:ins_size实例总空间使用量;data_size数据空间;log_size日志空间;tmp_size临时空间;other_size系统空间
    slavestat   只读实例延迟
    """
    key_value_dic = {}

    key_value_dic = db_instance_performance_request(db_instance_id);
    key_value_dic = describe_resource_diagnosis(db_instance_id,**key_value_dic);
    key_value_dic = describe_db_instance_attribute(db_instance_id,**key_value_dic);
    key_value_dic = describe_resource_usage(db_instance_id,**key_value_dic);

    data_file = DATA_FILE_PATH + db_instance_id
    with open(data_file, 'w') as fp:
        fp.write(json.dumps(key_value_dic))
        fp.close()


def main():
    instance_dict= {}
    instance_dict = describe_db_instances(**instance_dict);
    for db_instance_id in instance_dict.keys():
        t = pro(target=get_value(db_instance_id))
        t.start


if __name__ == '__main__':
    # 指定编码格式
    reload(sys)
    sys.setdefaultencoding('utf8')

    # main
    main()

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

Captcha Code