如何使用Promethues监控系统指标并进行告警

news2024/11/25 4:31:59

公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。

前言

从零开始:使用Prometheus与Grafana搭建监控系统

克服网络障碍:Prometheus如何通过间接方式采集目标服务数据

在以上二节,我们介绍了如何使用Prometheus的Pull和Push模式来采集系统指标并在 Grafana进行展现,本节我们介绍如何使用Prometheus的AlertManager进行邮件告警通知。

AlertManager介绍

Prometheus是一种用于监控和告警的开源系统,而Alertmanager是Prometheus生态系统中的一个组件,主要用于告警通知。

Alertmanager的主要功能是接收来自Prometheus服务器的告警,并采取适当的操作来通知相关的团队或个人。它通过提供一个统一的接口来处理警报通知,从而简化了告警管理的过程。

下面是Alertmanager的一些关键功能和特点:

  1. 告警路由和抑制:Alertmanager允许您配置灵活的警报路由规则,以便根据警报的标签和属性将其发送给特定的接收者。
  2. 多种通知方式:Alertmanager支持多种通知方式,包括电子邮件、短信、PagerDuty、Slack、Webhook等,不过对国内的钉钉和飞书支持性不是特别好,不过好在有开源扩展实现,后续章节介绍。
  3. 去重和分组:Alertmanager可以对接收到的告警进行去重和分组,以避免发送重复的通知。
  4. 面向团队的协作:Alertmanager提供了团队协作的功能,可以将警报发送给多个接收者。
  5. 高可用性和故障转移:Alertmanager支持高可用性配置,可以运行多个实例并使用负载均衡器来分发警报。

AlertManager配置

下载
docker pull prom/alertmanager:v0.25.0

配置

在本地data/prometheus/alertmanager/目录创建alertmanager.yml配置文件

route:
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
  receiver: 'web.hook'
receivers:
  - name: 'web.hook'
    webhook_configs:
      - url: 'http://127.0.0.1:5001/'
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

Alertmanager的配置主要包含两个部分:路由(route)以及接收器(receivers),所有的告警信息都会从配置中的顶级路由(route)进入路由树,根据路由规则将告警信息发送给相应的接收器。

在Alertmanager中定义一组接收器,比如可以按照角色(比如系统运维,数据库管理员)来划分多个接收器。接收器可以关联邮件、Slack以及其它方式接收告警信息。

启动
docker run --name alertmanager -d -p 9093:9093  -v /data/prometheus/alertmanager:/etc/alertmanager prom/alertmanager:v0.25.0
查看运行状态

Alertmanager启动后可以通过9093端口访问,http://127.0.0.1:9093

Alert菜单下可以查看Alertmanager接收到的告警内容,Silences菜单下则可以通过UI创建静默规则。

关联Prometheus与Alertmanager

在Prometheus的架构中被划分成两个独立的部分,Prometheus负责产生告警,而Alertmanager负责告警产生后的后续处理。因此Alertmanager部署完成后,需要在Prometheus中设置Alertmanager相关的信息。

编辑Prometheus配置文件prometheus.yml,并添加以下内容,这里的10.211.55.2作者是本地IP

alerting:
  alertmanagers:
    - static_configs:
        - targets: ['10.211.55.2:9093']

报警规则配置

在prometheus.yml增加如下内容

rule_files:
  - /prometheus/rules/*.rules

因为在容器启动时用主机的/data/prometheus目录映射到容器的/prometheus目录,因此在主机/data/prometheus/目录创建rules文件夹,并创建告警文件hoststats-alert.rules

mkdir /data/prometheus/rules && cat <<"EOF"> /data/prometheus/rules/hoststats-alert.rules
groups:
- name: hostStatsAlert
  rules:
  - alert: hostCpuUsageAlert
  #报警规则,检测CPU使用率超过0.85,则进行告警
    expr: sum(avg without (cpu)(irate(node_cpu_seconds_total{mode!='idle'}[5m]))) by (instance) > 0.85
  #表示在满足警报条件后,要等待1分钟才能触发警报  
    for: 1m
    labels:
      severity: page
    annotations:
   #告警模板主题,$labels.instance,表示告警实例
      summary: "Instance {{ $labels.instance }} CPU usgae high"
   #告警内容
      description: "{{ $labels.instance }} CPU usage above 85% (current value: {{ $value }})"
  - alert: hostMemUsageAlert
    #内存监控
    expr: (node_memory_MemTotal - node_memory_MemAvailable)/node_memory_MemTotal > 0.85
    for: 1m
    labels:
      severity: page
    annotations:
      summary: "Instance {{ $labels.instance }} MEM usgae high"
      description: "{{ $labels.instance }} MEM usage above 85% (current value: {{ $value }})"
EOF

重启Prometheus

docker restart prometheus

重启完成之后,访问http://localhost:9090/config,查看altering配置是否生效,出现如下红色标识则表示生效

同时访问http://localhost:9090/rules,查看具体规则

邮件告警配置

在监控服务器执行以下命令,拉高cpu使用率,进行告警测试

cat /dev/zero>/dev/null

运行以下命令后查看CPU使用率情况,如下图所示:

sum(avg without (cpu)(irate(node_cpu_seconds_total{mode!='idle'}[5m]))) by (instance)

Prometheus首次检测到满足触发条件后,hostCpuUsageAlert显示有一条告警信息,状态为firing表示已经推送给了altermanager

访问http://127.0.0.1:9093查看告警信息

修改alertmanager.yml为以下内容,替换对应账号即可

global:
  smtp_smarthost: smtp.qq.com:465
  smtp_from: 9238223@qq.com
  smtp_auth_username: 9238223@qq.com
  smtp_auth_identity: 9238223@qq.com
  smtp_auth_password: 123
  smtp_require_tls: false
route:
  group_by: ['alertname']
  receiver: 'default-receiver'
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
receivers:
  - name: default-receiver
    email_configs:
      - to: abc123@foxmail.com
        send_resolved: true

global: 这是一个全局配置部分,用于配置全局的Alertmanager设置。

  • smtp_smarthost: 这是SMTP服务器的地址和端口,用于发送邮件通知。
  • smtp_from: 这是邮件发送方的邮件地址,即发送邮件的地址。

route: 用于配置警报的路由规则。

  • group_by: ['alertname']: 这是一个标签列表,用于按照警报名称(alertname)进行分组。
  • receiver: 'default-receiver': 这是指定默认接收者的名称,即接收警报通知的收件人。
  • group_wait: 30s: 在发送警报通知前等待的时间,以便将相同的警报分组在一起。
  • group_interval: 5m: 这是发送同一组警报通知之间的最小时间间隔。
  • repeat_interval: 1h: 这是在重复发送未解决的警报通知之前等待的时间间隔。

receivers: 接收者部分,用于配置接收告警通知的收件人。

  • name: default-receiver: 这是默认接收者的名称。
  • email_configs: 用于指定接收邮件通知的收件人和其他相关设置。
    • to: abc123@foxmail.com: 这是收件人的邮件地址,即接收警报通知的邮箱地址。
    • send_resolved: true: 这是一个布尔值,指示是否发送已解决的警报通知。在这个例子中,设置为true,表示发送已解决的警报通知。

重启

docker restart alertmanager

重启完成,访问http://127.0.0.1:9093/#/status,查看配置是否生效

告警测试

在目录服务器执行以下命令,拉高cpu,如果前面已执行则忽略

cat /dev/zero>/dev/null

查看prometheus已收到告警信息

等待一分钟左右,会推送给altermanager,altermanager等待30s,会推送至对应的邮箱,如下图

调整告警模版并测试

/data/prometheus/alertmanager目录下创建模版文件,这里的2006-01-02 15:04:05是go语言的日志格式,固定值

cat > /data/prometheus/alertmanager/notify-template.tmpl <<EOF
{{ define "test.html" }} 
{{ range .Alerts }}
=========start==========<br>
告警级别: {{ .Labels.severity }}<br>
告警类型: {{ .Labels.alertname }} <br>
故障主机: {{ .Labels.instance }} <br>
告警主题: {{ .Annotations.summary }} <br>
触发时间: {{ .StartsAt.Format "2006-01-02 15:04:05" }} <br>
=========end==========<br>
{{ end }}
{{ end }}
EOF

关联告警模版

global:
  smtp_smarthost: smtp.qq.com:465
  smtp_from: 9238223@qq.com
  smtp_auth_username: 9238223@qq.com
  smtp_auth_identity: 9238223@qq.com
  smtp_auth_password: 123
  smtp_require_tls: false
#添加模板
templates: 
#指定路径    
  - '/etc/alertmanager/notify-template.tmpl'   
route:
  group_by: ['alertname']
  receiver: 'default-receiver'
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
receivers:
  - name: default-receiver
    email_configs:
      - to: abc123@foxmail.com
        html: '{{ template "test.html" . }}'
        send_resolved: true

重启altermanager

docker restart alertmanager

最终结果

告警优化

观察以上告警有以下问题

  • 触发时间不对,用的是UTC时间
  • 无法区分告警与恢复邮件
  • 邮件标题看起来可读性比较差

因此针对以上问题进行调整

增加自愈模板

在以下时间增加28800e9,转换为东八区时间,即北京时间

{{ define "test.html" }} 
{{- if gt (len .Alerts.Firing) 0 -}}
{{ range .Alerts }}
<h1 align="left" style="color:red;">告警</h1>
<pre>
告警级别: {{ .Labels.severity }} 级 <br>
告警类型: {{ .Labels.alertname }} <br>
故障主机: {{ .Labels.instance }} <br>
告警主题: {{ .Annotations.summary }} <br>
告警时间:{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br>  
</pre>
{{ end }}
{{ end }}
#增加自愈模板
{{- if gt (len .Alerts.Resolved) 0 -}}
{{ range .Alerts }}
<h1 align="left" style="color:green;">恢复</h1>
<pre>
告警名称:{{ .Labels.alertname }}<br>
告警级别:{{ .Labels.severity }}<br>
告警机器:{{ .Labels.instance }}<br>
告警详情:{{ .Annotations.summary }}<br>
告警时间:{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br> 
恢复时间:{{ (.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br> 
</pre>
{{- end }}
{{- end }}
{{- end }}
邮件标题调整

在headers增加Subject则为邮件标题,这里我们进行判断如果告警邮件标题为:系统监控告警恢复后,标题改为:系统监控告警恢复

global:
  smtp_smarthost: smtp.qq.com:465
  smtp_from: 9238223@qq.com
  smtp_auth_username: 9238223@qq.com
  smtp_auth_identity: 9238223@qq.com
  smtp_auth_password: 123
  smtp_require_tls: false
templates: #添加模板
  - '/etc/alertmanager/notify-template.tmpl'   #指定路径    
route:
  group_by: ['alertname']
  receiver: 'default-receiver'
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
receivers:
  - name: default-receiver
    email_configs:
      - to: abc123@foxmail.com
        html: '{{ template "test.html" . }}'
        send_resolved: true
        headers: { Subject: "系统监控告警{{- if gt (len .Alerts.Resolved) 0 -}}恢复{{ end }}" }  

再次测试

再次重启,拉高cpu进行测试,告警信息如下

恢复通知邮件

总结

本节我们介绍了Prometheus的Alertmanager以及如何利用它对指标进行告警,同时我们还讨论了如何通过邮件通知来实现告警,并对邮件模板进行了优化。在接下来的章节中,我们将进一步探讨如何使用Prometheus监控业务系统的业务指标,并实现全面的监控和告警通知。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1319812.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

若依 ruoyi-vue3 集成aj-captcha实现滑块、文字点选验证码

目录 0. 前言0.1 说明 1. 后端部分1.1 添加依赖1.2. 修改 application.yml1.3. 新增 CaptchaRedisService 类1.4. 添加必须文件1.5. 移除不需要的类1.6. 修改登录方法1.7. 新增验证码开关获取接口1.8. 允许匿名访问 2. 前端部分&#xff08;Vue3&#xff09;2.1. 新增依赖 cryp…

re:Invent2023大会隆重推出自研芯片Graviton4和Trainium2

目录 一、前言 二、体验Graviton系列产品 &#xff08;一&#xff09;创建普通的EC2实例 &#xff08;二&#xff09;创建Graviton处理器的EC2实例 &#xff08;三&#xff09;远程到服务器 方式1&#xff1a;创建成功时连接 方式2&#xff1a;SSH客户端 方式3&#xff1a;正确…

airpods 无法使用Windows电脑充电的解决方法

打开设置 -> 蓝牙与其他设备 -> 显示更多设备 往下翻&#xff0c;找到“更多设备与打印机设置”&#xff0c;打开设备界面&#xff1a; 打开" Airpods Case"&#xff0c;找到“硬件”选项 -> 双击"符合HID标准的供应商定义设备" -> “驱动程序…

Markdown(轻量级标记语言)基本语法教程

学习总是避免不了记笔记&#xff0c;除了在线的记录一些博客外&#xff0c;也会需要一些不方便在线记录的线下笔记&#xff0c;那么找到一个好用方便的适合记录代码的工具&#xff0c;就很重要&#xff0c;这里给大家分享一下Markdown基本语法&#xff0c;可以很简单的达成我们…

GPT-4.5!!!

GPT-4 还没用明白&#xff0c;GPT-4.5 就要发布了。 最近&#xff0c;OpenAI 泄露了 GPT-4.5 的发布页面&#xff0c;除了进一步增强复杂推理和跨模态理解&#xff0c;GPT-4.5 增加了一个更加强大的功能——3D。 3D 功能的进一步支持&#xff0c;也就意味着多模态最后一块版图…

Java21新特性-虚拟线程

虚拟线程是轻量级线程&#xff08;类似于 Go 中的 “协程&#xff08;Goroutine&#xff09;”&#xff09;&#xff0c;可以减少编写、维护和调度高吞吐量并发应用程序的工作量。 线程是可供调度的最小处理单元&#xff0c;它与其他类似的处理单元并发运行&#xff0c;并且在…

设计模式——责任链模式(行为模式)

引言 责任链模式是一种行为设计模式&#xff0c; 允许你将请求沿着处理者链进行发送。 收到请求后&#xff0c; 每个处理者均可对请求进行处理&#xff0c; 或将其传递给链上的下个处理者。 问题 假如你正在开发一个在线订购系统。 你希望对系统访问进行限制&#xff0c; 只允…

Rsyslog 8.1901.0 配置Tls模式加密传输log

需求背景&#xff1a;客户需要配置Tls加密模式上传log&#xff0c;老虎动手来搞搞&#xff0c; 推荐看下面的技术文档&#xff0c;官方的没有下面这个好用 https://rsyslog.readthedocs.io/en/latest/tutorials/tls_cert_summary.html 我们可以在github上下载官方文档编译后查看…

OCC 创建简单几何

使用 OCC 创建 正方体和圆柱体&#xff0c;并且通过布尔运算&#xff0c;切除正方体内的圆柱体&#xff0c;保存 stl 几何模型。 #include <iostream> #include <iomanip> #include "BRepPrimAPI_MakeCylinder.hxx" #include "BRepPrimAPI_MakeBox…

Elasticsearch的批量bulk 提交 写入的方式会有顺序问题吗?

Elasticsearch的分布式特性可能会导致写入操作的执行顺序与提交顺序稍有不同。在分布式环境中,Elasticsearch将数据分散到不同的节点上进行存储和处理,因此写入操作的执行顺序可能会受到网络延迟、负载均衡等因素的影响。 根源在于ES的分布式架构。如上图所示,客户端的命令首…

C++学习笔记(十五)

继承 继承是面向对象三大特性之一 有些类与类之间存在特殊的关系&#xff0c;例如下图中&#xff1a; 我们发现&#xff0c;定义这些类时&#xff0c;下级别的成员除了拥有上一级的共性&#xff0c;还有自己的特性。 这个时候我们就可以考虑利用继承的技术&#xff0c;减少重…

自动封箱打包码垛缠绕流水线案例

广西交投在某地新建工厂后&#xff0c;需要建设一条生产隧道灯&#xff0c;后段自动封箱打包码垛缠绕包装线。 凯隆包装在深入了解客户需求后&#xff0c;结合客户实际生产情况&#xff0c;为客户量身定制了集智能感应系统、产品自动折盖上下封箱、捆扎两道打包带、码垛机械臂自…

windows如何环境搭建属于自己的Zblog博客并发布上线公网访问?

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…

2024上半年软考别轻易尝试!先了未发布

最近几年&#xff0c;软件考试变得非常受欢迎&#xff01;不论你的专业、学历或工作时间如何&#xff0c;你都可以报名参加&#xff0c;而且通过考试取得证书还能用来抵扣个人所得税、评职称、帮助落户和参与招投标等等。 身边的朋友们纷纷参加软考&#xff0c;这让我也产生了…

自由撰稿人如何快速记录灵感?随手记录灵感素材的电子记事本

随着互联网的发展&#xff0c;催生了很多新的职业&#xff0c;其中“自由撰稿人”就是很多年轻人正在做的工作。而对于自由撰稿人来说&#xff0c;灵感是创作的源泉。然而&#xff0c;灵感往往稍纵即逝&#xff0c;如何快速记录下来&#xff0c;成为了我们面临的一大挑战。 那…

云原生基础入门概念

文章目录 发现宝藏云原生的概念云原生的关键技术为何选择云原生&#xff1f;云原生的实际应用好书推荐 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【宝藏入口】。 云原生的概念 当谈及现…

Linux下Netty实现高性能UDP服务

前言 近期笔者基于Netty接收UDP报文进行业务数据统计的功能&#xff0c;因为Netty默认情况下处理UDP收包只能由一个线程负责&#xff0c;无法像TCP协议那种基于主从reactor模型实现多线程监听端口&#xff0c;所以笔者查阅网上资料查看是否有什么方式可以接收UDP收包的性能瓶颈…

虹科干货 | 克服端口顺序影响,使用 PCAN实现固定设备ID/通道分配

导读&#xff1a;多设备协同工作是常见的需求。然而&#xff0c;适配器的插入顺序可能会影响到设备的识别和访问&#xff0c;给系统管理带来不便。虹科PCAN能够进行固定设备ID/通道分配&#xff0c;确保设备不受适配器插入顺序的影响&#xff0c;提高系统的稳定性和可靠性。本文…

台积电大幅上调产能,12英寸晶圆产能提至每月5.5万片 | 百能云芯

台积电熊本新厂势如破竹&#xff0c;产能将迎来大幅提升&#xff0c;计划逐步达到每月5.5万片的12英寸晶圆产能。据了解&#xff0c;新厂的扩产计划将从2024年第4季开始实施。此次的战略举措不仅是对海外市场布局的重大突破&#xff0c;更是对日本半导体产业生态系统的积极推动…

TikTok矩阵玩法分享,如何建立TikTok矩阵?

矩阵是在 TikTok 上非常常见的营销方式&#xff0c;很多卖家想要通过矩阵化运营快速涨粉。但要想做好TikTok矩阵&#xff0c;需要有明确的方向和计划。下面东哥我将分享一些做TikTok矩阵的玩法&#xff0c;帮助大家更好地搭建自己的TikTok矩阵。 了解TikTok矩阵 TikTok矩阵是一…