上一篇讲到了使用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()