细说夜莺监控系统告警自愈机制

虽说监控系统最侧重的功能是指标采集、存储、分析、告警,为了能够快速恢复故障,告警自愈机制也是需要重点投入建设的,所有可以固化为脚本的应急预案都可以使用告警自愈机制来快速驱动。夜莺开源项目从 v7 版本开始内置了告警自愈模块,本文将详细介绍告警自愈的原理和实现。

夜莺项目介绍

夜莺监控是一款开源云原生观测分析工具,采用 All-in-One 的设计理念,集数据采集、可视化、监控告警、数据分析于一体,与云原生生态紧密集成,提供开箱即用的企业级监控分析和告警能力。夜莺于 2020 年 3 月 20 日,在 github 上发布 v1 版本,已累计迭代 100 多个版本。

夜莺最初由滴滴开发和开源,并于 2022 年 5 月 11 日,捐赠予中国计算机学会开源发展委员会(CCF ODC),为 CCF ODC 成立后接受捐赠的第一个开源项目。夜莺的核心研发团队,也是 Open-Falcon 项目原核心研发人员,从 2014 年(Open-Falcon 是 2014 年开源)算起来,也有 10 年了,只为把监控这个事情做好。

夜莺项目的 Github 地址是:GitHub - ccfos/nightingale: An all-in-one observability solution which aims to combine the advantages of Prometheus and Grafana. It manages alert rules and visualizes metrics, logs, traces in a beautiful web UI.,国内用这个开源项目的公司也比较多了,我就不过多介绍了。直接开始正题。

告警自愈原理

夜莺告警引擎在产生告警事件之后,除了可以通过多种通知媒介通知相关人员,也可以自动化的执行某个动作。主要是通过两种方式来驱动这些自动化动作:

  • Webhook:通过 Webhook 的方式把告警事件推送到外部系统,外部系统可以根据告警事件的内容来执行相应的动作
  • 脚本:直接到告警的机器上(或者指定的中控机)执行脚本,脚本可以是 shell 脚本、python 脚本、bat 脚本等等

本文重点讲解的是第二种,通过脚本的方式。

要能够去告警的机器上执行脚本,机器上需要部署一个 agent,这个 agent 周期性和服务端发起心跳,拉取要执行的脚本,并把脚本的执行结果上报给服务端。在夜莺的生态里,这个 agent 就是 categraf。

告警事件产生之后,告警引擎发现这个事件需要执行自愈动作,就会在服务端创建一个脚本任务,等着 agent 来拉取执行。所以本质上,是告警引擎 + 命令执行通道共同协作达成了告警自愈的效果。

部署配置

首先需要夜莺 v7.0.0-beta.2.0.1 以上的版本,之前的版本也有告警自愈的能力,但之前的版本需要额外安装部署 ibex 模块,从这个版本开始就不需要单独的 ibex 模块了。

修改夜莺服务端的配置

在夜莺的配置文件:etc/config.toml 中搜索 Ibex,把 Enable 设置为 true:

[Ibex]
Enable = true
RPCListen = "0.0.0.0:20090"

重启夜莺,让配置生效。此时通过 ss 或 netstat 命令可以看到夜莺服务端监听了 20090 端口。这是 categraf 拉取脚本任务、上报脚本结果的端口。

ss -tln|grep 20090

注意

如果夜莺使用的数据库连接账号是具备建表权限的,进程启动之后会自动创建 ibex 相关的表,就是告警自愈相关的表,如果夜莺使用的数据库连接账号没有建表权限,就需要手工建表了,建表 sql 在这里:https://github.com/flashcatcloud/ibex/blob/master/sql/ibex.sql 注意,从第 7 行开始复制,把这些表建到夜莺的库(默认是 n9e_v6)里,不要建到 ibex 库里了。老版本的告警自愈依赖单独的 ibex 模块,ibex 模块用的库是 ibex 库,现在夜莺新版本内置了 ibex 的能力,数据库也就合并到一起了。

如果你是从老版本的夜莺升级上来的,需要把之前的 ibex 库中的表迁移到 n9e_v6 库中,迁移命令如下:

mysqldump -u username -p ibex > ibex.sql
mysql -u root -p n9e_v6 < ibex.sql

修改 categraf 的配置

categraf 的配置文件是 conf/config.toml。在 conf/config.toml 中搜索 ibex,把 enable 设置为 true,并正确配置夜莺服务端的地址和端口:

[ibex]
enable = true
interval = "1000ms"
servers = ["127.0.0.1:20090"]
meta_dir = "./meta"

如果你的机器量比较大,比如超过 10000 台,建议把 interval 调整的稍微大一些,比如 2500ms,要不然容易给服务端造成太大压力。servers 配置是个数组,配置所有的夜莺服务端的地址,如果你有多个夜莺服务端实例,categraf 启动的时候会自动探测,连到那个网络延迟最小的实例上,如果夜莺服务端实例挂了,categraf 会自动切换到另外一个实例上,保证高可用。

改完配置之后重启 categraf,让配置生效。

注意

如果使用了夜莺的边缘部署模式,这里的 servers 就配置为 n9e-edge 的地址即可。当然,边缘模式的话 n9e-edge 的配置文件中要开启 Ibex。

测试命令通道

告警自愈依赖命令通道,我们先来测试一下命令通道是否正常。其实即便不用告警自愈,命令通道也是很有用的,可以用来批量远程执行命令,比如批量重启服务、批量清理日志、批量执行命令查看输出、批量安装个软件等等。

20240507183735

去机器列表里,选中要执行命令的机器,点击标识栏上面的复制按钮,复制相关的机器标识,然后去【告警自愈】-【任务】页面,创建临时任务。把刚才复制的机器列表填写到 Host 框中,然后在 Script 中填写要执行的脚本内容即可。默认 Script 中已经有一个 ss -tln 的命令了,可以不用修改直接执行。

20240507184345

执行完成之后,结果如下,可以点击 stdouts 查看所有机器的脚本执行的 stdout 结果:

20240507184526

创建任务的时候,字段内容比较多,各个字段都有说明,我这里就不赘述了。核心就是去一批机器上跑个脚本。因为要跑脚本,需要控制权限,如果是 Admin 账号,所有机器都可以执行命令,如果是普通账号,只能去有权限的机器上执行脚本,哪些机器有权限?就看我管理了哪些业务组,我管理的这些业务组下的机器我就有权限。

创建自愈脚本

命令通道测通了。接下来就是和监控告警引擎联动,让告警事件产生的时候自动创建一个脚本任务,让 agent 去执行这个脚本任务。创建自愈脚本的菜单入口:【告警自愈】-【脚本】,比如我创建了如下脚本:

20240507185302

自愈脚本创建的时候,Host 字段留空即可。因为告警的时候才知道具体是哪个机器触发告警,Host 字段会被告警引擎动态填充。自动创建脚本任务。

当然,上面这些脚本都是我随便写的,仅做演示用。假设我现在要创建一个告警规则:“机器磁盘快满了”,如果触发告警,就自动执行 ID 为 19 的脚本,此时要怎么做呢?很简单,在告警规则里配置一个回调地址 ${ibex}/19 即可:

20240507185742

这样,当告警事件产生的时候,告警引擎会自动创建一个脚本任务,让 agent 去执行这个 ID 为 19 的脚本。这个脚本任务的执行结果会上报给服务端,你可以在【告警自愈】-【任务】页面查看这个任务的执行结果。

通常一个告警规则对应一个自愈脚本,如果想把脚本做的很通用,想用一个脚本干很多事,应对不同的场景。那就需要在脚本里拿到告警事件的详情,然后根据告警事件中的信息来做不同的处理。这个夜莺也是支持的,夜莺会把告警事件的关键信息放到脚本的 stdin 中传给脚本,你就可以在脚本里通过 stdin 拿到告警事件的内容了,比如我们准备一个这样的告警自愈脚本:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import sys
import jsonpayload = json.load(sys.stdin)
print(payload)

这是一个很简单的 Python 脚本,从 stdin 中读取内容,json decode(夜莺把告警事件关键信息组装成一个 json map 塞入 stdin,所以脚本这里要 json decode 一下) 一下放到 payload 变量里,然后用 print 把 payload 打印出来。打印的结果如下:

{'__name__': 'system_load_norm_1', 'alert_severity': '2', 'alert_trigger_value': '0.195', 'env': 'ENV', 'ident': 'dev-n9e-01', 'rulename': '测试告警自愈参数-勿删23'}

嗯,nice~ 这样我们就可以在脚本里根据告警事件的内容来做不同的处理了。

注意:告警事件中需要有 ident 标签(表示是哪个机器告警了),ident 对应的机器需要在机器列表里,且告警规则的最后修改人对这个机器有操作权限,夜莺才会去对应的机器执行脚本。

参考资料

  • 夜莺监控官方文档: 告警自愈 - 快猫星云
  • categraf 项目地址: https://github.com/flashcatcloud/categraf
  • ibex 项目地址:GitHub - flashcatcloud/ibex

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

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

相关文章

39-2 Web应用防火墙 - WAF数据库层绕过

如果你本地没有安装mysql就先安装一下:4-2 MySQL 的下载与安装_mysql5.7.9.1下载-CSDN博客 一、数据库层绕过简介 绕过数据库层通常用于规避Web应用防火墙(WAF)的SQL注入防护规则。攻击者需要利用数据库特性,寻找规避常规安全策略的方法。这里涉及到不同数据库的特性、SQ…

在类设计器中使用 C++ 代码其中类和匿名类

类设计器支持以下 C 代码元素 &#xff1a; 类&#xff08;与托管类形状类似&#xff0c;只不过它可以具有多重继承关系&#xff09; 匿名类&#xff08;显示类视图为匿名类型生成的名称&#xff09; 类设计器中的 C 类 类设计器支持 C 类&#xff0c;直观显示本机 C 类的方式…

如何在Java中实现单例设计模式?

在 Java 中实现单例设计模式主要有几种方式&#xff0c;每种方式都有其适用场景及优缺点。单例模式的目的是确保一个类只有一个实例&#xff0c;并提供一个全局访问点。以下是一些常见的实现方法&#xff1a; 懒汉式&#xff08;Lazy Initialization&#xff09; 该模式只有在…

blender导出gltf模型混乱

最近用户给了几个blender文件&#xff0c;在blender打开是这样的&#xff1a; 我导出成gltf候&#xff0c;在本地打开时&#xff0c;底部发生了改变&#xff1a; 可以看出来&#xff0c;底部由原来的类型box变为了两个平面&#xff0c;后来我查了下blender里的属性设置&#xf…

Hive的库操作

1.创建数据库 CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name --DATABASE 和 SCHEMA 的使用是一样的,CREATE DATABASE 是(HIVE-675)增加的.(尽量使用database).[COMMENT database_comment] --提示性的信息[LOCATION hdfs_pat…

邦芒贴士:在职场中做人再老实要记住这4个心眼

以前我们常常被教育说&#xff0c;做人一定要真诚实在&#xff0c;只有你真心对待别人&#xff0c;才能够赢得别人的真心&#xff0c;才能够交到朋友。但是混职场和交朋友并不一样。 ​在职场中&#xff0c;你是来工作赚钱的&#xff0c;交朋友是次要&#xff0c;你得在工作中生…

[0509] StackOverflowExchange 的关系和时间线 | Godaddy DNS API 加入用户限制

目录 StackExchange & StackOverflow 的关系和时间线Godaddy DNS API 加入用户限制 StackExchange & StackOverflow 的关系和时间线 为方便描述&#xff0c;将使用如下简称&#xff1a; Stack Overflow → SOStack Exchange → SE 关系: 先有 SO&#xff0c;基于 S…

java中的oop(二)、方法、对象数组、重载、参数.

public class Person {/*成员变量存储在堆中*/String name;int age;public void sleep() {String hour "18小时"; //局部变量&#xff1b;存储在栈中&#xff1b;System.out.println("he is sleepping!");}public void setAge(int age) { //局部变量--形…

Python | Leetcode Python题解之第75题颜色分类

题目&#xff1a; 题解&#xff1a; class Solution:def sortColors(self, nums: List[int]) -> None:n len(nums)p0, p2 0, n - 1i 0while i < p2:while i < p2 and nums[i] 2:nums[i], nums[p2] nums[p2], nums[i]p2 - 1if nums[i] 0:nums[i], nums[p0] num…

跟小米学爆品

#小米爆品# 【课程背景】 小米手机世界第一、小米充电宝世界第一、平衡车世界第一、小米空气净化器世界第一。 小米做出很多世界第一&#xff1b;小米为什么做什么产品都能快速成功&#xff1f;小米打造爆品成功的秘诀是 什么&#xff1f; 长期给小米生态链企业和小米孵化器&a…

指针与const

指针与const 定义的对象中加上const 关键字&#xff0c; 表达一经初始化就不可修改的特性const 对象必须初始化 指针与constconst char* pc;指向常量的指针pc 初始化可以指向常量字符串&#xff0c; 内容不可以修改&#xff0c;但是指针指向可以修改char* const cp;指向char …

ESD静电问题 | 案例

【转自微信公众号&#xff1a;EMC容冠电磁】

相亲系统功能介绍

相亲系统是一种旨在帮助单身人士寻找合适伴侣的平台&#xff0c;其主要功能通常包括以下几个方面&#xff1a; 实名认证&#xff1a;为了确保双方的权益保障&#xff0c;用户必须进行实名认证后才能使用该系统。这有助于增加系统的安全性和可信度。偏好选择&#xff1a;用户可…

【Python】io_backend参数简介

在许多编程框架和库中&#xff0c;尤其是涉及到数据处理和深度学习的应用程序中&#xff0c;io_backend 参数常用于配置输入/输出&#xff08;I/O&#xff09;操作的后端类型和其他相关设置。这个参数通常通过字典&#xff08;dict&#xff09;的形式提供&#xff0c;使得可以灵…

网络安全之ACL

ACL&#xff1a;访问控制列表——控制列表&#xff08;策略列表&#xff09;&#xff0c;是一个控制工具。 功能&#xff1a;&#xff01;、定义感兴趣路由&#xff08;控制层面&#xff09;。2、定义感兴趣流量&#xff08;数据层面&#xff09;。 例如&#xff1a; 假设在该…

数字孪生涉及到的前沿技术:虚拟现实 人工智能 区块链 边缘计算。

数字孪生是各类技术的综合应用&#xff0c;除了咱们常见的传感器、数据采集、清洗、传输、建模、可视化技术外&#xff0c;还有还有一些前沿技术&#xff0c;会让数字孪生更加强大和智能&#xff0c;本文介绍几个。 虚拟现实&#xff08;Virtual Reality&#xff0c;VR&#x…

京东运营大基本功:店铺八大数据分析 | 店铺所有商品API采集接口

数据分析是京东运营的基本功&#xff0c;想要做好京东运营&#xff0c;那么你就一定要掌握数据分析的技能&#xff0c;数据分析我们需要采集大量数据&#xff0c;这时候我们就要京东电商数据采集API接口&#xff0c;今天就重点来给大家讲讲关于数据分析的道与术。 01 一、分析…

抖音小店怎么找达人带货的?分享几个成功率超高的沟通话术!

哈喽~我是电商月月 做抖音小店&#xff0c;特别是无货源的商家想要更多的流量&#xff0c;必定会尝试直播卖货&#xff0c;不会自己直播卖货&#xff0c;就会开通精选联盟&#xff0c;在里面找达人合作 那精选联盟到底是怎样找达人带货的呢&#xff1f; 有的达人打招呼了根本…

五、Redis五种常用数据结构-SET

Redis的Set结构存储的数据和Java中的HashSet类似&#xff0c;都是无序且不重复的。其底层的数据结构有两种&#xff0c;一是当value为整数时&#xff0c;且数据量不大时采用intset来存储。其他情况使用dict字典存储。集合中最多存储232-1(40多亿)个数据。 1、常用命令 sadd k…

探索深度学习的奥秘:从入门到进阶

一、引言 在当今这个信息爆炸的时代&#xff0c;人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;已经不再是遥不可及的科幻概念&#xff0c;而是逐渐成为我们生活的一部分。其中&#xff0c;深度学习&#xff08;Deep Learning&#xff09;作为机器学…