4
5
3
0
专栏/.../

TiDB告警推送至企业微信机器人

 Ming  发表于  2024-04-22

TiDB 是一个分布式 NewSQL 数据库,它具有分布式事务、水平伸缩、高可用等特点,被广泛应用于各种企业级应用中。然而,在使用 TiDB 过程中,及时获取系统的运行状态和异常信息是至关重要的,这对于系统的稳定性和可靠性具有重要意义。为了实现及时的告警通知,我们可以利用企业微信机器人来实现 TiDB 的告警推送功能。

1、企业微信机器人简介

企业微信机器人是企业微信提供的一种机器人接口,通过该接口可以实现向企业微信群发送文本、图片、链接等消息,从而实现各种应用场景下的消息推送功能。企业微信机器人采用简单的 HTTP 请求接口,使用方便灵活,可以轻松集成到各种应用中。

2、TiDB告警推送实现

2.1.准备工作

  • 创建企业微信机器人:登录企业微信后台,创建一个群聊,并添加一个机器人,获取机器人的webhook地址

image.png image1.png

  • 部署监控系统:部署一套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输出信息与企业微信接收信息

image3.png image4.png

总结

利用企业微信机器人实现 TiDB 的告警推送功能,提供了一种简单、高效的告警通知方式。这种方案不仅能够及时发现和解决 TiDB 集群中的问题,还能够提高团队的工作效率和响应速度,从而提升系统的稳定性和可靠性。

4
5
3
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论