云原生之深入解析Prometheus AlertManager的实战操作

news2024/12/27 11:50:39

一、概述

  • Prometheus 包含一个报警模块,就是 AlertManager,Alertmanager 主要用于接收 Prometheus 发送的告警信息,它支持丰富的告警通知渠道,而且很容易做到告警信息进行去重、降噪、分组等,是一款前卫的告警通知系统。
  • Prometheus 的学习资料:
    • GitHub 地址
    • 官方文档
    • 关于 Prometheus 整体介绍,请参考:Prometheus 原理详解
    • Prometheus 和 Pushgetway 的安装,请参考:Prometheus Pushgetway 讲解与实战操作

在这里插入图片描述

二、AlertManager 架构

  • AlertManager 的架构如下所示:

在这里插入图片描述

  • Alertmanager 由以下 6 部分组成:
    • API 组件——用于接收 Prometheus Server 的 http 请求,主要是告警相关的内容;
    • Alert Provider 组件——API 层将来自 Prometheus Server 的告警信息存储到 Alert Provider 上;
    • Dispatcher 组件——不断的通过订阅的方式从 Alert Provider 获取新的告警,并根据 yaml 配置的 routing tree 将告警通过 label 路由到不同的分组中,以实现告警信息的分组处理;
    • Notification Pipeline 组件——这是一个责任链模式的组件,它通过一系列的逻辑(抑制、静默、去重)来优化告警质量;
    • Silence Provider 组件——API 层将来自 prometheus server 的告警信息存储到 silence provider 上,然后由这个组件实现去重逻辑处理;
    • Notify Provider 组件——是 Silence Provider 组件的下游,会在本地记录日志,并通过 peers 的方式将日志广播给集群中的其他节点,判断当前节点自身或者集群中其他节点是否已经发送过,避免告警信息在集群中重复出现。

三、AlertManager 部署

① 下载

  • Prometheus 的下载地址。
wget https://github.com/prometheus/alertmanager/releases/download/v0.24.0/alertmanager-0.24.0.linux-amd64.tar.gz
tar -xf alertmanager-0.24.0.linux-amd64.tar.gz

② 配置

global:
  resolve_timeout: 5m

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 配置中一般会包含以下几个主要部分:
    • 全局配置(global):用于定义一些全局的公共参数,如全局的 SMTP 配置,Slack 配置等内容;
    • 模板(templates):用于定义告警通知时的模板,如 HTML 模板,邮件模板等;
    • 告警路由(route):根据标签匹配,确定当前告警应该如何处理;
    • 接收人(receivers):接收人是一个抽象的概念,它可以是一个邮箱也可以是微信,Slack 或者 Webhook 等,接收人一般配合告警路由使用;
    • 抑制规则(inhibit_rules):合理设置抑制规则可以减少垃圾告警的产生。
  • 具体字段解释:
    • global 全局设置;
    • resolve_timeout 当告警的状态有 firing 变为 resolve 的以后还要呆多长时间,才宣布告警解除,这个主要是解决某些监控指标在阀值边缘上波动,一会儿好一会儿不好;
    • route 是个重点,告警内容从这里进入,寻找自己应该用那种策略发送出去;
    • receiver 一级的 receiver,也就是默认的 receiver,当告警进来后没有找到任何子节点和自己匹配,就用这个 receiver;
    • group_by 告警应该根据那些标签进行分组;
    • group_wait 同一组的告警发出前要等待多少秒,这个是为了把更多的告警一个批次发出去;
    • group_interval 同一组的多批次告警间隔多少秒后,才能发出;
    • repeat_interval 重复的告警要等待多久后才能再次发出去;
    • routes 也就是子节点了,配置项和上面一样,告警会一层层的找,如果匹配到一层,并且这层的 continue 选项为 true,那么它会再往下找,如果下层节点不能匹配那么它就用区配的这一层的配置发送告警,如果匹配到一层,并且这层的 continue 选项为 false,那么它会直接用这一层的配置发送告警,就不往下找了。
    • match_re 用于匹配 label,此处列出的所有 label 都匹配到才算匹配;
    • inhibit_rules这个叫做抑制项,通过匹配源告警来抑制目的告警,比如说当主机挂了,可能引起主机上的服务、数据库、中间件等一些告警,假如说后续的这些告警相对来说没有意义,可以用抑制项这个功能,让 Prometheus 只发出主机挂了的告警;
    • source_match 根据 label 匹配源告警;
    • target_match 根据 label 匹配目的告警;
    • equal 此处的集合的 label,在源和目的里的值必须相等。如果该集合的内的值再源和目的里都没有,那么目的告警也会被抑制。

③ 启动服务

# 查看帮助
./alertmanager -h
# 可以直接启动,但是不提倡,最好配置alertmanager.service
./alertmanager
  • 配置 alertmanager.service 启动脚本:
# 默认端口9093
cat >/usr/lib/systemd/system/alertmanager.service<<EOF
[Unit]
Description=alertmanager

[Service]
WorkingDirectory=/opt/prometheus/alertmanager/alertmanager-0.24.0.linux-amd64
ExecStart=/opt/prometheus/alertmanager/alertmanager-0.24.0.linux-amd64/alertmanager --config.file=/opt/prometheus/alertmanager/alertmanager-0.24.0.linux-amd64/alertmanager.yml --storage.path=/opt/prometheus/alertmanager/alertmanager-0.24.0.linux-amd64/data --web.listen-address=:9093 --data.retention=120h
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF
  • 启动服务:
# 执行 systemctl daemon-reload 命令重新加载systemd
systemctl daemon-reload
# 启动
systemctl start alertmanager
# 检查
systemctl status alertmanager
netstat -tnlp|grep :9093
ps -ef|grep alertmanager

在这里插入图片描述

  • web 访问 http://ip:9093:

在这里插入图片描述

④ 与 Prometheus 集成

  • 修改 Prometheus 的配置文件,修改配置如下:

在这里插入图片描述

  • 重启 Prometheus:
systemctl restart prometheus

四、在 Prometheus 中设置告警规则

  • 在 Prometheus 配置中添加报警规则配置,配置文件中 rule_files 就是用来指定报警规则文件的,如下配置即指定存放报警规则的目录为 /etc/prometheus,规则文件为 rules.yml:
rule_files:
- /etc/prometheus/rules.yml
  • 警报规则允许基于 Prometheus 表达式语言的表达式来定义报警报条件的,并在触发警报时发送通知给外部的接收者(Alertmanager),一条警报规则主要由以下几部分组成:
    • alert——告警规则的名称;
    • expr——是用于进行报警规则 PromQL 查询语句;
    • for——评估告警的等待时间(Pending Duration);
    • labels——自定义标签,允许用户指定额外的标签列表,把它们附加在告警上;
    • annotations——用于存储一些额外的信息,用于报警信息的展示之类的。
  • rules.yml 如下所示:
groups:
- name: example
  rules:
  - alert: high_memory
    # 当内存占有率超过10%,持续1min,则触发告警
    expr: 100 - ((node_memory_MemAvailable_bytes{instance="192.168.182.110:9100",job="node_exporter"} * 100) / node_memory_MemTotal_bytes{instance="192.168.182.110:9100",job="node_exporter"}) > 90
    for: 1m
    labels:
      severity: page
    annotations:
      summary: spike memeory

五、 AlertManager 告警通道配置

## Alertmanager 配置文件
global:
  resolve_timeout: 5m
  # smtp配置
  smtp_from: "xxx@qq.com"
  smtp_smarthost: 'smtp.qq.com:465'
  smtp_auth_username: "xxx@qq.com"
  smtp_auth_password: "auth_pass"
  smtp_require_tls: true

# email、企业微信的模板配置存放位置,钉钉的模板会单独讲如果配置。
templates:
  - '/data/alertmanager/templates/*.tmpl'
# 路由分组
route:
  receiver: ops
  group_wait: 30s # 在组内等待所配置的时间,如果同组内,30秒内出现相同报警,在一个组内出现。
  group_interval: 5m # 如果组内内容不变化,合并为一条警报信息,5m后发送。
  repeat_interval: 24h # 发送报警间隔,如果指定时间内没有修复,则重新发送报警。
  group_by: [alertname]  # 报警分组
  routes:
      - match:
          team: operations
        group_by: [env,dc]
        receiver: 'ops'
      - match_re:
          service: nginx|apache
        receiver: 'web'
      - match_re:
          service: hbase|spark
        receiver: 'hadoop'
      - match_re:
          service: mysql|mongodb
        receiver: 'db'
# 接收器
# 抑制测试配置
      - receiver: ops
        group_wait: 10s
        match:
          status: 'High'
# ops
      - receiver: ops # 路由和标签,根据match来指定发送目标,如果 rule的lable 包含 alertname, 使用 ops 来发送
        group_wait: 10s
        match:
          team: operations
# web
      - receiver: db # 路由和标签,根据match来指定发送目标,如果 rule的lable 包含 alertname, 使用 db 来发送
        group_wait: 10s
        match:
          team: db
# 接收器指定发送人以及发送渠道
receivers:
# ops分组的定义
- name: ops
  email_configs:
  - to: '9935226@qq.com,10000@qq.com'
    send_resolved: true
    headers:
      subject: "[operations] 报警邮件"
      from: "警报中心"
      to: "小煜狼皇"
  # 钉钉配置
  webhook_configs:
  - url: http://localhost:8070/dingtalk/ops/send
    # 企业微信配置
  wechat_configs:
  - corp_id: 'ww5421dksajhdasjkhj'
    api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'
    send_resolved: true
    to_party: '2'
    agent_id: '1000002'
    api_secret: 'Tm1kkEE3RGqVhv5hO-khdakjsdkjsahjkdksahjkdsahkj'

# web
- name: web
  email_configs:
  - to: '9935226@qq.com'
    send_resolved: true
    headers: { Subject: "[web] 报警邮件"} # 接收邮件的标题
  webhook_configs:
  - url: http://localhost:8070/dingtalk/web/send
  - url: http://localhost:8070/dingtalk/ops/send
# db
- name: db
  email_configs:
  - to: '9935226@qq.com'
    send_resolved: true
    headers: { Subject: "[db] 报警邮件"} # 接收邮件的标题
  webhook_configs:
  - url: http://localhost:8070/dingtalk/db/send
  - url: http://localhost:8070/dingtalk/ops/send
# hadoop
- name: hadoop
  email_configs:
  - to: '9935226@qq.com'
    send_resolved: true
    headers: { Subject: "[hadoop] 报警邮件"} # 接收邮件的标题
  webhook_configs:
  - url: http://localhost:8070/dingtalk/hadoop/send
  - url: http://localhost:8070/dingtalk/ops/send

# 抑制器配置
inhibit_rules: # 抑制规则
  - source_match: # 源标签警报触发时抑制含有目标标签的警报,在当前警报匹配 status: 'High'
      status: 'High'  # 此处的抑制匹配一定在最上面的route中配置不然,会提示找不key。
    target_match:
      status: 'Warning' # 目标标签值正则匹配,可以是正则表达式如: ".*MySQL.*"
    equal: ['alertname','operations', 'instance'] # 确保这个配置下的标签内容相同才会抑制,也就是说警报中必须有这三个标签值才会被抑制。
  • 一般企业钉钉、邮件、webhook 告警通道比较常用,尤其是 webhook,一般都会通过 webhook 对接公司内部的统一告警平台。

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

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

相关文章

Android Studio实现内容丰富的安卓校园二手交易平台

如需源码可以添加q-------3290510686&#xff0c;也有演示视频演示具体功能&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动。 项目编号038 1.开发环境 android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看二手商品…

[学习笔记] 扩散模型 Diffusion

前置知识-从深度生成模型、隐变量、VAE开始 机器学习是人工智能的一种&#xff0c;它是一种通过利用数据&#xff0c;训练出模型&#xff0c;然后使用模型预测的一种方法。 机器学习分为监督学习、无监督学习和强化学习&#xff0c;这是根据数据训练方式分类的&#xff0c;通俗…

leetcode 100. 相同的树

2023.7.6 这题类似于树的对称性这道题&#xff0c;下面给出递归和迭代两种解法&#xff1a; 递归法&#xff1a; class Solution { public:bool isSameTree(TreeNode* p, TreeNode* q) {if(pnullptr && qnullptr) return true;if(pnullptr && q!nullptr || p…

python实现文本转语音音频

文章目录 文本转语音音频第一步&#xff1a;讯飞平台的注册第二步&#xff1a;导入程序所需要的依赖库第二步&#xff1a;websocket对象类的初始化第三步&#xff1a;websocket建立连接后的函数第四步&#xff1a;websocket数据返回结果的处理函数第五步&#xff1a;pcm音频转换…

VALSE 20200415 | 机器学习 vs 压缩感知:核磁共振成像与重建

【Talk】VALSE 20200415 | 机器学习 vs 压缩感知&#xff1a;核磁共振成像与重建 文章目录 【Talk】VALSE 20200415 | 机器学习 vs 压缩感知&#xff1a;核磁共振成像与重建Deep learning for MR imaging and analysis - Shanshan WangMachine Learning for CS MRI: From Model…

Spring Boot 中的视图解析器是什么,如何使用

Spring Boot 中的视图解析器是什么&#xff0c;如何使用 在 Spring Boot 中&#xff0c;视图解析器是将视图名称解析为具体视图对象的组件。视图对象可以是 JSP、FreeMarker、Thymeleaf 等模板引擎生成的 HTML 页面&#xff0c;也可以是 JSON、XML 等格式的数据响应。Spring B…

基于Javaweb实现ATM机系统开发实战(三)用户查询功能实现

首先通过我们查看前端界面发现&#xff0c;先要实现前端用户查询功能&#xff0c;主要就是要把list1和list2所需的数据传递给前端&#xff0c;由前端进行展示。 首先我们需要写一个servlet处理收到的请求&#xff1a; ps&#xff1a;Servlet是什么&#xff1f; Java Servlet 是…

FreeRTOS ~(五)队列的常规使用 ~ (1/5)队列解决同步缺陷

前情提要 FreeRTOS ~&#xff08;四&#xff09;同步互斥与通信 ~ &#xff08;1/3&#xff09;同步的缺陷 举例子说明&#xff1a;利用队列解决前述的"同步的缺陷"问题 static int sum 0; /* sum存放计算的结果 */ static volatile int flagCalcEnd 0; /* 标…

哪款3D虚拟人物建模软件好用?

3D虚拟人物建模软件一直以来受到许多人的关注和追捧。现在&#xff0c;随着智能手机的普及&#xff0c;3D虚拟人物手机建模软件也开始走进大家的视野。那么&#xff0c;市面上3D虚拟人物建模软件这么多&#xff0c;究竟哪款3D虚拟人物建模软件是好用的呢&#xff1f; 首先&…

【聚类算法】OPTICS基于密度聚类

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 对DBSCAN的补充&#xff0c;OPTICS聚类 1. 正文 1.0 DBSCAN的存在问题 前面我们介绍了DBSCAN&#xff0c;其能根据密度进行聚类。 但其存在这样一个问…

cv2 安装问题, opencv

解决安装了opencv-python&#xff0c;但 import cv2 报错。 需要安装&#xff1a; pip install opencv-python-headless

VS 2022 修改应用程序选择目标框架为4.8

一、设置访问项目属性为True 打开工具菜单---选项---适用于Unity的工具 将这个访问项目属性一栏设置为True。之后要解决方案再重新打开即可生效。 二、设置应用程序选择目标框架 点击项目-->属性-->应用程序选择目标框架为.netfromwork4.8

Java入门程序——运算符

文章目录 赋值运算符算术运算符自增运算符自减运算符 比较&#xff08;关系&#xff09;运算符逻辑运算符逻辑运算符——快速运算&#xff08;短路运算&#xff09; 复合赋值运算符条件运算符字符串连接运算符三元运算符总结 赋值运算符 • 格式&#xff1a;变量名表达式&…

1.7 用户注册_判断用户是否存在和自定义响应数据结构

步骤1&#xff1a;在顶级pom.xml添加常用工具依赖。 <!-- apache 工具类 --> <dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.11</version> </dependency> <depen…

实现TCP通信(socket套接字)

一、TCP通信实现的过程 服务器端 socket函数 与 通信域 #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); -domain: 指定通信域&#xff08;通信地址族&#xff09;; -type: 指定套接字类型; -protocol: 指定协…

大象机器人myCobot 280 2023版全新功能展示

引言 机械臂是一种可编程的、自动化的机械系统&#xff0c;它可以模拟人类的动作&#xff0c;完成各种任务&#xff0c;例如装配、喷涂、包装、搬运、焊接、研磨等。由于其高度灵活性和多功能性&#xff0c;机械臂在现代社会中已经得到了广泛的应用。 myCobot 280 M5Stack 202…

项目需求管理

项目需求管理的五大过程 一、需求获取 编写项目视图 范围文档 用户群分类 选择用户代表 建立核心队伍 确定使用实例 召开联合会议 分析用户工作流程、 确定质量属性、 检查问题报告 需求重用 二、需求分析 1、绘制关联图&#xff0c;用于定义系统与系统外部实体间的边界和接口的…

多个六轴机械臂联合作业搬运仿真(机器人工具箱)

1、建立三个六轴机械臂、工作平台与货物 clear clc close all % theta d a alpha sigma L1Link([0 0 0 pi/2 0 ]);%连杆1参数 L2Link([0 -0.1455 0.4375 0 0 ]);L2.offsetpi/2;%连杆2参数 L3Link(…

Playwright自动化测试工具 java版本

Playwright 第一个程序 public static void main(String[] args) {Playwright playwright Playwright.create(); // Browser browser playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false));BrowserType.LaunchOptions launchOptions …

nginx+lua(openresty) lua-mongodb 安装及使用(四)

前言 前章已经讲述 ua-protobuf 安装及使用 这章主要讲述 openresty 环境下 lua-mongodb 安装及使用 1:环境 ubuntu16(18) mongodb 3.6 2:安装mongodb 3.6 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5 #创…