上一篇讲到了使用zabbix监控阿里云数据库,同理我们可以实现使用zabbix监控腾讯云数据库。
直接上代码:

数据库发现脚本: discovery_tencent.py

# -*- coding: utf-8 -*-
from tencentcloud.common import credential
from tencentcloud.common.exception.tencent_cloud_sdk_exception import (
    TencentCloudSDKException,
)
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile


import json
import os

import configparser
import pymysql.cursors

PATH = os.path.dirname(os.path.abspath(__file__))

secretId = "xxxxx"
secretKey = "xxxxx"


def get_index():
    try:
        sql = "select id,metricname from metricname_desc;"
        metric = results_fetch(sql)
        # print (metric)
        metric_dict = {}
        for i in range(len(metric)):
            metric_dict[metric[i][1]] = metric[i][0]
        # print(metric_dict)
        return metric_dict
    except Exception as err:
        print(err)


def get_Instances():
    # 导入对应产品模块的client models。
    from tencentcloud.cdb.v20170320 import cdb_client, models

    DBInstanceIdList = []
    DBInstanceIdDict = {}
    ZabbixDataDict = {}
    try:
        # 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey
        cred = credential.Credential(secretId, secretKey)

        # 实例化要请求产品(以cvm为例)的client对象
        client = cdb_client.CdbClient(cred, "ap-shanghai")

        # 实例化一个请求对象
        req = models.DescribeDBInstancesRequest()

        # 通过client对象调用想要访问的接口,需要传入请求对象
        resp = client.DescribeDBInstances(req)
        # 输出json格式的字符串回包
        # print(resp.to_json_string())

        req = json.loads(resp.to_json_string())
        # print (req)
        # print (req['TotalCount'])
        DBInstanceIdDict = {}
        for i in range(len(req["Items"])):
            # {"Dimensions":[{"Name":"InstanceId","Value":"cdb-mbilw08a"}]}
            # print (k,':',req['Items'][i][k])
            # print(req["Items"][i])
            DBInstanceIdDict["{#DBINSTANCEID}"] = req["Items"][i]["InstanceId"]
            DBInstanceIdDict["{#DBINSTANCEDESCRIPTION}"] = req["Items"][i]["InstanceName"].encode('utf-8').decode('unicode_escape')
            DBInstanceIdList.append(DBInstanceIdDict)
        # print (Instances)
        # return Instances

        ZabbixDataDict['data'] = DBInstanceIdList
        return json.dumps(ZabbixDataDict)

    except TencentCloudSDKException as err:
        print(err)


def get_monitordata(index, Instances):

    # 导入对应产品模块的client models。
    from tencentcloud.monitor.v20180724 import monitor_client, models

    try:
        # 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey
        cred = credential.Credential(secretId, secretKey)

        # 实例化一个http选项,可选的,没有特殊需求可以跳过。
        httpProfile = HttpProfile()
        #    httpProfile.reqMethod = "POST"  # post请求(默认为post请求)
        #    httpProfile.reqTimeout = 30  # 请求超时时间,单位为秒(默认60秒)
        #    httpProfile.endpoint = "soe.tencentcloudapi.com"  # 指定接入地域域名(默认就近接入)

        # 实例化一个client选项,可选的,没有特殊需求可以跳过。
        clientProfile = ClientProfile()
        #    clientProfile.signMethod = "TC3-HMAC-SHA256"  # 指定签名算法(默认为HmacSHA256)
        #    clientProfile.unsignedPayload = True
        clientProfile.httpProfile = httpProfile

        client = monitor_client.MonitorClient(cred, "ap-shanghai", clientProfile)
        req = models.GetMonitorDataRequest()
        req.Namespace = "QCE/CDB"
        # print (index,[Instances])
        req.MetricName = index
        # req.MetricName= "SlowQueries"
        req.Instances = Instances
        # req.Instances = [{'Dimensions': [{'Name': 'InstanceId', 'Value': 'cdb-mbilw08a'}]}]
        # req.Instances= [{"Dimensions":[{"Name":"InstanceId","Value":"cdb-mbilw08a"}]}]

        # 定义获取数据的开始时间
        import pytz
        import datetime

        utc_tz = pytz.timezone("UTC")
        td = datetime.timedelta(days=0, hours=0, minutes=10, seconds=0, microseconds=0)
        # StartTime="2019-01-30T10:51:23+08:00"
        # print (StartTime)
        StartTime = (datetime.datetime.now() - td).strftime("%Y-%m-%dT%H:%M:%S+08:00")
        print(StartTime)
        req.StartTime = StartTime

        resp = client.GetMonitorData(req)
        # 输出json格式的字符串回包
        # print("%s" % resp.to_json_string())
        return resp

    except TencentCloudSDKException as err:
        print("%s" % err)


def data_format(jsonstr):
    try:
        # print (type(jsonstr))
        jsonstr = json.loads(jsonstr)
        # print (type(jsonstr))
        # print (jsonstr)
        MetricName = jsonstr["MetricName"]
        Period = jsonstr["Period"]
        InstanceId_and_data = jsonstr["DataPoints"]
        print(len(InstanceId_and_data))
        data = []
        for i in range(len(InstanceId_and_data)):
            # print (type([InstanceId_and_data[i]]))
            # print (type(InstanceId_and_data[i]))
            to_json = InstanceId_and_data[i]
            InstanceId = to_json["Dimensions"][0]["Value"]
            Timestamps = to_json["Timestamps"]
            Values = to_json["Values"]
            for i in range(len(Timestamps)):
                data.append(
                    (InstanceId, index[MetricName], Timestamps[i], Values[i], Period)
                )
                print(InstanceId, index[MetricName], Timestamps[i], Values[i], Period)
        return data
    except Exception as err:
        print(err)


index = {'SlowQueries': 1, 'MaxConnections': 2, 'SelectScan': 3, 'SelectCount': 4, 'ComUpdate': 5, 'ComDelete': 6, 'ComInsert': 7, 'ComReplace': 8, 'Queries': 9, 'Threa dsConnected': 10, 'RealCapacity': 11, 'Capacity': 12, 'BytesSent': 13, 'BytesReceived': 14, 'QcacheUseRate': 15, 'QcacheHitRate': 16, 'TableLocksWaited': 17, 'C reatedTmpTables': 18, 'InnodbCacheUseRate': 19, 'InnodbCacheHitRate': 20, 'InnodbOsFileReads': 21, 'InnodbOsFileWrites': 22, 'InnodbOsFsyncs': 23, 'KeyCacheUseR ate': 24, 'KeyCacheHitRate': 25, 'VolumeRate': 26, 'QueryRate': 27, 'QPS': 28, 'TPS': 29, 'CPUUseRate': 30, 'MemoryUse': 31, 'KeyWriteRequests': 32, 'KeyWrites' : 33, 'ComCommit': 34, 'HandlerCommit': 35, 'InnodbRowsRead': 36, 'InnodbRowLockTimeAvg': 37, 'threads_created': 38, 'OpenedTables': 39, 'threads_running': 40, 'InnodbDataReads': 41, 'ComRollback': 42, 'KeyBlocksUnused': 43, 'InnodbDataWrites': 44, 'innodb_buffer_pool_pages_free': 45, 'InnodbRowsInserted': 46, 'Created TmpFiles': 47, 'InnodbDataRead': 48, 'InnodbRowLockWaits': 49, 'InnodbBufferPoolReadRequests': 50, 'HandlerRollback': 51, 'MasterSlaveSyncDistance': 52, 'Handle rReadRndNext': 53, 'InnodbRowsUpdated': 54, 'InnodbRowsDeleted': 55, 'InnodbBufferPoolPagesTotal': 56, 'KeyBlocksUsed': 57, 'InnodbDataWritten': 58, 'KeyReadReq uests': 59, 'InnodbBufferPoolReads': 60, 'CreatedTmpDiskTables': 61, 'KeyReads': 62}


def main():
    import time

    try:
        Instances = get_Instances()
        print (Instances)
        exit()
        # print(index)
        for j in index:
            print("--------", j)
            try:
                jsonstr = get_monitordata(j, Instances).to_json_string()
                data = data_format(jsonstr)
            except Exception as err:
                print("Err: ", err)
            # print (data)

    except Exception as err:
        print(err)

    #finally:
    #    print("done")

main()

数据库监控脚本: check_tencent.py

# -*- coding: utf-8 -*-
from tencentcloud.common import credential
from tencentcloud.common.exception.tencent_cloud_sdk_exception import (
    TencentCloudSDKException,
)
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile


import json
import os
import sys

import configparser
import pymysql.cursors

PATH = os.path.dirname(os.path.abspath(__file__))

secretId = "xxxxx"
secretKey = "xxxxx"

# def get_index():
#    try:
#        fopen = open('monitor_mysql_desc.csv','rt',encoding = 'utf-8')
#        index=[]
#        for i in fopen.readlines()[1:]:
#            index.append(i.split(',')[0])
#        #print (index)
#        return(index)
#    except Exception as err:
#        print(err)


def get_index():
    try:
        sql = "select id,metricname from metricname_desc;"
        metric = results_fetch(sql)
        # print (metric)
        metric_dict = {}
        for i in range(len(metric)):
            metric_dict[metric[i][1]] = metric[i][0]
        # print(metric_dict)
        return metric_dict
    except Exception as err:
        print(err)


def get_Instances():
    # 导入对应产品模块的client models。
    from tencentcloud.cdb.v20170320 import cdb_client, models

    DBInstanceIdList = []
    DBInstanceIdDict = {}
    ZabbixDataDict = {}
    try:
        # 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey
        cred = credential.Credential(secretId, secretKey)

        # 实例化要请求产品(以cvm为例)的client对象
        client = cdb_client.CdbClient(cred, "ap-shanghai")

        # 实例化一个请求对象
        req = models.DescribeDBInstancesRequest()

        # 通过client对象调用想要访问的接口,需要传入请求对象
        resp = client.DescribeDBInstances(req)
        # 输出json格式的字符串回包
        # print(resp.to_json_string())

        req = json.loads(resp.to_json_string())
        # print (req)
        # print (req['TotalCount'])
        DBInstanceIdDict = {}
        for i in range(len(req["Items"])):
            # {"Dimensions":[{"Name":"InstanceId","Value":"cdb-mbilw08a"}]}
            # print (k,':',req['Items'][i][k])
            # print(req["Items"][i])
            DBInstanceIdDict["{#DBINSTANCEID}"] = req["Items"][i]["InstanceId"]
            DBInstanceIdDict["{#DBINSTANCEDESCRIPTION}"] = req["Items"][i]["InstanceName"].encode('utf-8').decode('unicode_escape')
            DBInstanceIdList.append(DBInstanceIdDict)
        # print (Instances)
        # return Instances

        ZabbixDataDict['data'] = DBInstanceIdList
        return ZabbixDataDict

    except TencentCloudSDKException as err:
        print(err)


def get_monitordata(index, Instances):

    # 导入对应产品模块的client models。
    from tencentcloud.monitor.v20180724 import monitor_client, models

    try:
        # 实例化一个认证对象,入参需要传入腾讯云账户secretId,secretKey
        cred = credential.Credential(secretId, secretKey)

        # 实例化一个http选项,可选的,没有特殊需求可以跳过。
        httpProfile = HttpProfile()
        #    httpProfile.reqMethod = "POST"  # post请求(默认为post请求)
        #    httpProfile.reqTimeout = 30  # 请求超时时间,单位为秒(默认60秒)
        #    httpProfile.endpoint = "soe.tencentcloudapi.com"  # 指定接入地域域名(默认就近接入)

        # 实例化一个client选项,可选的,没有特殊需求可以跳过。
        clientProfile = ClientProfile()
        #    clientProfile.signMethod = "TC3-HMAC-SHA256"  # 指定签名算法(默认为HmacSHA256)
        #    clientProfile.unsignedPayload = True
        clientProfile.httpProfile = httpProfile

        client = monitor_client.MonitorClient(cred, "ap-shanghai", clientProfile)
        req = models.GetMonitorDataRequest()
        req.Namespace = "QCE/CDB"
        # print (index,[Instances])
        req.MetricName = index
        # req.MetricName= "SlowQueries"
        req.Instances = Instances
        # req.Instances = [{'Dimensions': [{'Name': 'InstanceId', 'Value': 'cdb-mbilw08a'}]}]
        # req.Instances= [{"Dimensions":[{"Name":"InstanceId","Value":"cdb-mbilw08a"}]}]

        # 定义获取数据的开始时间
        import pytz
        import datetime

        utc_tz = pytz.timezone("UTC")
        td = datetime.timedelta(days=0, hours=0, minutes=1, seconds=0, microseconds=0)
        # StartTime="2019-01-30T10:51:23+08:00"
        # print (StartTime)
        StartTime = (datetime.datetime.now() - td).strftime("%Y-%m-%dT%H:%M:%S+08:00")
        #print(StartTime)
        req.StartTime = StartTime

        resp = client.GetMonitorData(req)
        # 输出json格式的字符串回包
        # print("%s" % resp.to_json_string())
        return resp

    except TencentCloudSDKException as err:
        print("%s" % err)


def data_format(jsonstr):
    try:
        # print (type(jsonstr))
        jsonstr = json.loads(jsonstr)
        # print (type(jsonstr))
        # print (jsonstr)
        MetricName = jsonstr["MetricName"]
        Period = jsonstr["Period"]
        InstanceId_and_data = jsonstr["DataPoints"]
        # print(len(InstanceId_and_data))
        data = []
        for i in range(len(InstanceId_and_data)):
            # print (type([InstanceId_and_data[i]]))
            # print (type(InstanceId_and_data[i]))
            to_json = InstanceId_and_data[i]
            InstanceId = to_json["Dimensions"][0]["Value"]
            Timestamps = to_json["Timestamps"]
            Values = to_json["Values"]
            '''
            for j in range(len(Timestamps)):
                data.append(
                    (InstanceId, index[MetricName], Timestamps[j], Values[j], Period)
                )
                print(InstanceId, index[MetricName], Timestamps[j], Values[j], Period)
            '''
            value=Values[len(Values)-1]

        return value
    except Exception as err:
        print(err)


index = {'SlowQueries': 1, 'MaxConnections': 2, 'SelectScan': 3, 'SelectCount': 4, 'ComUpdate': 5, 'ComDelete': 6, 'ComInsert': 7, 'ComReplace': 8, 'Queries': 9, 'Threa dsConnected': 10, 'RealCapacity': 11, 'Capacity': 12, 'BytesSent': 13, 'BytesReceived': 14, 'QcacheUseRate': 15, 'QcacheHitRate': 16, 'TableLocksWaited': 17, 'C reatedTmpTables': 18, 'InnodbCacheUseRate': 19, 'InnodbCacheHitRate': 20, 'InnodbOsFileReads': 21, 'InnodbOsFileWrites': 22, 'InnodbOsFsyncs': 23, 'KeyCacheUseR ate': 24, 'KeyCacheHitRate': 25, 'VolumeRate': 26, 'QueryRate': 27, 'QPS': 28, 'TPS': 29, 'CPUUseRate': 30, 'MemoryUse': 31, 'KeyWriteRequests': 32, 'KeyWrites' : 33, 'ComCommit': 34, 'HandlerCommit': 35, 'InnodbRowsRead': 36, 'InnodbRowLockTimeAvg': 37, 'threads_created': 38, 'OpenedTables': 39, 'threads_running': 40, 'InnodbDataReads': 41, 'ComRollback': 42, 'KeyBlocksUnused': 43, 'InnodbDataWrites': 44, 'innodb_buffer_pool_pages_free': 45, 'InnodbRowsInserted': 46, 'Created TmpFiles': 47, 'InnodbDataRead': 48, 'InnodbRowLockWaits': 49, 'InnodbBufferPoolReadRequests': 50, 'HandlerRollback': 51, 'MasterSlaveSyncDistance': 52, 'Handle rReadRndNext': 53, 'InnodbRowsUpdated': 54, 'InnodbRowsDeleted': 55, 'InnodbBufferPoolPagesTotal': 56, 'KeyBlocksUsed': 57, 'InnodbDataWritten': 58, 'KeyReadReq uests': 59, 'InnodbBufferPoolReads': 60, 'CreatedTmpDiskTables': 61, 'KeyReads': 62}


def main():
    import time
    InstanceId = sys.argv[1]
    key = sys.argv[2]
    # param = cdb-qlxea4cm MaxConnections
    try:
        Instances= [{'Dimensions': [{'Name': 'InstanceId', 'Value': InstanceId}]}]
        try:
            jsonstr = get_monitordata(key, Instances).to_json_string()
            # print(jsonstr)
            data = data_format(jsonstr)
            print(data)
        except Exception as err:
            print("Err: ", err)
        # print (data)

    except Exception as err:
        print(err)

    #finally:
    #    print("done")

main()