prometheus实战之四:alertmanager的部署和配置

news2025/4/22 10:20:41

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

本篇概览

  • 本文是《prometheus实战》系列的第四篇,在《prometheus实战之三:告警规则》中曾经提到过,整个告警功能分为规则和通知两部分,前文详细说明了规则,今天要学习的就是剩下的通知部分
    在这里插入图片描述

  • 完整的数据流如下图,告警从prometheus出发,到达alertmanager之后,根据配置,alertmanager会调用web服务的接口,而web服务自己又会向飞书服务器发送请求,从而触发飞书APP收到通知
    在这里插入图片描述

  • 之所以选飞书作通知手段,首先是简单,其次是相对熟悉,您也可以按照自己的喜好去选择通知途径

  • 本篇要做的是把alertmanager部署好,配置好,至于后面的web服务就留在下一篇吧,咱们适当控制篇幅

  • 接下来把本篇的操作步骤按顺序列一下,然后开工,如下所示,一共八步,助您完成完全个性化的告警配置

1. 编写部署alertmanager的ansible脚本
2. 部署alertmanager
3. 配置prometheus,使告警到达alertmanager
4. 配置alertmanager,使通知到达web服务
5. 简单验证
  • 接下来就逐步完成吧

1. 编写部署alertmanager的ansible脚本

  • 关于用ansible部署软件的操作,咱们在《prometheus实战之一:用ansible部署》有详细的说明,因此关于ansible的基本设置就不在本篇赘述了,直接给出部署alertmanager的ansible脚本即可
  • ansible的改动一共有以下三步
1. 修改hosts : 增加alertmanager所在机器的登录信息
2. 修改vars.yml : 增加几个变量的定义
3. 新增install_alertmanager.yml : alertmanager部署脚本
  • hosts文件内容如下,新增了alertmanager,可见我这里是把prometheus和alertmanager部署在同一台机器上的,您可以按自己的实际情况调整
[prometheus-group]
prometheus ansible_host=192.168.50.134 ansible_port=22 ansible_user=prometheus ansible_password=888888
working001 ansible_host=192.168.50.134 ansible_port=22 ansible_user=prometheus ansible_password=888888
alertmanager ansible_host=192.168.50.134 ansible_port=22 ansible_user=prometheus ansible_password=888888
  • vars.yml文件内容如下,新增四个和alertmanager有关的
prometheus_user_home: /home/prometheus
prometheus_base_path: '{{prometheus_user_home}}/prometheus'
prometheus_url: https://github.com/prometheus/prometheus/releases/download
prometheus_version: 2.37.7
prometheus_deploy_path: '{{prometheus_base_path}}/prometheus-{{prometheus_version}}.linux-amd64'

node_exporter_base_path: '{{prometheus_user_home}}/node_exporter'
node_exporter_url: https://github.com/prometheus/node_exporter/releases/download
node_exporter_version: 1.5.0
node_exporter_deploy_path: '{{node_exporter_base_path}}/node_exporter-{{node_exporter_version}}.linux-amd64'

alertmanager_base_path: '{{prometheus_user_home}}/alertmanager'
alertmanager_url: https://github.com/prometheus/alertmanager/releases/download
alertmanager_version: 0.25.0
alertmanager_deploy_path: '{{alertmanager_base_path}}/alertmanager-{{alertmanager_version}}.linux-amd64'
  • 最后是执行部署的脚本install_alertmanager.yml
- name: 部署alertmanager
  hosts: alertmanager
  gather_facts: True
  vars_files:
  - vars.yml  
  tasks:
  - name: 停止残留的alertmanager
    ignore_errors: yes
    systemd:
      name: alertmanager
      state: stopped
    become: yes

  - name: 清理可能的alertmanager service残留文件
    file:
      path: /etc/systemd/system/alertmanager.service
      state: absent
    become: yes

  - name: 清理可能的alertmanager残留文件夹
    file:
      path: '{{alertmanager_base_path}}'
      state: absent

  - name: 新建部署文件夹
    file:
      path: '{{alertmanager_base_path}}'
      state: directory
      mode: '0755'

  - name: 下载并解压文件alertmanager-{{alertmanager_version}}.linux-amd64.tar.gz
    ansible.builtin.unarchive:
      src: '{{alertmanager_url}}/v{{alertmanager_version}}/alertmanager-{{alertmanager_version}}.linux-amd64.tar.gz'
      dest: '{{alertmanager_base_path}}'
      remote_src: yes

  - name: 生成systemd的service文件
    shell: |
      tee /etc/systemd/system/alertmanager.service <<-'EOF'
      [Unit]
      Description=Alert manager Server
      Documentation=https://prometheus.io/docs/introduction/overview/
      After=network-online.target
      [Service]
      User=prometheus
      Restart=on-failure
      ExecStart={{alertmanager_deploy_path}}/alertmanager --config.file={{alertmanager_deploy_path}}/alertmanager.yml --storage.path={{alertmanager_base_path}}/data
      [Install]
      WantedBy=multi-user.target
      
      EOF
    become: yes

  - name: 刷新服务配置
    systemd:
      daemon_reload: true
    become: yes

  - name: 将alertmanager服务设置为自启动
    systemd:
      name: alertmanager
      enabled: true
      masked: no
    become: yes      

  - name: 启动alertmanager
    systemd:
      state: started
      name: alertmanager
    become: yes      
  • 以上就是部署alertmanger所需的全部脚本了,它们都存放在ansible服务器的playbooks目录下

2. 部署alertmanager

  • ssh到ansible服务器,在playbooks目录执行以下命令即可完成部署
ansible-playbook install_alertmanager.yml
  • 检查服务状态,确认已经启动成功
    在这里插入图片描述
  • alertmanager也有自己的webui,端口号是9093,浏览器打开后如下图所示,只不过现在还是空空如也的状态
    在这里插入图片描述

3. 配置prometheus,使告警到达alertmanager

  • 目前prometheus还不知道alertmanager服务已就绪,需要修改它的配置文件prometheus.yml,让它知道alertmanager在哪里
  • 以prometheus账号的身份登录prometheus服务器,修改prometheus.yml文件,如下图,增加alertmanager的地址
    在这里插入图片描述
  • 然后用命令systemctl restart prometheus重启prometheus服务(注意是prometheus账号)
  • 可以在prometheus的webui检查配置是否成功
    在这里插入图片描述

4. 配置alertmanager,使通知到达web服务

  • 现在prometheus的告警可以到达alertmanager了,然后要考虑的是alertmanager如何处理这个告警,按照最初的目标,就是alertmanager会发起webhook,于是咱们就要在alertmanager上做配置,让它知道收到告警后该怎么做
  • alertmanager的告警通知配置共有以下五部分
  1. 全局配置(global):一些通用的全局参数
  2. 模板(templates):告警通知用的模板
  3. 告警路由(route):指定特定的告警去特定的通知目标,例如A告警走webhook,B告警走邮件通知
  4. 通知接受者(receivers):定义通知目标,例如webhook、邮件等
  5. 抑制规则(inhibit_rules):对告警进行收敛的规则,避免产生无用告警
  • 本篇使用的配置文件route.yml如下,每个配置都有详细描述
global:
  # 全局配置,收到告警后,如果持续10分钟都没再收到告警,就把告警状态标记为resolved(已解决)
  resolve_timeout: 10m
route:
  # 分组,处于同一组的告警会被合并为同一个通知
  # 这里设置的是alertname相同的告警会被合并为同一个通知
  group_by: ['alertname']
  # 30秒是个时间窗口,这个窗口内,同一个分组的所有消息会被合并为同一个通知
  group_wait: 30s
  # 同一个分组发送一次合并消息之后,每隔1分钟检查一次告警,判断是否要继续对此告警做操作
  group_interval: 1m
  # 按照group_interval的配置,每隔1每分钟检查一次,等到第六次时,1*6=6,大于repeat_interval的5m,此时就会在再次发送告警
  repeat_interval: 5m
  # 指定具体的通知方式
  # 简单起见,这里只配置了顶级路由,没有针对故障的标签进行细分
  receiver: 'web.hook'
receivers:
  - name: 'web.hook'
    webhook_configs:
      # alertmanager发起web请求的地址
      - url: 'http://192.168.50.134:8080/webhook'
# 告警抑制规则,可以有多条
inhibit_rules:
  # 这个规则的意思是:一旦收到critical级别的告警,那么再收到低级别(warning)的告警就没必要通知了,
  # 还有一处非常重要的比较,就是低级别告警的node标签的值,要和critical级别告警的node标签的值要相等,也就是确保两个告警的来源相同
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['node']
  • 在本篇的实战中,由于prometheus发来的告警非常简单,只是个CPU使用量过高的告警,达不到上面的抑制规则的要求(需要sererity和node两个标签),所以抑制规则就不做实际演练了
  • 注意上面配置的webhook_configs,地址是http://192.168.50.134:8080/webhook,这是咱们自己写的一个web服务,只要alertmanager收到prometheus发来的告警,就会调用这个web接口,当然了,目前此接口还未实现,留待下一篇完成

5. 简单验证

  • 现在web应用还没有开发出来,所以alertmanager收到告警去调用web接口肯定会失败的
  • 不过即便如此,我也想强行试试效果,动手吧
  • 确保您的prometheus是正常状态,然后像前文那样把应用服务器的CPU弄得很高(例如运行ffmpeg),触发告警
    在这里插入图片描述
  • 这时候去看alertmanager的web UI,地址是http://192.168.50.134:9093/#/alerts,发现已经收到了来自prometheus的告警,证明咱们的部署和配置都是有效的了
    在这里插入图片描述
  • 既然咱们配置了webhook,而且webhook的地址是个不存在的服务,那么alertmanager的告警通知应该会发生调用失败吧,这只是个推测,要如何确认呢?
  • 用命令journalctl _PID=767查看alertmanager日志,767是alertmanager的进程ID,内容如下所示,可见alertmanager确实根据配置向http://127.0.0.1:5001发起了web调用,遇到了connection refused错误,完全符合预期
May 13 10:04:40 deskmini alertmanager[767]: ts=2023-05-13T02:04:40.869Z caller=notify.go:732 level=warn component=dispatcher receiver=web.hook integration=webhook[0] msg="Notify attempt failed, will retry later" attempts=1 err="Post \"http://127.0.0.1:5001/\": dial tcp 127.0.0.1:5001: connect: connection refused"
May 13 10:09:40 deskmini alertmanager[767]: ts=2023-05-13T02:09:40.869Z caller=dispatch.go:352 level=error component=dispatcher msg="Notify for alerts failed" num_alerts=1 err="web.hook/webhook[0]: notify retry canceled after 16 attempts: Post \"http://127.0.0.1:5001/\": dial tcp 127.0.0.1:5001: connect: connection refused"
May 13 10:09:40 deskmini alertmanager[767]: ts=2023-05-13T02:09:40.869Z caller=notify.go:732 level=warn component=dispatcher receiver=web.hook integration=webhook[0] msg="Notify attempt failed, will retry later" attempts=1 err="Post \"http://127.0.0.1:5001/\": dial tcp 127.0.0.1:5001: connect: connection refused"
  • 至此,alertmanager的部署和配置就完成了,也初步验证过基本功能都是正常的,下一篇咱们一起动手开发web服务,达到最终目标:应用服务器CPU偏高的时候,飞书APP收到告警

你不孤单,欣宸原创一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 数据库+中间件系列
  6. DevOps系列

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

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

相关文章

基于AT89C51单片机的并入串出乘法口诀的设计与仿真

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/87779146?spm1001.2014.3001.5503 源码获取 并入串出乘法口诀的设计与仿真系统设计 目录 第一章 概述 3 1.1课题研究及意义 3 1.2课题设计内容 4 第二章系统设计…

FE_Vue学习笔记 路由基本使用

1 路由的简介- router 路由【route】就是一组key-value的对应关系。 多个路由&#xff0c;需要经过路由器【router】的管理。 SPA (single page web application&#xff09;应用 - 单页面web应用【一个index.html】 1&#xff09;单页Web应用&#xff08;single page web a…

Linux快照太有趣了!

1.首先介绍一下什么是Linux快照 VMware 的菜单栏中有虚拟机快照这个选项&#xff0c;形象来说快照就相当于一个备份文件&#xff0c;记录的是虚拟机运行到某一节点时的状态&#xff0c;在虚拟机的使用过程中如果发生了意外&#xff0c;比如系统崩溃或系统异常&#xff0c;此时…

python字典(一)——defaultdict的学习

一、前言 本页主要用来记录python字典的一些知识 二、Python中的defaultdict的详解 2.1defaultdict返回的默认值 defaultdict顾名思义默认字典&#xff0c;这个字典属于普通字典的一个子集&#xff0c;是对普通字典的改进 dcit的使用&#xff1a; 当访问字典里面不存在的key时会…

leetcode:相对名次(详解)

前言&#xff1a;内容包括-题目&#xff0c;代码实现&#xff0c;大致思路&#xff0c;代码解读 目录 题目&#xff1a; 代码实现&#xff1a; 大致思路&#xff1a; 代码解读&#xff1a; part 1&#xff1a;开辟返回数组 part 2&#xff1a;score数组的每个元素及其下标…

视觉大模型DINOv2:自我监督学习的新领域

如果你对自监督学习感兴趣&#xff0c;可能听说过Facebook人工智能的DINO(无标签知识蒸馏)。我们在以前的文章中也介绍过它。DINOv2不仅是一个新版本而且带来了新的改进&#xff0c;并为判别性自监督学习设定了更高的标准。当然公司的名字也从Facebook变为了Meta。 本文将介绍…

成功打破 GPT-4 上限,新版 Claude 横空出世!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 前 OpenAI 团队成员在离职后&#xff0c;创办了 Anthropic 公司。今年 3 月份的时候&#xff0c;该公司推出一款名为 Claude 的应用&#xff0c;试图与 ChatGPT 一争高下。 一个多月过去了…

分享Python采集77个css3代码,总有一款适合您

分享Python采集77个css3代码&#xff0c;总有一款适合您 Python采集的77个css3代码下载链接&#xff1a;https://pan.baidu.com/s/13EiUDXOAZvvKmF2KGrivzA?pwdubb2 提取码&#xff1a;ubb2 两款漂亮的bootstrap分页样式 纯CSS3用户卡片设计效果 4种炫酷CSS3 loading预加…

第六十章 Unity 发布Web平台

WebGL 是一种用于在 Web 浏览器中渲染图形的 API&#xff0c;基于 OpenGL ES 图形库的功能。WebGL 1.0 大致与 OpenGL ES 2.0 功能相匹配&#xff0c;而 WebGL 2.0 大致与 OpenGL ES 3.0 功能相匹配。WebGL 构建选项允许 Unity 将内容发布为 JavaScript 程序&#xff0c;而这些…

FastDFS+Nginx - 本地搭建文件服务器同时实现在外远程访问「端口映射」(1)

大家好&#xff0c;我是晓星航。今天为大家带来的是面向对象编程相关的讲解&#xff01;&#x1f600; 文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Ngi…

ARM 处理器模式(二)

文章目录 ARM 处理器模式工作模式模式切换内核寄存器各个模式对应的内核寄存器 ARM 处理器模式 ARMv7-a 处理器共有 9 种工作模式 工作模式 User&#xff1a;用户模式&#xff0c;非特权模式&#xff0c;大部分程序运行的时候就处于此模式FIQ&#xff1a;快速中断模式&#x…

算法修炼之练气篇——练气二十二层

博主&#xff1a;命运之光 专栏&#xff1a;算法修炼之练气篇 前言&#xff1a;每天练习五道题&#xff0c;炼气篇大概会练习200道题左右&#xff0c;题目有C语言网上的题&#xff0c;也有洛谷上面的题&#xff0c;题目简单适合新手入门。&#xff08;代码都是命运之光自己写的…

Vue列表展示计数器【第二篇】

&#x1f331; 1、vue列表展示案例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>vueDemo02列表展示</title> </head> <body> <div id"xy"><!--原始展示方式…

2023最新CleanMyMac中文版系统清理优化工具

CleanMyMac中文版功能非常的强大&#xff0c;操作简单&#xff0c;使用起来高效快捷&#xff0c;软件自身拥有一个安全数据&#xff0c;且拥有一定的规格&#xff0c;CleanMyMac中文版能够确定软件能够正确选择和清理Mac垃圾文件&#xff0c;更加安全&#xff0c;可靠。一键快速…

thinkPhP6.0安装教程图解--PHP框架安装

ThinkPhP 6.0 安装 1.环境检查 首先&#xff0c;thinkphp6.0&#xff0c;要求php的环境是7.2.5及以上的&#xff0c;所以先检查自己的php环境是否符合要求。 在cmd命令窗口中输入php -v 或者没有配置环境变量的话&#xff0c;可以在php编辑器中输出php_info()或则PHP_VERSIO…

记录一次异常:feign异常--NoSuchBeanDefinitionException: No qualifying bean of type

1、完整报错 2023-06-29 16:17:28.127 WARN 3732 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyExcep…

JetCache 使用简单案例到源码解析读这一篇就够

背景 github.com/alibaba/jet… 一、使用方法&#xff1a; 1. 创建项目— 此处使用springboot项目 2. 引入starter <dependency> <groupId>com.alicp.jetcache</groupId> <artifactId>jetcache-starter-redis</artifactId><version>2…

Servlet3.0 新特性全解

Servlet3.0新特性全解 tomcat 7以上的版本都支持Servlet 3.0 Servlet 3.0 新增特性 注解支持&#xff1b;Servlet、Filter、Listener无需在web.xml中进行配置&#xff0c;可以通过对应注解进行配置&#xff1b;支持Web模块&#xff1b;Servlet异步处理&#xff1b;文件上传AP…

DEV SIT UAT PET SIM PRD PROD常见环境英文缩写含义

一、英文缩写 英文中文 DEV development开发 SIT System Integrate Test系统整合测试&#xff08;内测&#xff09; UAT User Acceptance Test用户验收测试 PET Performance Evaluation Test性能评估测试&#xff08;压测&#xff09; SIM simulation仿真 PRD/PROD produ…

我们花一个月调研了小红书种草的新机会和增长策略

分析师&#xff1a;Jane、彬超 编辑&#xff1a;yolo 出品&#xff1a;增长黑盒研究组 *本报告为增长黑盒独立研究系列&#xff0c; 与第三方不存在任何利益关系 随着618的临近&#xff0c;小红书再次成为了品牌重要的“营销战场”。面临着经济环境的不确定性&#xff0c;想必各…