首页 > 数据库 >Prometheus+Alertmanager+Node_exporter监控系统并动态配置数据库告警规则发送动态通知策略告警

Prometheus+Alertmanager+Node_exporter监控系统并动态配置数据库告警规则发送动态通知策略告警

时间:2024-04-04 17:44:42浏览次数:23  
标签:Node varchar 通知 发送 put new 告警 动态

前提需求:告警规则和告警发送通知策略都动态配置在数据库,方便管理和随时修改、删除。Prometheus需要动态读取数据库配置的告警规则,并根据数据的通知策略(邮件、短信、钉钉、微信等)把告警发送出去

需求分析:下面主要从表设计、组件配置、代码逻辑设计几个方面介绍。

1. 表设计

1.1 告警规则表

| 字段名 | 字段类型 | 说明 |
| id | int | ID主键 |
| notice_id | int | 通知策略ID |
| name | varchar | 告警名称 |
| rule | varchar | 告警规则 |
| duration | varchar | 持续时间 |
| content | varchar | 告警内容 |
| annotation | varchar | 注释 |
| tag | varchar | 标签 |

1.2 通知策略表

| 字段名 | 字段类型 | 说明 |
| id | int | 主键ID |
| name | varchar | 策略名称 |
| start_time | varchar | 通知时间段-开始时间 |
| end_time | varchar | 通知时间段-结束时间 |
| cycle | varchar | 通知周期 |
| type | varchar | 通知方式(短信、微信、钉钉、邮件等) |
| contact | varchar | 电话或者邮箱地址 |

1.3 告警消息表

| 字段名 | 字段类型 | 说明 |
| id | int | 主键ID |
| 告警标题 | varchar | 告警标题 |
| 告警内容 | varchar | 告警内容 |
| 告警规则唯一ID | varchar | 告警规则唯一ID |
| 通知策略ID | varchar |通知策略ID |
| 创建时间 | varchar | 创建时间 |
| 更新时间 | varchar | 更新时间 |
| 发送状态 | varchar | 0未发送;1已发送 |

2. Prometheus、Alertmanager组件配置

2.1 告警规则YML文件

2.2 Alertmanager.YML文件配置

route:
group_by: ['alertname', 'cluster', 'service']
group_wait: 1s
group_interval: 30s
repeat_interval: 40s
receiver: 'web.hook'
receivers:

2.3 Prometheus.YML文件配置

global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093']
rule_files:

  • "/Users/wjf/Desktop/yml/*.yml"

scrape_configs:

  • job_name: "prometheus"
    static_configs:
    • targets: ["localhost:9090"]
  • job_name: "node"
    static_configs:
    • targets: ["localhost:9100"]

3. 代码逻辑设计

3.0 根据数据生成告警规则YML文件

SnakeYAML生成Prometheus告警规则.yml文件
// 创建告警规则对象
List<Map<String, Object>> rules = new ArrayList<>();

    Map<String, Object> alertRule = new HashMap<>();  
    alertRule.put("alert", "HighRequestLatency");  
    alertRule.put("expr", "job:request_latency_seconds:mean5m{job=\"myjob\"} > 1");  
    alertRule.put("for", "10m");  
    Map<String, String> labels = new HashMap<>();  
    labels.put("severity", "page");  
    alertRule.put("labels", labels);  
    Map<String, String> annotations = new HashMap<>();  
    annotations.put("summary", "High request latency");  
    annotations.put("description", "The job {{ $labels.job }} has a high request latency.");  
    alertRule.put("annotations", annotations);  
    rules.add(alertRule);  

    // 创建告警规则组对象  
    Map<String, Object> ruleGroup = new HashMap<>();  
    ruleGroup.put("name", "example-group");  
    ruleGroup.put("rules", rules);  

    // 创建顶级对象结构  
    Map<String, Object> root = new HashMap<>();  
    root.put("groups", List.of(ruleGroup));  

    // 配置YAML的序列化选项  
    DumperOptions options = new DumperOptions();  
    options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);  
    options.setPrettyFlow(true);  
    Yaml yaml = new Yaml(options);  

    // 将告警规则对象序列化为YAML字符串  
    String yamlString = yaml.dump(root);  

    // 将YAML字符串写入文件  
    try (FileWriter writer = new FileWriter("alert_rules.yml")) {  
        writer.write(yamlString);  
    } catch (IOException e) {  
        e.printStackTrace();  
    } 

3.1 将Alertmanager的告警消息保存到MySQL数据库

(1)Alertmanager的配置文件中设置一个Webhook,以便在触发告警时发送HTTP POST请求到你的Java服务。
image
(2)Alertmanager发送的告警消息通常是JSON格式的。你需要编写代码来解析这些JSON消息,提取告警标题、描述、标签等信息。

3.2 定时任务定时扫描告警消息表

(1)需要写一个定时任务方法,定时扫描告警消息表,查询待发送的告警消息,获取到待发送的告警消息集合

3.3 根据通知策略表的通知时间段、通知周期判断消息何时发送

(1)查询当前时间是否在通知时间段-开始、通知时间段-结束 时间区间之间;不在则跳过该条消息,在则继续下一步。
(2)根据告警策略唯一ID去 告警消息表查询最近一次发送告警的时间,然后根据当前时间 - 最近一次发送告警时间;如果小于通知周期时间则跳过该条消息;大于则进行下一步。

标签:Node,varchar,通知,发送,put,new,告警,动态
From: https://www.cnblogs.com/wjf-learning/p/18114414

相关文章

  • php实现动态网站静态化
    用PHP实现:将动态网站整个网站静态化时用到(不光可以静态化PHP的网站,其他语言的也可以)1、站点目录下创建index.php文件:<?php//站点域名Sta::srart("https://域名");classSta{publicstatic$domain='';publicstaticfunctionsrart($domain){......
  • node.js启动文件服务器 并自动查询index.html等默认文件
    方法1'usestrict';consthttp=require('http'),fs=require('fs'),url=require('url'),path=require('path');//从命令行参数获取root目录,默认是当前目录varroot=path.resolve(process.argv[2]||'.&......
  • Dubbo源码解析-Provider端监听注册中心动态配置原理
    上篇我们介绍了provider服务暴露源码,地址如下Dubbo源码解析-Provider服务暴露Export源码解析_dubboexporter-CSDN博客    本文主要针Dubbo服务端注册中心节点,实现动态配置变更原理,从dubbo源码角度进行解析。    Dubbo服务端动态配置原理比较简单,也是面试......
  • node.js启动http服务
    新建一个文件server.js,代码如下//导入http模块consthttp=require('http');//定义主机和端口号consthostname='127.0.0.1';constport=3000;//创建HTTP服务器constserver=http.createServer((req,res)=>{//获得HTTP请求的method和url:console.......
  • 常见面试题--动态规划介绍(附C++源码实现)
    关注我,持续分享逻辑思维&管理思维;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;有意找工作的同学,请参考博主的原创:《面试官心得--面试前应该如何准备》,《面试官心得--面试时如何进行自我介绍》, 《做好面试准备,迎接2024金三银四》。【图解《程序员面试常见的十大算法......
  • 前端(动态雪景背景+动态蝴蝶)
     1.CSS样式<style>html,body,a,div,span,table,tr,td,strong,ul,ol,li,h1,h2,h3,p,input{font-weight:inherit;font-size:inherit;list-style:none;border-spacing:0;border:0;border-collapse:......
  • 【HTML】简单制作一个动态3D正方体
     目录前言开始HTML部分JS部分CSS部分效果图总结前言    无需多言,本文将详细介绍一段代码,具体内容如下: 开始    首先新建文件夹,创建两个文本文档,其中HTML的文件名改为[index.html],JS的文件名改为[script.js],CSS的文件名改为[style.css],创建好后......
  • 【高校科研动态】贵州师大博士生封清为一作在J. Clean. Prod.发文:中国扶贫搬迁对生态
    目录1.文章简介 2.主要研究内容    3.文章引用1.文章简介 论文名称:QuantifyingtheextentofecologicalimpactfromChina'spovertyalleviationrelocationprogram:AcasestudyinGuizhouProvince第一作者及通讯作者:封清(博士研究生),周忠发(教授)第一作......
  • 代码随想录算法训练营三刷day44 | 动态规划之 完全背包 518. 零钱兑换 II 377. 组合总
    三刷day44完全背包基础知识问题描述举个栗子518.零钱兑换II1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组377.组合总和Ⅳ1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例来推导dp......
  • Python 使用matplotlib创建各种静态、动态、交互式和3D图表的功能
    在Python中,你可以使用各种库来创建和显示图表。其中,最常用的库之一是matplotlib,它提供了创建各种静态、动态、交互式和3D图表的功能。另一个流行的库是seaborn,它基于matplotlib,并提供了更高级别的界面,用于绘制有吸引力的统计图形。以下是一个使用matplotlib创建并显示简单折线......