promethesu告警规则配置,alertmanager通过webhook通知

文章目录

  • 前言
  • 一、promethesu告警
  • 二、告警配置
    • 编写rule文件
    • prometheus配置
    • prometheus产生告警
  • 三、告警通知
    • prometheus 配置 alertmanager
    • alertmanager 配置 webhook通知
    • 编写接口接收 webhook
  • 总结


前言

如果没有学习过prometheus的基础和监控的同学,可以先过一遍这篇文章
https://blog.csdn.net/weixin_42132143/article/details/134772543?spm=1001.2014.3001.5501


一、promethesu告警

Prometheus 收集和存储监控数据,然后根据自定义的告警规则进行数据分析,从而触发报警。配置告警规则通常包括以下几个步骤:

  1. 定义告警规则:告警规则是在 Prometheus 的配置文件中定义的,通常位于 prometheus.yml 文件中的 rules 部分。你需要创建一个告警规则文件(例如 alert.rules.yml),在这个文件中定义你的告警逻辑。

  2. 配置告警规则文件:在 prometheus.yml 中指定告警规则文件的位置,例如:

    rule_files:
      - "alert.rules.yml"
    
  3. 编写告警规则:在告警规则文件中编写具体的规则。每条规则包括以下几个部分:

  • alert: 告警名称。

  • expr: 告警表达式,当表达式的结果为 true 时触发告警。

  • for: 等待一段时间后才触发告警,用于防止短暂的数据波动导致的误报。

  • labels: 附加到告警上的标签,可以用来分类告警。

  • annotations: 告警的详细说明,如描述、摘要等。

    例如:

    groups:
    - name: example
      rules:
      - alert: HighRequestLatency
        expr: job:request_latency_seconds:mean5m{job="myjob"} > 0.5
        for: 10m
        labels:
          severity: page
        annotations:
          summary: High request latency
    
    
  1. 配置报警通知:Prometheus 本身只是产生告警不直接发送告警,是通过 Alertmanager 来管理告警通知。你需要配置 Alertmanager 的配置文件 alertmanager.yml 来定义通知的接收者和方式,如webhook、邮件、Slack、PagerDuty 等。

二、告警配置

编写rule文件

我们自定义一个告警规则,这里针对 node_exporter 的内存使用率,超过80%触发告警:

新建一个 rule 文件,

vi /etc/prometheus/rules/node_rule.yml
groups:
- name: node
  rules:
  - alert: MemoryCritical
    expr: 100 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 > 90
    for: 5m
    labels:
      severity: warning
      object: "{{ $labels.instance }}"
      content: 内存使用率高于90%
      job: "{{ $labels.job }}"
    annotations:
      summary: "Low memory available (instance {{ $labels.instance }})"
      description: "Memory usage rate above 90% for more than 5 minute"

如果是想新增一些自定义的标签,可以放在 groups.rules.labels 下面,上面的 object、content、job 就是我新增的自定义标签

prometheus配置

修改 prometheus 的配置文件

rule_files:
  - "/etc/prometheus/rules/node_rule.yml"

重启 prometheus 服务,使之生效

prometheus产生告警

已经配置好告警规则了,这时候我们给安装 node_exporter 的被监控节点加压,使之内存使用率高于 80%

然后 prometheus 就会产生告警信息,可以在 prometheus 的页面看到产生的告警信息

http://localhost:9090/alerts

这个页面会看到诸如此类的告警规则,变成红色就是产生了告警

在这里插入图片描述

三、告警通知

prometheus 配置 alertmanager

prometheus 已经产生了告警了,我们需要将告警信息推送给 alertmanager

这里就不放 alertmanager 的安装教程了

修改 prometheus 的配置文件,配置上 alertmanager

alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - 192.168.231.56:9093

重启 prometheus

这时候你就可以在 alertmanager 页面看到接收到的告警信息

prometheus 每次都会把当前所有已经产生的告警信息推送过去 alertmanager

在这里插入图片描述

alertmanager 配置 webhook通知

这时候只是 alertmanager 接收到了告警信息,而 alertmanager 它本身就是一个用于配置告警通知的工具

我们这里使用 webhook 的方式来通知

修改 alertmanager 的配置文件

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname', 'content', 'object']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 24h
  receiver: 'web.hook'
receivers:
- name: 'web.hook'
  webhook_configs:
  - url: 'http://172.16.205.66:8122/notify/alert/send'

说明:

  1. 上面的配置中 group by 指定了多个字段,作用是根据这几个字段来区分同一条告警,防止重复告警。上面也说了 prometheus 每次都会把当前所有已经产生的告警信息推送过去 alertmanager,如果 group by 不做区分,或者只用了默认的 alertname 一个字段,很有可能会导致在多个告警触发的场景下,导致之前已经告警过的信息再次告警通知。
  2. 上面的配置中的 receiver 指定是 web.hook 方式推送,然后在 receivers 配置其地址。webhook方式其实说白了,他就是 由 alertmanager 往这个指定的地址,发送一个 POST 方式的 HTTP 请求而已,所以我们的接收端只需要编写一个普通的 web 项目,里面有一个 POST 接口,接口的地址对应上就可以了。

编写接口接收 webhook

直接新建一个空白的 springboot 项目,加上一个接口,接收来自 alertmanager 的推送,然后根据自己的业务处理就行了,下面放一点核心的代码:

@PostMapping("/send")
public R send(HttpServletRequest httpServletRequest) throws IOException {
	CachedBodyHttpServletRequest request = new CachedBodyHttpServletRequest(httpServletRequest);

	// alertmanager的webhook通知会有短时间内的超时重传,这里用异步
	alertNotifyService.notify(request);

	return R.success();
}
public class CachedBodyHttpServletRequest extends HttpServletRequestWrapper {
    private final String cachedBody;

    public CachedBodyHttpServletRequest(HttpServletRequest request) throws IOException {
        super(request);
        StringBuilder body = new StringBuilder();
        try (BufferedReader bufferedReader = request.getReader()) {
            char[] charBuffer = new char[128];
            int bytesRead = -1;
            while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                body.append(charBuffer, 0, bytesRead);
            }
        }
        this.cachedBody = body.toString();
    }

    @Override
    public BufferedReader getReader() throws IOException {
        return new BufferedReader(new StringReader(this.cachedBody));
    }
}
@Async
public void notify(HttpServletRequest request) {
	// 解析prometheus请求参数
	AlertManagerBean msg = getRequestReaderMsg(request);
	System.out.println(msg);
	if(msg == null)
		return;

	// 通知发送逻辑

}

private AlertManagerBean getRequestReaderMsg(HttpServletRequest request){
	AlertManagerBean alertManagerBean = null;
	try (BufferedReader reader = request.getReader()) {
		// 获取JSON请求参数
		String jsonBody = reader.lines().reduce("", (accumulator, actual) -> accumulator + actual);
		// log.info(jsonBody);
		alertManagerBean = JSONUtil.toBean(jsonBody, AlertManagerBean.class);
	} catch (Exception e) {
		e.printStackTrace();
		log.warn("解析prometheus请求参数失败");
	}
	return alertManagerBean;
}
@Data
public class AlertManagerBean {

    private String status;
    private List<AlertManagerAlert> alerts;

}
@Data
public class AlertManagerAlert {

    private String status;
    private AlertManagerLabel labels;
    private AlertManagerAnnotation annotations;

}
@Data
public class AlertManagerLabel {

    private String alertname;
    private String instance;
    private String device;
    private String mountpoint;
    private String fstype;

    private String level;
    private String job;
    private String content;
    private String object;

}
@Data
public class AlertManagerAnnotation {

    private String summary;
    private String description;

}

总结

欢迎指出我的错误!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

利用工具JStack排查:死锁问题和CPU100%问题

无论是再面试过程中还是再实际项目开发当中我们都有可能遇到这两个问题。我之前有同学面试这两个问题都有问道过。哈哈哈。所以我绝对把他们了解下并利用博客记录。 1、工具JStack是什么&#xff1f; JStack可以显示Java应用程序中每个线程的堆栈跟踪&#xff0c;帮助开发人员…

Linux系统中的信号

文章目录 01. 学习目标02. 信号的概述信号的概念信号的特点 03. 信号的编号(了解)04. 信号四要素05. 信号的状态1) 产生2) 未决状态&#xff1a;没有被处理3) 递达状态&#xff1a;信号被处理了 06. 阻塞信号集和未决信号集6.1 阻塞信号集(信号屏蔽字)6.2 未决信号集 07. 信号产…

Win10操作系统安装Python

1 Python解释器下载 1.1 安装环境 Windows 10 专业工作站版22H2 python-3.9.6-amd64.exe 1.2 下载地址 Python官网&#xff1a;Welcome to Python.org Python镜像&#xff1a;CNPM Binaries Mirror 2 Python解释器安装 2.1 Install Python 3.9.6 (64-bit)界面 双击运行下…

【FAQ】推送前台应用的通知处理功能没生效,如何进行排查?

一、前台应用的通知处理简介 在调用推送接口时可以设置“foreground_show”字段控制前台应用的通知栏消息是否通过NC展示。“foreground_show”默认值为“true”&#xff0c;应用在前台时由NC展示通知栏消息&#xff1b;当设置为“false”时&#xff0c;应用在前台时&#xff…

骁龙8 Gen 3 vs A17 Pro

骁龙8 Gen 3 vs A17 Pro——谁会更胜一筹&#xff1f; Geekbench、AnTuTu 和 3DMark 等基准测试在智能手机领域发挥着至关重要的作用。它们为制造商和手机爱好者提供了设备性能的客观衡量标准。这些测试有助于评估难以测量的无形方面。然而&#xff0c;值得注意的是&#xff0c…

2024年江苏省职业院校技能大赛信息安全管理与评估 理论题(样卷)

2024年江苏省职业院校技能大赛信息安全管理与评估 理论题&#xff08;样卷&#xff09; 理论技能与职业素养&#xff08;100分&#xff09; 2024年江苏省职业院校技能大赛&#xff08;高职学生组&#xff09; 模块三“信息安全管理与评估”理论技能 【注意事项】 Geek极安云…

分布式锁实现方案 - Lock4j 使用

一、Lock4j 分布式锁工具 你是不是在使用分布式锁的时候&#xff0c;还在自己用 AOP 封装框架&#xff1f;那么 Lock4j 你可以考虑一下。 Lock4j 是一个分布式锁组件&#xff0c;其提供了多种不同的支持以满足不同性能和环境的需求。 立志打造一个简单但富有内涵的分布式锁组…

java web系统的常见安全问题

一、背景 java开发的系统在发布到互联网后都需要进行安全扫描&#xff0c;本文主要总结开发web系统需要注意的与系统安全相关的问题。因为在做需求开发时&#xff0c;很少产品会将系统安全的因素考虑在内&#xff0c;总觉得实现个需求很简单&#xff0c;就是一些页面&#xff0…

Linux 文件权限

背景 因为在做一个任务的时候&#xff0c;调接口要到某个路径下的文件下记录log&#xff0c;但是调接口总是报一个错误&#xff1a; SEVERE: Local file cretaion error! I/O exception! File: /xxx/xxx/xxx/xx.log发现是一个创建文件的错误&#xff0c;根据提示&#xff0c;…

PC端视频网站系统源码 系统自带采集功能 附带完整的搭建教程

近年来&#xff0c;视频内容已成为人们日常生活中不可或缺的一部分。下面罗峰给大家分享一款PC端视频网站系统源码&#xff0c;该系统具有强大的采集功能&#xff0c;可轻松实现视频内容的自动更新和丰富。并附带完整的搭建教程&#xff0c;帮助您快速构建属于自己的视频网站。…

做校园外卖平台需要多少人?高校点外卖难题能否快速解决?

众所周知&#xff0c;大学生喜欢订外卖。到饭点前提前下单&#xff0c;下课后不用挤食堂&#xff0c;这种“懒人经济”在校园商圈非常流行&#xff0c;学生对外卖和跑腿等服务的依赖越来越深&#xff0c;外卖需求也在不断增加。但毕竟是在学校&#xff0c;环境因素会影响外卖的…

Java(使用注解的方式)连接数据库增删改查-MyBatis

准备工作&#xff1a; 1.创建一个springboot项目&#xff0c;并添加四个依赖 分别是&#xff0c;MyBatis的启动依赖和安装依赖&#xff0c;SQL的依赖&#xff0c;测试依赖&#xff0c;如下&#xff1a; 2.然后创建一张至少两条数据的表 &#xff08;表可以用各种图形化工具创…

【开源】基于Vue+SpringBoot的免税店商城管理系统

文末获取源码&#xff0c;项目编号&#xff1a; S 069 。 \color{red}{文末获取源码&#xff0c;项目编号&#xff1a;S069。} 文末获取源码&#xff0c;项目编号&#xff1a;S069。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.2 研究方法 三、系统…

UE4/UE5 修改/还原场景所有Actor的材质

使用蓝图方法&#xff1a; 1.修改场景所有Actor 材质&#xff1a; Wirframe&#xff1a;一个材质类 MatList&#xff1a;获取到的所有模型的全部材质 的列表 TempAllClass&#xff1a;场景中所有获取的 Actor 的列表 功能方法如下&#xff1a; 蓝图代码可复制在&#xff1a…

基于SpringBoot+Vue会员制医疗预约服务管理信息系统(Java毕业设计)

点击咨询源码 大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的…

TensorBoard使用和问题解决

一、什么是TensorBoard? TensorBoard 是一组用于数据可视化的工具&#xff0c;它包含在流行的开源机器学习库 Tensorflow 中。TensorBoard 的主要功能包括&#xff1a; 可视化模型的网络架构跟踪模型指标&#xff0c;如损失和准确性等检查机器学习工作流程中权重、偏差和其他…

ABAP - Function ALV 02 简单开发一个Function ALV

了解Function ALV&#xff1a; https://blog.csdn.net/HeathlX/article/details/134879766?spm1001.2014.3001.5501程序开发步骤&#xff1a;① TCODE:SE38创建程序 ② 编写程序 DATA gt_spfli TYPE TABLE OF spfli.** Layout 变量定义 (固定使用 直接粘贴复制即可) DATA gs…

我的acer电脑U盘装系统前BIOS设置及装系统过程中的操作

1、开机长按F2进入BIOS设置 2、使能F12 3、调整boot顺序&#xff0c;使USB启动的优先级最高 4、按F10保存退出 5、插入U盘开机&#xff0c;boot选择界面无需操作&#xff0c;等待几秒&#xff0c;默认进入U盘系统 由于既使能了F12&#xff0c;又将U盘的优先级进调整到了最高&…

springboot集成knife4j详细教程

使用原生的swagger作为接口文档&#xff0c;功能不够强大&#xff0c;并且默认的ui比较简陋&#xff0c;不符合大众审美。所以实际开发中推荐使用knife4j对swagger进行增强。knife4j的地址&#xff1a;https://gitee.com/xiaoym/knife4j 基本使用 想要使用knife4j非常简单&…

Android获取Wifi网关

公司有这样一个应用场景&#xff1a;有一台球机设备&#xff0c;是Android系统的&#xff0c;它不像手机&#xff0c;它没有触摸屏幕&#xff0c;所以我们对球机的操作很不方便&#xff0c;于是我们搞这样一个设置&#xff1a;点击球机电源键5次分享出一个热点&#xff0c;然后…