Zabbix 监控 RDS PostgreSQL数据库–1 编写python脚本

#Zabbix Server 4.0.2 Python 3.6.8 Centos 7.8
from aliyunsdkcore import client
from aliyunsdkrds.request.v20140815 import DescribeResourceUsageRequest, DescribeDBInstancePerformanceRequest
from aliyunsdkrds.request.v20140815.DescribeDBInstanceAttributeRequest import DescribeDBInstanceAttributeRequest
import json, sys, datetime
#Author XC
#Date 2023-09-07
##资源属性
'''RDS的资源属性,cpu(DBInstanceCPU),内存(DBInstanceMemory),数据库类型(Engine),版本(EngineVersion),实例状态(DBInstanceStatus) 最大IOPS数(MaxIOPS) 最大连接数(MaxConnections) 数据库存储空间(DBInstanceStorage)创建时间等
'''
def GetResourceAttribute(DBInstancedId, Jk_key):
    ###查询rds的资源属性信息
    RequestAttribute = DescribeDBInstanceAttributeRequest()
    ##设置返回数据格式,默认为XML
    RequestAttribute.set_accept_format('json')
    ##指定要查询的那一个RDS 实例
    RequestAttribute.set_DBInstanceId(DBInstancedId)
    ResourceAttributeInfo = clt.do_action_with_exception(RequestAttribute)
    # print(ResourceAttributeInfo)
    Info = (json.loads(ResourceAttributeInfo))['Items']['DBInstanceAttribute'][0][Jk_key]
    print(Info)
##RDS的资源使用情况
'''
#日志占用空间 LogSize
#数据库已使用的磁盘空间 DiskUsed
#数据占用空间 DataSize
#数据库备份大小 BackupSize
'''
def GetResourceUsage(DBInstanceId, Jk_Key):
    # 查询rds的资源属使用
    ResourceUsage = DescribeResourceUsageRequest.DescribeResourceUsageRequest()
    ResourceUsage.set_accept_format('json')
    # 指定要查询的那一个RDS 实例
    ResourceUsage.set_DBInstanceId(DBInstanceId)
    ResourceUsageInfo = clt.do_action_with_exception(ResourceUsage)
    # print(ResourceUsageInfo)
    Info = (json.loads(ResourceUsageInfo))[Jk_Key]
    print(Info)
##查询RDS 实例 的性能信息
def GetPerformance(DBInstanceId,Jk_Key,StartTime,EndTime):
    Performance = DescribeDBInstancePerformanceRequest.DescribeDBInstancePerformanceRequest()
    Performance.set_accept_format('json')
    Performance.set_DBInstanceId(DBInstanceId)
    Performance.set_Key(Jk_Key)
    Performance.set_StartTime(StartTime)
    Performance.set_EndTime(EndTime)
    PerformanceInfo = clt.do_action_with_exception(Performance)
    #print(PerformanceInfo)
    Info = (json.loads(PerformanceInfo))
    Value = Info['PerformanceKeys']['PerformanceKey'][0]['Values']['PerformanceValue'][-1]['Value']
    print(Value)
    #print(str(Value).split('&')[IndexNum])

def GetPerformance1(DBInstanceId,Jk_Key,IndexNum,StartTime,EndTime):
    Performance = DescribeDBInstancePerformanceRequest.DescribeDBInstancePerformanceRequest()
    Performance.set_accept_format('json')
    Performance.set_DBInstanceId(DBInstanceId)
    Performance.set_Key(Jk_Key)
    Performance.set_StartTime(StartTime)
    Performance.set_EndTime(EndTime)
    PerformanceInfo = clt.do_action_with_exception(Performance)
    #print(PerformanceInfo)
    Info = (json.loads(PerformanceInfo))
    Value = Info['PerformanceKeys']['PerformanceKey'][0]['Values']['PerformanceValue'][-1]['Value']
    print(str(Value).split('&')[IndexNum])

if __name__ == '__main__':
    Type = sys.argv[1]
    DBInstanceId = sys.argv[2]
    Jk_Key = sys.argv[3]
    AccessKey_ID = sys.argv[4]
    AccessKey_Secret = sys.argv[5]
    RegionId = 'cn-shanghai'

    # 阿里云返回的数据为UTC时间,因此要转换为东八区时间。其他时区同理。
    UTC_End = datetime.datetime.today() - datetime.timedelta(hours=8)
    UTC_Start = UTC_End - datetime.timedelta(minutes=1)
    StartTime = datetime.datetime.strftime(UTC_Start, '%Y-%m-%dT%H:%MZ')
    EndTime = datetime.datetime.strftime(UTC_End, '%Y-%m-%dT%H:%MZ')
    clt = client.AcsClient(AccessKey_ID, AccessKey_Secret, RegionId)
    if (Type == 'Disk'):
        GetResourceUsage(DBInstanceId, Jk_Key)
    elif (Type == 'Attribute'):
        GetResourceAttribute(DBInstanceId,Jk_Key)
    elif (Type == 'Performance'):
        #当前总连接数
        if (Jk_Key == 'PgSQL_Session'):
            GetPerformance(DBInstanceId, Jk_Key, StartTime, EndTime)
            ##实例空间占用
        if (Jk_Key == 'PgSQL_SpaceUsage'):
            GetPerformance(DBInstanceId, Jk_Key, StartTime, EndTime)
        #CPU使用率。单位:百分比(%)
        if (Jk_Key == 'CpuUsage'):
            GetPerformance(DBInstanceId, Jk_Key, StartTime, EndTime)
         ###内存使用率。单位:百分比(%)。
        if (Jk_Key == 'MemoryUsage'):
            GetPerformance(DBInstanceId, Jk_Key,StartTime, EndTime)
         ##磁盘使用率。单位:百分比(%)。
        if (Jk_Key == 'DiskUsage'):
            GetPerformance(DBInstanceId, Jk_Key,StartTime, EndTime)
            #MSSQL实例的IOPS(每秒IO请求次数) IOPS(单位:次/秒)
    elif (Type == 'Performance1'):
        #当前活跃连接数
        if (Jk_Key == 'active_session'):
            GetPerformance1(DBInstanceId, 'PolarDBConnections',0,StartTime,EndTime)
        #当前处于空闲会话状态的连接数
        elif (Jk_Key == 'idle_connection'):
            GetPerformance1(DBInstanceId, 'PolarDBConnections', 1, StartTime, EndTime)
        #当前处于等待状态的连接数
        elif (Jk_Key == 'waiting_connection'):
            GetPerformance1(DBInstanceId, 'PolarDBConnections', 3, StartTime, EndTime)
        #每秒提交事务数
        elif (Jk_Key == 'commits_delta'):
            GetPerformance1(DBInstanceId, 'PolarDBQPSTPS', 0, StartTime, EndTime)
        #每秒回滚事务数
        elif (Jk_Key == 'rollbacks_delta'):
            GetPerformance1(DBInstanceId, 'PolarDBQPSTPS', 2, StartTime, EndTime)
        #每秒死锁数
        elif (Jk_Key == 'deadlocks_delta'):
            GetPerformance1(DBInstanceId, 'PolarDBQPSTPS', 1, StartTime, EndTime)
        #每秒事务数
        elif (Jk_Key == 'mean_tps'):
            GetPerformance1(DBInstanceId, 'PolarDBQPSTPS', 3, StartTime, EndTime)
        #每秒全表扫描记录行数
        elif (Jk_Key == 'returned_delta'):
            GetPerformance1(DBInstanceId, 'PolarDBRowDML', 3, StartTime, EndTime)
        #每秒索引扫描回表记录行数
        elif (Jk_Key == 'fetched_delta'):
            GetPerformance1(DBInstanceId, 'PolarDBRowDML', 1, StartTime, EndTime)
        #每秒INSERT记录行数
        elif (Jk_Key == 'inserted_delta'):
            GetPerformance1(DBInstanceId, 'PolarDBRowDML', 2, StartTime, EndTime)
        #每秒UPDATE记录行数
        elif (Jk_Key == 'updated_delta'):
            GetPerformance1(DBInstanceId, 'PolarDBRowDML', 4, StartTime, EndTime)
        #每秒DELETE记录行数
        elif (Jk_Key == 'deleted_delta'):
            GetPerformance1(DBInstanceId, 'PolarDBRowDML', 0, StartTime, EndTime)
        #数据盘每秒读次数
        elif (Jk_Key == 'iops_read'):
            GetPerformance1(DBInstanceId, 'PolarDBLocalIOSTAT', 1, StartTime, EndTime)
        #数据盘每秒写次数
        elif (Jk_Key == 'iops_write'):
            GetPerformance1(DBInstanceId, 'PolarDBLocalIOSTAT', 2, StartTime, EndTime)
        #数据盘每秒IOPS
        elif (Jk_Key == 'local_iops'):
            GetPerformance1(DBInstanceId, 'PolarDBLocalIOSTAT', 0, StartTime, EndTime)
       #CPU使用率
        elif (Jk_Key == 'cpu_ratio'):
            GetPerformance1(DBInstanceId, 'PolarDBCPU', 0, StartTime, EndTime)
        #用户态CPU使用率
        elif (Jk_Key == 'cpu_user_ratio'):
            GetPerformance1(DBInstanceId, 'PolarDBCPU', 2, StartTime, EndTime)
        #系统态CPU使用率
        elif (Jk_Key == 'cpu_sys_ratio'):
            GetPerformance1(DBInstanceId, 'PolarDBCPU', 1, StartTime, EndTime)
#########******########
上传到脚本到zabbix服务器,或者zabbix proxy(如果你的服务器中间有代理的话)

上传的python脚本别忘了加 执行权限
创建监控rds sqlserver 的配置文件
cd /etc/zabbix/zabbix_agentd.d
vi ali_rds_postgresql.conf



重启 zabbix-server 或者 zabbix-proxy
systemctl restart zabbix-proxy
在要监控的阿里云RDS SQLServer 实例下面,添加白名单(zabbix server 或者zabbix proxy的IP)