服务器挂了等用户报障?我用Prometheus搭了一套监控告警,服务器出状况第一时间通知我

前言

服务器维护这件事,最让人难受的不是它挂了,而是不知道它挂了------等你从用户投诉里发现的时候,问题已经持续一两个小时了。这种情况出现几次之后,我就开始认真考虑搭一套监控告警系统。

Prometheus + Node_Exporter + Alertmanager 这套组合在运维圈子里用得很多,核心原理也不复杂:Node_Exporter 负责把服务器 CPU、内存、磁盘这些指标暴露出来,Prometheus 按规则抓取数据并判断是否触发告警,Alertmanager 收到告警后统一处理并通过邮件等渠道发出去。三者加在一起,就是一个完整的"监控---判断---通知"链路。cpolar 的作用是把本地的 Alertmanager 映射到公网,这样在外网环境下 Prometheus 也能访问到,不受网络环境限制。这套方案搭下来用了一晚上,测试了几次之后,现在基本能做到服务器出状况五分钟内收到邮件通知。

1.在Centos7上安装Alertmanager

在安装alertmanager前需要安装node_exporter和prometheus,

接下来跟我进入监控告警的世界吧!

去官网下载安装文件:

找到linux版,下载:

下载完成后记住下载路径。

创建alertmanager的目录:

shell 复制代码
mkdir -p /app/alertmanager

进入到这个目录:

shell 复制代码
cd /app/alertmanager

手动上传下载好的alertmanager文件。

上传成功后解压:

shell 复制代码
tar -vxzf alertmanager-0.28.1.linux-amd64.tar.gz

改名方便记忆:

shell 复制代码
mv alertmanager-0.28.1.linux-amd64 alertmanager

将Altermanager配置为系统服务:

shell 复制代码
cd /usr/lib/systemd/system
shell 复制代码
vim alertmanager.service
shell 复制代码
[Unit]
Description=https://prometheus.io
  
[Service]
Restart=on-failure
ExecStart=/app/alertmanager/alertmanager --config.file=/app/alertmanager/alertmanager.yml
 
[Install]                      
WantedBy=multi-user.target

加载system文件,启动alertmanager这个服务,并设置开机启动:

shell 复制代码
systemctl daemon-reload
systemctl start alertmanager.service
systemctl enable alertmanager.service

也可以后台手动启动:

shell 复制代码
nohup ./alertmanager --config.file=alertmanager.yml >> /app/alertmanager/alertmanager/alertmanager.out 2>&1 &
cat alertmanager.out

启动成功后,访问Altermanager,ip+9093,默认端口为 9093。

假如,我们想用手机或者平板,随时随地可以查看告警消息,我们应该怎么做呢?接下来cpolar就派上用场啦!

2.安装cpolar实现随时随地开发

cpolar 可以将你本地电脑中的服务(如 SSH、Web、数据库)映射到公网。即使你在家里或外出时,也可以通过公网地址连接回本地运行的开发环境。

❤️以下是安装cpolar步骤:

使用一键脚本安装命令:

shell 复制代码
sudo curl https://get.cpolar.sh | sh

安装完成后,执行下方命令查看cpolar服务状态:(如图所示即为正常启动)

shell 复制代码
sudo systemctl status cpolar

Cpolar安装和成功启动服务后,在浏览器上输入虚拟机主机IP加9200端口即:【http://192.168.42.101:9200】访问Cpolar管理界面,使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可:

打开浏览器访问本地9200端口,使用cpolar账户密码登录即可,登录后即可对隧道进行管理。

3.配置公网地址

登录cpolar web UI管理界面后,点击左侧仪表盘的隧道管理------创建隧道:

  • 隧道名称:可自定义,本例使用了:alertmanager,注意不要与已有的隧道名称重复

  • 协议:http

  • 本地地址:9093

  • 域名类型:随机域名

  • 地区:选择China Top

创建成功后,打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址,接下来就可以在其他电脑或者移动端设备(异地)上,使用地址访问。

访问成功。

4.在prometheus上配置alertmanager

进入prometheus的配置文件,加入alertmanager告警规则:

shell 复制代码
vi /app/prometheus/prometheus.yml

加入以下内容后:Prometheus可以通过这个公网地址4246d47e.r2.cpolar.top(刚才用cpolar打通的公网地址,也可以用localhost:9093)访问到运行在本地9093端口的Alertmanager服务,从而抓取系统指标。

shell 复制代码
      - targets: ["4246d47e.r2.cpolar.top"]
        labels:
          app: "alertmanager"

这一步配置的作用是:告诉 Prometheus,当监控规则触发告警时,应该把告警信息发送到哪个 Alertmanager 服务进行处理(便于一会监控node_exporter,也可以监控mysqld_exporter等等)。

shell 复制代码
alerting:
  alertmanagers:
    - static_configs:
        - targets: ["4246d47e.r2.cpolar.top"]

重新启动prometheus:

shell 复制代码
systemctl restart prometheus

抓取成功!

5.利用alertmanager来配置node_exporter告警

在第四章节,我们已经成功配置告警信息发送到alertmanager,接下来我们来验证一下,是否可以成功发送!

我们这里举例,倘若node_exporter关闭则发送告警。

node_exporter还可以监控主机的 CPU 使用率,内存使用量,文件系统用量等等。

我们先改写prometheus的配置文件,改以下内容:

shell 复制代码
vi /app/prometheus/promethues.yml

进入到prometheus配置目录下,写一个配置文件1.yml:

shell 复制代码
vi /app/prometheus/1.yml
shell 复制代码
groups:
- name: node-alerts
  rules:
  # 实例宕机
  - alert: node_exporter实例宕机
    expr: up{job="node_exporter",instance="localhost:9100"} == 0
    for: 15s
    labels:
      severity: critical
    annotations:
      summary: "实例 {{ $labels.instance }} 已停止运行超过 15 秒!"
      description: "作业 {{ $labels.job }} 的实例 {{ $labels.instance }} 无法抓取。"
- name: prometheus
  rules:
  # 实例宕机
  - alert: 实例宕机
    expr: up{job="prometheus"} == 0
    for: 15s
    labels:
      severity: critical
    annotations:
      summary: "实例 {{ $labels.instance }} 已停止运行超过 15 秒!"
      description: "作业 {{ $labels.job }} 的实例 {{ $labels.instance }} 无法抓取。"

重启prometheus:

shell 复制代码
systemctl restart prometheus

打开prometheus网页,发现加入成功。

接下来,我们验证一下,关闭node_exporter,会不会告警:

shell 复制代码
systemctl stop node_exporter

再次打开prometheus网页,告警成功:

打开alertmanager网页,我们发现那两条告警也显示成功。

这样我们就成功配置prometheus告警啦!

6.使用Alertmanager发送服务器告警至QQ邮箱

QQ 邮箱默认不允许外部应用直接使用密码登录SMTP服务器,因此你需要获取一个授权码

  • 登录QQ 邮箱 ,进入设置 -> 账户
  • 找到 SMTP/IMAP/POP3/Exchange 服务 ,开启 SMTP 服务
  • 开启后,会提示你获取一个授权码

接下来,我们进入alertmanager安装目录,修改alertmanager配置文件alertmanager.yml:

shell 复制代码
vi /app/alertmanager/alertmanager/alertmanager.yml

添加以下内容来配置告警规则:

shell 复制代码
global:
  resolve_timeout: 5m
  smtp_from: '你的QQ邮箱'
  smtp_smarthost: 'smtp.qq.com:465'
  smtp_auth_username: '你的QQ邮箱'
  smtp_auth_password: '你的QQ邮箱授权码'
  smtp_require_tls: false
  smtp_hello: 'qq.com'

route:
  group_by: ['alertname']
  group_wait: 5s
  group_interval: 5s
  repeat_interval: 5m
  receiver: 'email'

receivers:
- name: 'email'
  email_configs:
  - to: '你的QQ邮箱'
    send_resolved: true

这样有告警消息就可以发送到QQ邮箱啦!

我们来验证一下,配置有没有问题:

shell 复制代码
./alertmanager --config.file=alertmanager.yml --log.level=debug

手动运行测试,没报错即正确!

重启alertmanager:

shell 复制代码
systemctl restart alertmanager
systemctl status alertmanager

登录邮箱查看,node_exporter挂机是否发邮件:

接收到邮件,说明我们配置正确!

这样我们就可以随时随地查看告警信息了!

7.保留固定公网地址

使用cpolar为其配置二级子域名,该地址为固定地址,不会随机变化。

点击左侧的预留,选择保留二级子域名,地区选择china Top,然后设置一个二级子域名名称,我这里演示使用的是alertmanager,大家可以自定义。填写备注信息,点击保留。

登录cpolar web UI管理界面,点击左侧仪表盘的隧道管理------隧道列表,找到所要配置的隧道alertmanager,点击右侧的编辑

修改隧道信息,将保留成功的二级子域名配置到隧道中

  • 域名类型:选择二级子域名
  • Sub Domain:填写保留成功的二级子域名
  • 地区: China Top

点击更新

更新完成后,打开在线隧道列表,此时可以看到随机的公网地址已经发生变化,地址名称也变成了保留和固定的二级子域名名称。

最后,我们使用固定的公网地址在任意设备的浏览器中访问,可以看到成功访问本地部署的alertmanager页面,这样一个永久不会变化的二级子域名公网网址即设置好了。

有了cpolar我们可以在任意一台服务器,使用此alertmanager监控,你的同事=也可以一键监控!是不是特别方便呢~

结尾

用这套监控告警系统跑了几个月下来,最大的感受是:心理负担降了很多。以前晚上睡觉都不踏实,生怕服务器出问题不知道。现在邮件一分钟内就能收到,凌晨宕机也能及时响应,不会在睡觉的时候让问题扩大。

Prometheus 这套方案在技术圈内流行不是没有原因的:开源免费、配置灵活、告警规则可自定义程度高,PromQL 查询语言上手之后能做的事很多。配合 Alertmanager 做邮件渠道,配置一次,后面基本不用管。cpolar 穿透解决了本地服务公网可达的问题,Alertmanager 这条链路就打通了。整套方案不需要商业软件,一台 Linux 服务器加这些开源工具就能跑起来,对于自建服务的个人开发者或者小团队来说,这套方案该有的全有了。

相关推荐
SRETalk18 小时前
Zabbix、Prometheus、Grafana、Nightingale,四个监控如何选型?
zabbix·grafana·prometheus·nightingale
两个人的幸福5 天前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
zzzzzz3105 天前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
BingoGo7 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack7 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户3074596982078 天前
PHP 扩展——从入门到理解
php
虚无境8 天前
如何编写一个SpringBoot项目告警推送的Starter
java·prometheus·webhook
鹏仔先生9 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
大树889 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
小宇宙Zz9 天前
Maven依赖冲突
java·服务器·maven