prometheus实战之四:alertmanager的部署和配置
欢迎访问我的GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览
-
本文是《prometheus实战》系列的第四篇,在《prometheus实战之三:告警规则》中曾经提到过,整个告警功能分为规则和通知两部分,前文详细说明了规则,今天要学习的就是剩下的通知部分

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

-
之所以选飞书作通知手段,首先是简单,其次是相对熟悉,您也可以按照自己的喜好去选择通知途径
-
本篇要做的是把alertmanager部署好,配置好,至于后面的web服务就留在下一篇吧,咱们适当控制篇幅
-
接下来把本篇的操作步骤按顺序列一下,然后开工,如下所示,一共八步,助您完成完全个性化的告警配置
- 接下来就逐步完成吧
1. 编写部署alertmanager的ansible脚本
- 关于用ansible部署软件的操作,咱们在《prometheus实战之一:用ansible部署》有详细的说明,因此关于ansible的基本设置就不在本篇赘述了,直接给出部署alertmanager的ansible脚本即可
- ansible的改动一共有以下三步
- 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: 部署alertmanagerhosts: alertmanagergather_facts: Truevars_files:- vars.yml tasks:- name: 停止残留的alertmanagerignore_errors: yessystemd:name: alertmanagerstate: stoppedbecome: yes- name: 清理可能的alertmanager service残留文件file:path: /etc/systemd/system/alertmanager.servicestate: absentbecome: yes- name: 清理可能的alertmanager残留文件夹file:path: '{{alertmanager_base_path}}'state: absent- name: 新建部署文件夹file:path: '{{alertmanager_base_path}}'state: directorymode: '0755'- name: 下载并解压文件alertmanager-{{alertmanager_version}}.linux-amd64.tar.gzansible.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 ServerDocumentation=https://prometheus.io/docs/introduction/overview/After=network-online.target[Service]User=prometheusRestart=on-failureExecStart={{alertmanager_deploy_path}}/alertmanager --config.file={{alertmanager_deploy_path}}/alertmanager.yml --storage.path={{alertmanager_base_path}}/data[Install]WantedBy=multi-user.targetEOFbecome: yes- name: 刷新服务配置systemd:daemon_reload: truebecome: yes- name: 将alertmanager服务设置为自启动systemd:name: alertmanagerenabled: truemasked: nobecome: yes - name: 启动alertmanagersystemd:state: startedname: alertmanagerbecome: 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的告警通知配置共有以下五部分
- 全局配置(global):一些通用的全局参数
- 模板(templates):告警通知用的模板
- 告警路由(route):指定特定的告警去特定的通知目标,例如A告警走webhook,B告警走邮件通知
- 通知接受者(receivers):定义通知目标,例如webhook、邮件等
- 抑制规则(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:8888/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:8888/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://192.168.50.134:8888/webhook发起了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://192.168.50.134:8888/webhook\": dial tcp http://192.168.50.134:8888/webhook: 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://192.168.50.134:8888/webhook\": dial tcp http://192.168.50.134:8888/webhook: 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://192.168.50.134:8888/webhook\": dial tcp http://192.168.50.134:8888/webhook: connect: connection refused"
- 至此,alertmanager的部署和配置就完成了,也初步验证过基本功能都是正常的,下一篇咱们一起动手开发web服务,达到最终目标:应用服务器CPU偏高的时候,飞书APP收到告警
你不孤单,欣宸原创一路相伴
- Java系列
- Spring系列
- Docker系列
- kubernetes系列
- 数据库+中间件系列
- DevOps系列
相关文章:
prometheus实战之四:alertmanager的部署和配置
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是《prometheus实战》系列的第四篇,在《prometheus实战之三:告警规则》中曾经提到过,整个告警功能分为规则和…...
【Python】glob 包的介绍和使用
glob 是 Python 标准库中的一个模块,它提供了一种查找符合特定模式的路径名的方法,类似于命令行中的 glob 命令。glob 模块用于读取指定路径下的所有符合特定规律的文件名,非常适合用于读取文件夹中的文件列表和操作符合特定规律文件列表。 …...
剑指offer(C++)-JZ48:最长不含重复字符的子字符串(算法-动态规划)
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 数据范围…...
两阶段最小二乘法
两阶段最小二乘法 文章目录 两阶段最小二乘法[toc]1、ivreg包介绍2 、R语言实现 1、ivreg包介绍 R语言计量包ivreg用以解决线性回归模型的内生性问题。 描述:工具变量估计的线性模型通过两阶段最小二乘(2SLS) 回归或通过稳健回归M估计(2SM)或MM估计(2SMM)。主要的…...
ArcMap创建格网统计图
目录 前言 一、人口数据获取 来源一:中科院地理所公开数据集 来源二:WorldPop数据集 二、人口格网统计步骤 1.创建渔网 2.人口数据处理 2.1 栅格转点 2.2 空间插值——处理人口缺失数据 2.3 空间连接——渔网人口统计 总结 前言 在科研中&am…...
[VAE] Auto-Encoding Variational Bayes
直接看paper看得云里雾里,李沐视频一语道破天机(建议从30min左右开始看GAN到Diffusion的串讲)。VAE的核心思路就是下面: 做生成,其实就是从随机向量(z)到目标图像(x)的过…...
《程序员面试金典(第6版)》面试题 16.19. 水域大小(深度优先搜索,类似棋盘类问题,八皇后的简化版本,C++)
题目描述 你有一个用于表示一片土地的整数矩阵land,该矩阵中每个点的值代表对应地点的海拔高度。若值为0则表示水域。由垂直、水平或对角连接的水域为池塘。池塘的大小是指相连接的水域的个数。编写一个方法来计算矩阵中所有池塘的大小,返回值需要从小到…...
Spring 注解之@RestController与@Controller的区别
目录 1:介绍 2:区别 3:总体来说 4:社区地址 1:介绍 RestController 和 Controller 是 Spring MVC 中常用的两个注解,它们都可以用于定义一个控制器类。 2:区别 返回值类型不同:…...
Java中的泛型是什么?如何使用泛型
Java中的泛型是指在定义类、接口和方法时使用类型参数,以使得这些类、接口和方法可以操作多种类型的数据,从而提高代码的重用性和安全性。Java的泛型机制是从JDK5开始引入的,它使得Java程序员能够编写更加通用和类型安全的代码。 什么是泛型…...
【飞行棋】多人游戏-微信小程序开发流程详解
可曾记得小时候玩过的飞行棋游戏,是90后的都有玩过吧,现在重温一下,这是一个可以二到四个人参与的游戏,通过投骰子走棋,一开始靠运气,后面还靠自己选择,谁抢占先机才能赢,还可以和小…...
力扣 146. LRU 缓存
一、题目描述 请你设计并实现一个满足LRU(最近最少使用)缓存约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以正整数作为容量 capacity 初始化LRU缓存。int get(int key) 如果关键字 key 存在于缓存中,则返回关键…...
关于Oracle SCN的最大阈值
SCN每秒增长的速度跟Oracle的版本有关,在Oracle 11.2.0.2之前是每秒允许最大增长16384,在Oracle 11.2.0.2之后是默认每秒允许增长32768,这个值跟新增的隐含参数_max_reasonable_scn_rate有关,如下所示: NAME …...
Linux多路转接之poll
文章目录 一、poll的认识二、编写poll方案服务器三、poll方案多路转接的总结 一、poll的认识 多路转接技术是在不断更新进步的,一开始多路转接采用的是select方案,但是select方案存在的缺点比较多,所以在此基础上改进,产生了poll…...
Webpack打包流程
轻松了解Webpack 打包流程 Webpack是一个现代的JavaScript应用程序的静态模块打包器。它将多个JavaScript文件打包成一个或多个静态资源文件,以便在浏览器中加载。Webpack将应用程序视为一个依赖项图,其中包括应用程序的所有模块,然后通过该…...
React事件委托
React 事件委托(Event Delegation)是一种优化事件处理的技术,它通过将事件监听器添加到父级元素(而不是子元素)来实现。当事件触发时,事件会向上冒泡到父元素,然后在父元素上调用事件处理函数。…...
Notion——构建个人知识库
前言 使用Notion快三年了,它All in one的理念在使用以后确实深有体会,一直想找一个契机将这个软件分享给大家,这款笔记软件在网上已经有很多的教程了,所以在这里我主要想分享框架方面的内容给大家,特别对于学生党、研究…...
ModuleNotFoundError: No module named ‘Multiscaledeformableattention‘
在实现DINO Detection方法时,我们可能会遇到以上问题。因为在DeformableAttention模块,为了加速,需要自己去编译这个模块。 如果你的环境变量中能够找到cuda路径,使用正确的torch版本和cuda版本的话,这个问题很容易解…...
【数据结构】链表(C语言实现)
创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 🔥c语言系列专栏:c语言之路重点知识整合 &#x…...
【2023程序员必看】大数据行业分析
1、政策重点扶持,市场前景广阔 2014年,大数据首次写入政府工作报告,大数据逐渐成为各级政府关注的热点。 2015年9月,国务院发布《促进大数据发展的行动纲要》,大数据正式上升至国家战略层面,十九大报告提…...
通达信SCTR强势股选股公式,根据六个技术指标打分
SCTR指标(StockCharts Technical Rank)的思路来源于著名技术分析师约翰墨菲,该指标根据长、中、短三个周期的六个关键技术指标对股票进行打分,根据得分对一组股票进行排名,从而可以识别出强势股。 与其他技术指标一样,SCTR的设计…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
