TiDB 是一个分布式 NewSQL 数据库,它具有分布式事务、水平伸缩、高可用等特点,被广泛应用于各种企业级应用中。然而,在使用 TiDB 过程中,及时获取系统的运行状态和异常信息是至关重要的,这对于系统的稳定性和可靠性具有重要意义。为了实现及时的告警通知,我们可以利用企业微信机器人来实现 TiDB 的告警推送功能。
1、企业微信机器人简介
企业微信机器人是企业微信提供的一种机器人接口,通过该接口可以实现向企业微信群发送文本、图片、链接等消息,从而实现各种应用场景下的消息推送功能。企业微信机器人采用简单的 HTTP 请求接口,使用方便灵活,可以轻松集成到各种应用中。
2、TiDB告警推送实现
2.1.准备工作
- 创建企业微信机器人:登录企业微信后台,创建一个群聊,并添加一个机器人,获取机器人的webhook地址
- 部署监控系统:部署一套TiDB集群,里面自带监控系统。
- 初始化项目:在服务器上安装Node.js 和 npm包管理器,并执行命令下载依赖
#确保服务器上已经安装 Node.js 和 npm包管理器
mkdir alert-manager-server
cd alert-manager-server
npm init -y
npm install express body-parser
2.2.实现告警推送
- 创建服务端代码:用于接收Alertmanager发送来的告警信息,并进行解析后发送给企业微信机器人
// 创建一个名为server.js的文件,并且内容如下:
const express = require('express');
const bodyParser = require('body-parser');
const axios = require('axios');
const app = express();
const port = 3010; // 设置服务器端口号
// 使用body-parser中间件解析JSON格式的请求体
app.use(bodyParser.json());
// 定义接收告警的端点
app.post('/alert', (req, res) => {
console.log('Received alert data:', req.body);
// 构建要发送的数据格式
const utcStartTime = new Date(req.body.alerts[0].startsAt);
const cluster = req.body.commonLabels.cluster;
const instance = req.body.commonLabels.instance;
const level = req.body.commonLabels.level;
const shanghaiStartTime = new Date(utcStartTime.toLocaleString('en-US', {timeZone: 'Asia/Shanghai'}));
const content = {
msgtype: 'text',
text: {
content: `【告警级别】: ${level}\n` +
`【集群名称】: ${cluster}\n` +
`【告警实例】: ${instance}\n` +
`【告警组件】: ${req.body.commonLabels.alertname}\n` +
`【告警名称】: ${req.body.commonAnnotations.summary}\n` +
`【告警时间】: ${shanghaiStartTime}`
}
};
// 替换为您的企业微信机器人的Webhook地址
const webhookUrl = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxx';
// 使用axios发送POST请求到企业微信机器人的Webhook地址
axios.post(webhookUrl, content)
.then(response => {
console.log('Message sent to Enterprise WeChat Bot:', response.data);
res.status(200).send('Alert received and sent to Enterprise WeChat Bot successfully');
})
.catch(error => {
console.error('Error sending message to Enterprise WeChat Bot:', error);
res.status(500).send('Error sending message to Enterprise WeChat Bot');
});
});
// 启动服务器
app.listen(port, () => {
console.log(`Server is running on port ${port}`);
});
通过 content 模块,定义了告警信息的格式。这个模块包含了多个字段,有需要可以进行更改格式。
- 启动服务:现在我们将服务启动,让其运行在3010端口上,并且可以接收到来自Alertmanager的HTTP POST请求,路径为/alert
node server.js
启动时可以添加定向到文件,在server.js里面通过console.log() 和 console.error() 方法来输出日志信息。这些日志信息包括了服务的启动信息、收到的告警数据以及发送告警信息的状态。通过查看这些日志信息,我们可以了解到服务是否成功启动,以及是否成功接收到来自 Alertmanager 的告警数据,并且能够及时发现和解决可能出现的错误和异常情况。
- 配置alertmanager.yaml文件:创建一个yaml文件,让tidb集群的alertmanager组件指向这个yaml文件
#把url换成server.js的
global:
resolve_timeout: 5m
route:
group_by: ['alertname', 'cluster', 'service']
group_wait: 10s
group_interval: 5m
repeat_interval: 3h
receiver: 'webhook-notifications'
receivers:
- name: 'webhook-notifications'
webhook_configs:
- url: 'http://your-server-ip:3010/alert'
send_resolved: true
进行配置时,将webhoobk_configs下面的url链接注意补充完整。
- 配置Alertmanager告警推送:使用tiup进行配置参数更改,在alertmanager上添加config_file
tiup cluster edit-config tidb-test
alertmanager_servers:
- host: xxx.xxx.xxx.xxx
ssh_port: 22
web_port: 9093
cluster_port: 9094
deploy_dir: /xxx/xxx/alertmanager-9093
data_dir: /xxx/xxx/alertmanager-9093
log_dir: /xxx/xxx/alertmanager-9093/log
config_file: /xxx/xxx/alertmanager_test.yaml
arch: amd64
os: linux
tiup cluster reload tidb-test -R alertmanager
- 告警结果演示:配置成功后观察server.js输出信息与企业微信接收信息
总结
利用企业微信机器人实现 TiDB 的告警推送功能,提供了一种简单、高效的告警通知方式。这种方案不仅能够及时发现和解决 TiDB 集群中的问题,还能够提高团队的工作效率和响应速度,从而提升系统的稳定性和可靠性。