最佳实践:自定义监控云数据库 MySQL 指标

277

如何监控云数据库 MySQL连接数等运行状态指标?

推荐您使用 云监控-自定义监控! 目前内测阶段免费使用,无需审核,开通服务即用。诚邀您点击 申请页面 参与内测体验。

本文介绍如何使用 Shell 命令+SDK 方式上报云数据库 MySQL 的指标至自定义监控,查看指标并配置告警。

实践背景

定期监控云数据库 MySQL 的关键指标。当这些监控指标触发您设置的告警条件时,发送短信告警。

前提条件

数据上报

步骤1:准备上报环境

安装 Python 语言 SDK:

步骤2:数据采集授权

在数据库中执行以下代码,进行云数据库中的数据采集授权:

grant select on *.* to monitor@'x.x.x.x' identified by 'monitor!@#asd';

说明:

  • 'x.x.x.x':表示服务器 IP 地址。
  • *.*:表示的意思是任意数据库下的任意数据表。

步骤3:上报数据

1.在/usr/local/bin目录下新建如下两个文件:

  • 1.1新建 ToMonitor.py,代码如下:
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.monitor.v20180724 import monitor_client, models
import sys,json
try:
SecretId = sys.argv[1]
SecretKey = sys.argv[2]
region = sys.argv[3]
metricList = json.loads(sys.argv[4])
cred = credential.Credential(SecretId, SecretKey)
httpProfile = HttpProfile()
httpProfile.endpoint = "monitor.tencentcloudapi.com"

clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
client = monitor_client.MonitorClient(cred, region , clientProfile)

req = models.PutMonitorDataRequest()
paramList = []
for single in metricList:
for MetricName,metricValue in single.items():
newParams = {}
newParams["MetricName"] = MetricName
newParams["Value"] = int(metricValue)
paramList.append(newParams)
params = '{"Metrics":%s}' %json.dumps(paramList)
req.from_json_string(params)

resp = client.PutMonitorData(req)
print(resp.to_json_string())

except TencentCloudSDKException as err:
print(err)
  • 1.2 新建 MySQLStatusToMonitor.sh 文件,代码如下:
#!/bin/bash

#需要采集数据的 MySQL 地址
MYSQLHOST="1.1.1.1"
#需要采集数据的 MySQL 端口
MYSQLPORT=3306
#需要采集数据的访问用户名
MYSQLUSER="monitor"
#需要采集数据的 MySQL 访问密码
MYSQLPWD="monitor!@#asdxxxx"
#用户专属的 SecretId
SecretId="xxxxxxxxx"
#用户专属的 SecretKey
SecretKey="xxxxxxxx"
#需要上报到监控系统所属区域
region="ap-guangzhou"

function Log()
{
msg=$1
logType=$2
logFile="./MySQLStatusToMonitor.log"
echo "["`date +"%Y-%m-%d %X"`"]$msg" >> $logFile
}
MYSQLCON="/usr/bin/mysql -h$MYSQLHOST -P$MYSQLPORT -u$MYSQLUSER -p$MYSQLPWD"

#采集
NEEDEDMYSQLSTATUS=`$MYSQLCON -e "show status;"|grep -Ew "Aborted_connects|Innodb_row_lock_current_waits|Uptime"`

#记录相关参数
AbConnections=`echo "$NEEDEDMYSQLSTATUS"|awk '/Aborted_connects/{print $2}'`
InnodbRLCW=`echo "$NEEDEDMYSQLSTATUS"|awk '/Innodb_row_lock_current_waits/{print $2}'`
MYSQLUptime=`echo "$NEEDEDMYSQLSTATUS"|awk '/Uptime/{print $2}'`
Log "uploading Aborted_connects:$AbConnections,Innodb_row_lock_current_waits:$InnodbRLCW,MySQL_uptime:$MYSQLUptime."

#上报到自定义监控
/bin/python ToMonitor.py "$SecretId" "$SecretKey" "$region" '[{"AbConnections":'$AbConnections'},{"InnodbRLCW":'$InnodbRLCW'}, {"MYSQLUptime":'$MYSQLUptime'}]'

说明: 代码中:MYSQLHOST、MYSQLPORT、MYSQLUSER、MYSQLPWD、SecretId、SecretKey、Region 字段需根据您的实际情况修改

  • Region:地域,可查询可用 地域列表
  • SecretId 和 SecretKey,请前往 API 密钥管理 获取。
  • ToMonitor.py 和 MySQLStatusToMonitor.sh 两个 Demo 也可放到其它目录下。本文以放/usr/local/bin为例。

2.输入 Shell 命令,即可完成监控指标数据持续上报。

chmod a+x /usr/local/bin/MySQLStatusToMonitor.sh ToMonitor.py
bash MySQLStatusToMonitor.sh
crontab -l > /tmp/cron.bak
echo "* * * * * /usr/local/bin/MySQLStatusToMonitor.sh &" >> /tmp/cron.bak
crontab /tmp/cron.bak

数据查询

数据上报完成后,可以在 指标视图 看到刚才上报的数据。

说明

  1. 配置告警和接收告警仅做一个场景举例。
  2. 配置云数据库 MySQL 上报过的其它指标配置,请执行下述配置告警中的步骤2-3。

配置告警

场景:定期监控云数据库 MySQL 异常连接数,当异常连接次数大于0时发送短信告警。

1.确认用户消息通道已验证,可在 CAM 鉴权 页面查看验证情况。

2.进入自定义监控 指标视图 页面,在指标视图右上角【配置告警】。
3.根据背景需求配置告警规则,更详细的配置操作可参见 配置告警策略。 如图示例为:云数据库 MySQL 异常连接数大于0时发送短信告警,持续一个统计周期(1分钟),每5分钟告警一次。

接收告警

如果云数据库 MySQL 异常连接数大于0,5分钟后将会收到短信告警,短信内容如下:

【腾讯云】云监控自定义监控指标告警触发
账号 ID:34xxxxxxxx,昵称:自定义监控
告警详情
告警内容:指标视图 | 云数据库 MySQL 异常连接数大于0
告警对象:Aborted_connects
当前数据:1
APPID:125xxxxxxx
告警策略:视图告警
触发事件:2019-12-09 22:36:00(UTC+08:00)

指标说明

指标中文名 指标英文名 单位
异常连接数 Aborted_connects
行锁等待时间 Innodb_row_lock_current_waits
MySQL 运行时间 MySQL_uptime