Prometheus告警处理

news2025/1/19 14:31:31

Alertmanager介绍

Prometheus 包含一个报警模块,就是 AlertManager,Alertmanager 主要用于接收 Prometheus 发送的告警信息,它支持丰富的告警通知渠道,而且很容易做到告警信息进行去重、降噪、分组等,是一款前卫的告警通知系统。
通过在 Prometheus 中定义告警规则,Prometheus 会周期性的对告警规则进行计算,如果满足告警触发条件就会向 Alertmanager 发送告警信息。
告警能力在 Prometheus 的架构中被划分成两个独立的部分。如下所示,通过在 Prometheus 中定义 AlertRule (告警规则),Prometheus 会周期性的对告警规则进行计算,如果满足告警触发条件就会向 Alertmanager 发送告警信息。
image.png
在 Prometheus 中一条告警规则主要由以下几部分组成:

  • 告警名称

用户需要为告警规则命名,当然对于命名而言,需要能够直接表达出该告警的主要内容。

  • 告警规则

告警规则实际上主要由 PromQL 进行定义,其实际意义是当表达式(PromQL)查询结果持续多长时间(During)后出发告警。

部署 AlertManager

Alertmanager 和Prometheus Server 一样均采用 Golang 实现,并且没有第三方依赖。

Linux 安装 AlertManager

1)下载安装包
Alertmanager 最新版本可以从官网获取。

官方网站:https://prometheus.io/download/

wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz

2)创建 alertmanager 配置文件
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 主要负责对 Prometheus 产生的告警进行统一处理,因此在 Alertmanager 配置中一般会包含以下几个主要部分:

  • 全局配置(global):用于定义一些全局的公共参数,如全局的 SMTP 配置,Slack 配置等内容;
  • 模板(templates):用于定义告警通知时的模板,如 HTML 模板,邮件模板等;
  • 告警路由(route):根据标签匹配,确定当前告警应该如何处理;
  • 接收人(receivers):接收人是一个抽象的概念,它可以是一个邮箱也可以是微信,Slack 或者 Webhook 等,接收人一般配合告警路由使用;
  • 抑制规则(inhibit_rules):合理设置抑制规则可以减少垃圾告警的产生;

3)启动 Alertmanager
Alermanager 会将数据保存到本地中,默认的存储路径为 data/。因此,在启动 Alertmanager 之前需要创建相应的目录:

./alertmanager

用户也在启动 Alertmanager 时使用参数修改相关配置。--config.file用于指定 alertmanager 配置文件路径,--storage.path用于指定数据存储路径。

查看运行状态:
Alertmanager 启动后可以通过 9093 端口访问。

http://192.168.3.100:9093

Alert 菜单下可以查看 Alertmanager 接收到的告警内容。Silences 菜单下则可以通过 UI 创建静默规则。进入 Status 菜单,可以看到当前系统的运行状态以及配置信息。

Docker 安装AlertManager

mkdir -p /etc/alertmanager/
mkdir -p /etc/alertmanager/template

vim /etc/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']

docker run -d -p 9093:9093 \
-v /etc/alertmanager:/etc/alertmanager \
-v /etc/localtime:/etc/localtime \
prom/alertmanager

使用 Receiver 接收告警信息

告警接收器可以通过以下形式进行配置:

receivers:
 - <receiver> ...

每一个 receiver 具有一个全局唯一的名称,并且对应一个或者多个通知方式。
目前官方内置的第三方通知集成包括:邮件、 即时通讯软件(如 Slack、Hipchat)、移动应用消息推送(如 Pushover)和自动化运维工具(例如:Pagerduty、Opsgenie、Victorops)。Alertmanager 的通知方式中还可以支持 Webhook,通过这种方式开发者可以实现更多个性化的扩展支持。

集成 qq 邮箱

1)qq 邮箱申请授权码

参考:https://service.mail.qq.com/detail/0/75

2)配置 qq 邮箱 alert

global: # 全局配置
  resolve_timeout: 5m # 当告警的状态由firing变为resolve时,需等待5min,如果报警未更新,则声明该告警已解决。可略微调高阈值避免
  smtp_smarthost: 'smtp.qq.com:465'
  smtp_from: '276****211@qq.com'
  smtp_auth_username: '276****211@qq.com'
  smtp_auth_password: 'xxxxxxxxx' # 这个授权码需要生成,非QQ密码
  smtp_require_tls: false
templates:
  - '/etc/alertmanager/template/*.tmpl'
route:
  group_by: ['service','alertname','cluster'] # 根据label进行分组。--cluster可创建集群
  group_wait: 30s # 触发告警后,等待30s发送
  group_interval: 10s # 两组告警发送的时间间隔
  repeat_interval: 5m # 重复告警发送的时间间隔
  receiver: 'email' # 默认接收者
receivers: # 告警的处理方式email
  - name: 'email'
    email_configs: # 告警转发到对应邮箱地址
      - to: '276****211@qq.com'
        send_resolved: true
        html: '{{ template "email.html" . }}' # 使用自定义的模板发送
      
inhibit_rules: # 添加抑制规则
  - source_match: # 根据label匹配源告警
      severity: 'critical'
    target_match: # 根据label匹配目的告警
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance'] 

3)创建自定义模版

vim /etc/alertmanager/template/email.tmpl

{{ define "email.html" }}
{{ range $i, $alert :=.Alerts }}
========监控报警==========<br>
告警状态:{{   .Status }}<br>
告警级别:{{ $alert.Labels.severity }}<br>
告警类型:{{ $alert.Labels.alertname }}<br>
告警应用:{{ $alert.Annotations.summary }}<br>
告警主机:{{ $alert.Labels.instance }}<br>
告警详情:{{ $alert.Annotations.description }}<br>
触发阀值:{{ $alert.Annotations.value }}<br>
告警时间:{{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05"}}<br>
========end=============<br>
{{ end }}
{{ end }}

注意:
StartsAt.Fromat为 UTC 时间,比北京时间晚了 8 个小时,需要加 28800e9;
2006-01-02 15:04:05不能改变 ,此处为 go 语言出版时间;

启用 alertmanager 模块和 rules 告警规则

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

1)编辑 Prometheus 配置文件 prometheus.yml,并添加以下内容

global:
  scrape_interval:     5s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 5s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      - 192.168.3.100:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  - "/etc/prometheus/rules/*.rules"
  # - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.

重启 Prometheus 服务,成功后,可以从http://192.168.3.100:9090/config查看 alerting 配置是否生效。

2)创建 rules 告警规则

主机 CPU 利用率 > 85%
主机 MEM 利用率 > 70%

mkdir -p /etc/prometheus/rules
vim /etc/prometheus/rules/alerts.rules

groups:
- name: hostStatsAlert
  rules:
  - alert: hostCpuUsageAlert
    expr: (1 - avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance))*100 > 85
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "Instance {{ $labels.instance }} CPU usage high"
      description: "{{ $labels.instance }} CPU usage above 85% (current value: {{ $value }})"
  - alert: hostMemUsageAlert
    expr: (1 - (node_memory_MemAvailable_bytes{} / (node_memory_MemTotal_bytes{})))* 100 > 70
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "Instance {{ $labels.instance }} MEM usage high"
      description: "{{ $labels.instance }} MEM usage above 70% (current value: {{ $value }})"

重启 Prometheus 后访问 Prometheus UI http://127.0.0.1:9090/rules可以查看当前以加载的规则文件。
切换到 Alerts 标签http://127.0.0.1:9090/alerts可以查看当前告警的活动状态。
此时,我们可以手动拉高系统的 CPU 使用率,验证 Prometheus 的告警流程,在主机上运行以下命令:

vim load_cpu.sh

#!/bin/bash  
while true; do  
  :  
done

chmod +x load_cpu.sh
./load_cpu.sh

运行命令后查看 CPU 使用率情况。
Prometheus 首次检测到满足触发条件后,hostCpuUsageAlert 显示由一条告警处于活动状态。由于告警规则中设置了 1m 的等待时间,当前告警状态为 PENDING。

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

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

相关文章

链表精选题集

目录 1 链表翻转 题目链接&#xff1a; 解题&#xff1a; 试错版&#xff1a; 2 找中间节点 题目链接: 题解&#xff1a; 3 找倒数第k个节点 题目链接&#xff1a; 题解&#xff1a; 4 将两个升序链表合并为一个升序链表 题目链接&#xff1a; 题解&#xff1a; …

[电磁学]猴博士不挂科

1 利用表格求场强 2 利用叠加求场强 3 利用积分求场强 电场立库仑力 球的面积公式是4πr&#xff0c;其中r为球的半径。 球的体积公式是(4/3)πr&#xff0c;其中r为球的半径。 带电物体有体积:

软件测试/测试开发丨Python 内置库 OS 学习笔记分享

os 概述 os: Operating System os 使用 导入 os 模块 查看 os 模块使用文档 help(os)dir(os) import os# 查看os模块说明文档 help(os)# 查看os模块的属性和方法 print(dir(os))os 操作系统相关 os.name&#xff1a;获取系统名称os.environ&#xff1a;获取系统环境变量信…

是时候将javax替换为Jakarta了

开始 相信很多朋友在使用新版本的Spring的时候&#xff0c;发现了一些叫jakarta的包&#xff0c;看起来有点陌生。 很多时候&#xff0c;比较纠结不知道该导入哪一个包。 jakarta其实就是之前的javax。 主要JavaEE相关的&#xff0c;从之前javax名字也可以看出来&#xff0…

【AMD Xilinx】ZUBoard(2):通过AXI GPIO控制PL端的管脚输出

【AMD Xilinx】ZUBoard&#xff08;2&#xff09;&#xff1a;通过AXI GPIO控制PL端的管脚输出 一、基本功能和流程二、Vivado工程1. 总体框图2. AXI GPIO相关部分3. 配置AXI GPIO4. 绑定管脚4.1 根据原理图查找对应管脚4.1.1 LED04.1.2 LED1 4.2 I/O Planning 5. XDC 三、ARM代…

python+django游戏分享论坛网站49c2c

本系统主要包括管理员和用户两个角色组成&#xff1b;主要包括首页、个人中心、用户管理、游戏类型管理、游戏文章管理、交流论坛、系统管理等功能的管理系统。 系统权限按管理员和用户两类涉及用户划分。 &#xff08;1&#xff09;管理员功能需求 管理员登陆后&#xff0c;主…

c++学习笔记-提高篇-STL-函数对象

目录 一、函数对象 二、函数对象使用 三、谓词 1、概念 2、一元谓词 3、二元谓词 插入一条sort函数源码 四、内建函数对象 1.基本概念 2、算数仿函数 3、关系仿函数 4、逻辑仿函数 一、函数对象 函数对象概念 &#xff08;1&#xff09;重载函数调用操作符的类&a…

ESP32:整合存储配网信息和MQTT笔记

文章目录 1.给LED和KEY的所用IO增加配置项1.1 增加配置文件1.2 修改相应的c源码 2. 把mqtt\tcp的工程整合到一起2.1 在何处调用 mqtt_app_start() 3. 测试MQTT4. 完整的工程源码 有一段时间没有玩ESP32&#xff0c;很多知识点都忘记了。今天测试一下MQTT&#xff0c;做个笔记。…

Vue.js学习笔记(1)——Visual Studio Code搭建Vue.js框架

1 安装Node.js 1、下载安装包&#xff1a;进入官网&#xff08;https://nodejs.org/en&#xff09;&#xff0c;下载左侧的稳定版。 2、选择安装位置&#xff0c;不用勾选自动安装必要工具。 其他都默认Next。 配置环境&#xff0c;具体参考本文章&#xff1a; https://blo…

数据结构之树 --- 二叉树 < 堆 >

目录 1. 树是什么&#xff1f; 1.1 树的表示 2. 二叉树 2.1 二叉树的概念 2.2 特殊的二叉树 2.3 二叉树的性质 2.4 二叉树的存储结构 2.4.1 顺序存储 2.4.2 链式存储 3. 二叉树顺序结构的实现 <堆> 3.1 二叉树的顺序结构 ​编辑 3.2 堆的概念及结构 ​编辑…

啊?这也算事务?!

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

数据库开发之事务和索引的详细解析

2. 事务 场景&#xff1a;学工部整个部门解散了&#xff0c;该部门及部门下的员工都需要删除了。 操作&#xff1a; -- 删除学工部 delete from dept where id 1; -- 删除成功 ​ -- 删除学工部的员工 delete from emp where dept_id 1; -- 删除失败&#xff08;操作过程中…

Linux升级指南:保持系统安全和高效运行

Linux系统的升级是确保系统稳定和安全性的重要步骤。本文将介绍Linux系统升级的基本概念&#xff0c;以及具体的操作步骤和注意事项&#xff0c;以帮助用户顺利升级他们的Linux系统。 Linux操作系统以其稳定性和可定制性而闻名&#xff0c;它经常通过升级来提供新的功能、修复漏…

C++ 之LeetCode刷题记录(五)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅&#xff0c;多学多练&#xff0c;尽力而为。 先易后难&#xff0c;先刷简单的。 20. 有效的括号 给定一个只包括 ‘(’&#xff0c;‘)’&…

[GDOUCTF 2023]hate eat snake

[GDOUCTF 2023]hate eat snake wp 一般说玩游戏的题答案在源码里&#xff0c;但是本题源码中没有任何跟 “flag” 或者 “ctf” 有关的信息。 页面如下&#xff1a; 唤出控制台 在此页面中 F12 调不出控制台&#xff08;可能是在 js 代码中禁用了&#xff09;。但其实还有两…

结构体:是第几天

今天是该年的第几天 #include<iostream> using namespace std; struct Date //创建结构体 {int year; //年int month; //月int day; //日 }; void inputDate(Date *p) //输入函数 {cin >> p->year >> p->month >> p->day; //输入年、月、…

使用Google OSV工具扫描依赖安全漏洞

安全漏洞是软件工程化能力的试金石 2021年年底&#xff0c;Log4j的漏洞陆续被公开。因为该框架被大量的开源软件依赖&#xff0c;所以&#xff0c;漏洞影响面非常大。 面对这个漏洞&#xff0c;我们遇到的第一个问题是&#xff1a;如何知道我们哪些工程使用了Log4j&#xff1f;…

如何修改Anaconda的Jupyter notebook的默认启动路径

1.打开Anaconda控制台 2.输入下面的命令 jupyter notebook --generate-config 这个命令的作用是生成 Jupyter notebook 的配置文件。如果你是第一次运行&#xff0c;会直接生成这个文件。如果曾经运行过这个命令&#xff0c;就会像下图一样问你时候要覆盖原来的文件。这个时候…

几种取时间的方法(附代码)

1.上古版 最原始的取时间的方法大概就是timelocaltime了&#xff0c;见代码&#xff1a; #include <stdio.h>#include <time.h>// gcc -o time_1 time_1.cint main(){time_t tm_now;time(&tm_now);// 或者写成 tm_now time(NULL);//1.直接打印&#xff1a;197…

探讨kernel32.dll文件是什么,有效解决kernel32.dll丢失

在使用电脑时&#xff0c;你是否遇到过kernel32.dll丢失的困扰&#xff1f;面对这个问题&#xff0c;我们需要及时去解决kernel32.dll丢失的问题。接下来&#xff0c;我们将深入探讨kernel32.dll的功能以及其在操作系统和应用程序中的具体应用领域&#xff0c;相信这将对你解决…