告别低效繁琐的Prometheus告警管理,Nightingale助你快速响应故障!

news2024/11/26 0:27:56

Prometheus的告警规则、记录规则都是采用配置文件管理,适合奉行Infrastructure as Code的公司或团队内部使用。但如果要把监控能力开放给全公司,就要支持协同操作的 UI,让各个团队互不干扰的同时共享成果。

开源方案:

  • Grafana

    擅长可视化,监控绘图领域的事实标准

  • 夜莺(Nightingale)

    侧重告警管理,可通过夜莺搭建公司级的监控系统,把监控告警能力赋予公司所有团队。

1 夜莺简介

最初滴滴开源,之后捐给中国计算机学会开源发展委员会(CCF ODC),整合云原生开源生态的众多能力,为用户提供开箱即用、一体化全方位的云原生监控解决方案。

  • 夜莺GitHub
  • 文档

1.1 夜莺架构

Agents

监控数据采集器,夜莺可对接多种 Agent,如 Categraf、Telegraf、Grafana-Agent、Datadog-Agent。这些 Agent 都是 PUSH 模型,周期性采集监控数据,推给 Server 的 HTTP 接口。

Server

接收到数据后,通过 Remote Write 协议把数据转发给时序库,这里时序库使用Prometheus,Prometheus 要想接收 Remote Write 协议的数据,需在启动参数开启 --enable-feature=remote-write-receiver。也可使用M3DB、VictoriaMetrics、Thanos等作为时序库。

Server相当于Pushgateway,也是告警引擎,周期性从 MySQL 中同步告警规则,做规则判断生成告警事件并发送,对标Prometheus的告警引擎和Alertmanager模块。Server 还会往 Redis 发送心跳信息,不过后面的版本有计划下掉 Redis,直接使用 MySQL 处理心跳。

Webapi 模块

提供 HTTP 接口,与前端 JavaScript 交互:

  • 响应管理请求,比如告警规则、屏蔽规则、监控大盘的增删改查
  • 响应时序数据查询,作为一个 Proxy 把请求转发给后面的时序库,等时序库返回结果之后再转发给前端

若有些监控数据使用 Exporter 采集,就需 PULL 模型的采集支持。通常有3种做法:

  • 直接使用 Prometheus 本身,配置 Scrape 规则
  • 单独部署一个 agent mode 模式的 Prometheus 作为抓取器,和时序库的职能做进程级别的拆分
  • 使用其他支持 PULL 模式的抓取器,如 Categraf、Grafana-Agent

2 部署夜莺

最简单方式 Docker compose:

git clone https://github.com/ccfos/nightingale.git
cd docker
docker-compose up -d

浏览器访问 nwebapi 提供的 18000 端口就能看到登录页面,默认用户是root,密码 root.2020。

对Kubernetes和Helm熟悉,可采用 Helm 的方式部署。最常用还是 二进制的方式部署。

服务端部署完成之后,可采集一些监控数据看看真实效果,推荐 安装 Categraf。也可使用其他熟悉的采集器。

3 告警管理

Prometheus告警管理在prometheus.yml配置告警规则,在alertmanager.yml中配置发送规则,都是需要修改配置文件的,上百人使用的话不好协同管理。而夜莺提供UI配置能力(也有API),并在一些方面增强,如更丰富的告警规则配置、历史事件存档、活跃事件聚合查看、对接告警自愈等。

3.1 规则管理

一个公司可能会有几十上百团队配置成千上万条告警规则,显然不能用一个扁平化的表格来罗列管理,夜莺引入了一个 业务组 的概念,每一条规则都要归属于某一个业务组,只有这个业务组的人可以管理组内的规则。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-31KuFYnD-1682925334603)(null)]

当然,业务组下面不仅有告警规则,还有监控大盘、监控对象、屏蔽规则、订阅规则、告警自愈脚本等等。业务组是夜莺里最重要的一个管理概念。

3.2 规则配置

核心还是 PromQL和持续时长。增强配置,如规则生效时间段、是否仅在本业务组生效、是否启用恢复通知、留观时长、最大发送次数等。

夜莺告警规则是把PromQL和发送方式整合到一条规则,这和Alertmanager不同,Prometheus告警规则只有PromQL、持续时长、附加标签、注解这些基本信息,至于发给谁、怎么发都在 Alertmanager 配置。

Prometheus+Alertmanager,可看做订阅式,告警规则中不指定接收者,在 Alertmanager 的配置中统一设置过滤条件和对应的接收者。非常灵活,但灵活东西需定规范,否则易乱,如大家统一按照业务线标签做订阅:

  • 就要求时序数据都要打上业务线的标签
  • 或把业务线的标签放到告警规则的附加标签

Alertmanager适合场景

所有告警都统一由某团队负责时,Prometheus+Alertmanager算最佳实践。

Borgmon集群和Borg集群一一对应,Borgmon要处理对应Borg集群上的所有应用的告警,不知道在 Borgmon 中是怎么处理告警规则的?在 Borgmon 中,告警规则是通过配置文件定义的。Borgmon 的配置文件通常包括:

  1. 告警规则:定义监控指标的阈值和告警策略,例如当 CPU 使用率超过 80% 时触发告警,发送邮件通知运维人员。

  2. 数据源:定义监控数据的来源,如 Prometheus、Graphite。

  3. 数据转换:定义监控数据的转换方式,如将监控数据进行聚合、过滤、计算。

  4. 告警通知:定义告警通知的方式和接收人,如发送邮件、短信、微信。

在 Borgmon 中,每个 Borg 集群都对应一个 Borgmon 集群,Borgmon 集群负责处理该 Borg 集群上所有应用的告警。当监控指标的值超过阈值时,Borgmon 会根据告警策略触发告警,并将告警信息发送给指定的接收人。

Borgmon的配置文件是动态加载,可通过 API 接口或命令行工具修改配置文件,实现灵活的告警规则管理。

夜莺处理方式像Datadog,每个团队配置自己的告警规则,发给自己这个团队,即自己管自己的,不需要把告警规则和接收规则拆到两个地方分别配置,我个人觉得更加直观一些,而且夜莺也支持订阅方式。

告警屏蔽

对一些告警事件做静默处理。对于那些预期内的告警,处理人不希望被打扰就会短时间做一下屏蔽,通常是根据标签对事件做过滤。

夜莺目前只能按时间段屏蔽,比如屏蔽凌晨0点到早上7点的所有告警。

告警订阅

像Alertmanager,可根据告警规则或标签做事件订阅,类似邮件抄送。

比如我是业务方,我的业务跑在Kubernetes,Kubernetes平台发生重大故障,我希望及时知道,可订阅Kubernetes所有严重告警。虽然我希望得知Kubernetes的严重告警,但我毕竟不是Kubernetes的运维人员,所以我在订阅这类事件时,不希望用电话这种方式接收告警,只希望用邮件之类轻量级方式,所以订阅规则中通常可以重新定义发送媒介、重新定义事件级别。

历史告警存档

夜莺依赖MySQL做数据持久化,所以告警事件可直接存入数据库,所有的历史告警都可以追踪查询。虽然这个功能很简单,但很多企业都需要,自证清白时很重要。

所有历史告警存档也可用于后续分析,从这些数据易知哪些业务线的告警发送得最多,消耗电话、短信费用最多,哪些业务线的告警解决得最快,哪些人是接收告警的劳模。从侧面反映出这个团队的告警策略需要优化,或者业务稳定性需优化。

活跃告警聚合

所谓活跃告警就是未恢复的告警,活跃告警功能很重要,应该作为日常巡检必须要关注的页面。

为减少查看的心理负担,便于给告警事件分类,夜莺支持聚合卡片视图,而且聚合规则是可以自定义的,比如当前有300条未恢复的告警,我们可以根据告警规则聚合查看,也可以根据地域、业务线、服务、机器等维度聚合查看。

告警自愈

当告警事件触发之后,能自动触发一个恢复动作来止损,这就是所谓的告警自愈。一般监控系统都会支持Webhook,告警触发之后自动回调某个接口,我们就可以在这个接口里写一些自动化逻辑,但是这种方式还是要写个HTTP Server的,成本略高。夜莺除了支持Webhook之外,还可以在告警时自动执行某个脚本,用户就可以直接在脚本里写逻辑了。

告警自愈依赖 ibex 模块,这是一个批量执行脚本的小工具,你可以安装测试一下。不过有些公司会觉得有安全隐患,不敢开启这个功能,我觉得纯内网环境问题不大,如果开放到公网的话确实需要小心。

自愈脚本要能够在机器上运行,需要有较强的权限管控,这个权限也是依赖业务组的机制,只有这个业务组的管理人员,才能去这个组内的机器上跑脚本。夜莺里有个对象管理,主要就是管机器的,设计对象管理功能很重要的一个原因就是为了支持告警自愈。

失联告警

夜莺主用push模式接收监控数据,所以感知监控对象失联是问题。PromQL 有 absent 函数,但用起来麻烦,如果要为100台机器配置失联告警,就要配置100条告警规则。

夜莺在服务端加了个逻辑,接收到监控数据后,自动从数据中解析出 ident 标签当机器标识,然后为这机器生成 target_up 指标。这机器有监控数据上报,则 target_up 的值设置为 1;如果长时间收不到机器的指标上报,则 target_up 的值设置为 0。于是,只需配置一条告警规则就覆盖所有监控对象。

4 Prometheus Yaml迁移

老 Yaml 文件管理规则可不动,甚至如果 Prometheus 只是给自己团队使用的话也不太需要引入夜莺,只有那些想要 把监控能力开放给全公司用的场景 才需要引入夜莺,而且新规则可以用夜莺管理,老的规则不迁移或者慢慢迁移都是可以的。 技术是为解决现实问题,没有非黑即白。

5 总结

增强Prometheus告警管理能力,因为Prometheus的Yaml文件管理方式不方便公司级协同管理。Grafana和夜莺都可以解决这个问题:

  • Grafana更擅长看图
  • 夜莺更擅长告警管理

夜莺告警管理能力:

  • 规则管理,包括告警规则、屏蔽规则、订阅规则
  • 事件管理,包括历史事件、活跃事件
  • 告警自愈

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

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

相关文章

No.053<软考>《(高项)备考大全》【冲刺7】《软考之 119个工具 (5)》

《软考之 119个工具 (5)》 84.文档审查:85.信息收集技术:86.核对表分析:87.假设分析:88.图解技术:89.SWOT 分析:90.风险概率和影响评估:91.概率和影响矩阵(包含在风险管理计划中):92.风险数据质量评估:93.风险分类(包含在风险管理计划中):94.风险紧迫性评…

快速多关键字统计

实例需求:在每个章节中统计关键字(“√”, “”, “〇”, “空缺”)的个数,B列中的章节编号作为章节划分的标识,例如1.1.1 ~ 1.1.5为第1.1章节,对应工作表的12 ~ 16行,其中黄色列为需要统计的数…

【软考数据库】第五章 计算机网络

目录 5.1 网络功能和分类 5.2 OSI七层模型 5.3 TCP/IP协议 5.4 传输介质 5.5 通信方式和交换方式 5.6 IP地址 5.7 IPv6 5.8 网络规划和设计 5.9 其他考点补充 5.10 网络安全技术 5.11 网络安全协议 前言: 笔记来自《文老师软考数据库》教材精讲&#xff…

从张鑫旭的demo中,我学到了图像拉伸的原理

文章收录: 个人网址:http://linglan01.cn/Github仓库:https://github.com/CatsAndMice/blog/issues 产品经理又有新需求啦,其中有一个图片上传后用户拉伸图像宽高的功能,评估后因要卡上线时间来不及砍掉了。保不准下一…

Java 基础进阶篇(四)—— 抽象类与模板方法设计模式

文章目录 一、抽象类、抽象方法概述二、抽象类的特征三、模板方法设计模式3.1使用场景3.2 实现步骤3.3 写作文案例 补充:final 和 abstract 是什么关系? 一、抽象类、抽象方法概述 在 Java 中 abstract 是抽象的意思,可以修饰类、成员方法。 abstract …

【LeetCode股票买卖系列:122. 买卖股票的最佳时机 II | 贪心 | 暴力递归=>记忆化搜索=>动态规划】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

基于 GS232 搭建的 SoC_up 说明

1.1 GS232 开源版本简介 GS232 开源版本不包含 DSP、浮点部件等。 TLB 大小为 32 项。 指令和数据 Cache 为 4 路组相连,每路大小为 4KB,Cache 行大小为 32 bytes。 对外接口为 32 位 AXI 接口。 1.2 1,soc_up结构 SoC_up 如上图所示。开源 GS232 对外有一个 AXI 接口,连…

「Codeforces」771-div2 E. Colorful Operations

E. Colorful Operations https://codeforces.com/contest/1638/problem/E 题目描述 给你一个数组,默认初始元素为 0 ,颜色为 1,有三种操作: Color l r c:将 [l, r] 区间内的颜色修改为 cAdd c x:将所有颜…

Human Pose as Compositional Tokens 阅读笔记

人体姿态作为合成 token —— CVPR2023 论文链接 代码链接 摘要: 人体姿态常由身体关节的坐标向量或其热图embedding表示。虽然数据易于处理,但由于身体关节间缺乏依赖建模,即使是不现实的姿态也被接受。本文提出了一种结构化表示&#xff1…

el-form-renderer 使用指南

目录 前言 起步 使用 update-form && getFormValue 表单项动态显示或隐藏(hidden) 表单数据联动(on) 输入/输出格式化(inputFormat/outputFormat) set-options el-form-renderer 实践案例 案例一 案例二 自定义组件接入指南 前言 el-form-renderer是基于e…

Starting Windows PowerShell (启动 Windows PowerShell)

Starting Windows PowerShell (启动 Windows PowerShell) Windows PowerShell is a scripting engine .DLL that’s embedded into multiple hosts. The most common hosts you’ll start are the interactive command-line powershell.exe and the Interactive Scripting Envi…

【Java笔试强训 26】

🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一、选择题 二、编程题 🔥跳台阶扩…

Redis`数据结构`与`对象`概述

文章目录 Redis数据结构与对象概述一、数据结构1、简单动态字符串(SDS)SDS结构体定义SDS结构示意图使用SDS的五个优点 2、双端链表(list)链表结构体定义list结构示意图 3、字典(dict)字典结构体定义dict结构…

想要成为 NLP 领域的大牛?从 ChatGPT 的 5 大自然语言模型开始了解吧(LM、Transformer、GPT、RLHF、LLM)——小白也能看得懂

目录 前言ChatGPT基础科普——知其一点所以然1. LM2. Transformer3. GPT4. RLHF5. LLM 参考资料其它资料下载 前言 如果想在自然语言处理(Natural Language Processing,NLP)领域内脱颖而出,那么你一定不能错过 ChatGPT 的 5 大自然…

软件设计师笔记

软件设计师笔记 计算机组成与体系结构 数据的表示、计算机结构、Flynn分类法、CISC与RISC、流水线技术、存储系统、总线系统、可靠性、校验码 1. 数据的表示 (一)进制转换 R进制转十进制使用按权展开法: 十进制转R进制使用短除法 二进制…

Python——狂肝两万字带你学会【类与对象】

目录 01-初始对象 生活中的数据组织 程序中的数据组织​ 使用对象组织数据 总结01 02-类的成员方法 类的定义和使用 成员变量和成员方法 成员方法的定义语法 注意事项 成员方法——代码演示 总结02 03-类和对象 现实世界的事物和类 类和对象 使用类和对象描述…

Java 基础进阶篇(三)—— 权限修饰符、final 关键字与枚举

文章目录 一、权限修饰符二、final 关键字2.1 final 作用2.2 final 修饰变量举例2.3 常量 三、枚举3.1 枚举的格式3.2 枚举的特征3.3 枚举的应用 一、权限修饰符 权限修饰符 用于约束成员变量、构造器、方法等的访问范围。 权限修饰符: 有四种作用范围由小到大 (p…

vue+element 多选级联选择器自定义props

前言 我这里分享的是Cascader 级联选择器中的多选、以及如何自定义props的使用详解 1.使用Cascader 级联选择器 效果 代码 <div class"block"><span class"demonstration">默认显示所有Tag</span><el-cascader:options"op…

Vue电商项目--vuex模块开发

vuex状态管理库 vuex是什么&#xff1f; vuex是官方提供的一个插件&#xff0c;状态管理库&#xff0c;集中式管理项目中组件共有的数据。 切记&#xff0c;并不是全部的项目都需要Vuex,如果项目很小&#xff0c;完全不需要vuex,如果项目很大&#xff0c;组件很多&#xff0…

一道Python初学者常犯错误解析

1. 引言 在Python学习中&#xff0c;经常会遇到各种各样的代码错误&#xff0c;尤其对于初学者而言&#xff0c;明明觉得逻辑上是对的&#xff0c;但是代码运行起来&#xff0c;往往不是自己想要的结果。 本文就最近在某平台看到的一个常见错误进行展开&#xff0c;帮助大家更…