Prometheus + alermanager + webhook-dingtalk 告警

 添加钉钉机器人

1. 部署 alermanager

1.1 下载软件包

wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz

网址 :Releases · prometheus/alertmanager (github.com)

1.2 解压软件包

mkdir -pv /app/tools/
tar xf alertmanager-0.26.0.linux-amd64.tar.gz  -C /app/tools/

1.3 创建符号链接

cd /app/tools/ && ln -svf alertmanager-0.26.0.linux-amd64 alertmanager

1.4 修改 alermanager 的配置文件

vim alertmanager.yml

global:
  resolve_timeout: 5m
  
route:
  group_by: ['alertname']
  group_wait: 5s
  group_interval: 5s
  repeat_interval: 2m
  receiver: 'web.hook'
receivers:
  - name: 'web.hook'
    webhook_configs:
      # prometheus-webhook-dingtalk的地址
      #这里只需要修改IP地址及端口号即可
      #也可以第一次启动webhook-dingtalk的时候胡hi有提示这个地址(需要直接使用webhook命令执行)
      - url: 'http://localhost:8060/dingtalk/webhook1/send'
        send_resolved: true
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

1.5 启动alermanager

vim /usr/lib/systemd/system/alertmanager.service

[Unit]
Description=The prometheus webhook dingtalk
After=network.target

[Service]
WorkingDirectory=/app/tools/alertmanager-0.26.0.linux-amd64/
ExecStart=/app/tools/alertmanager-0.26.0.linux-amd64/alertmanager \
--config.file=/app/tools/alertmanager-0.26.0.linux-amd64/alertmanager.yml 


[Install]
WantedBy=multi-user.target


systemctl daemon-reload
systemctl enable --now alertmanager.service

1.6 登录WebUI

http://192.168.99.181:9093/

有页面则部署完成

2. 部署 prometheus-webhook-dingtalk

2.1 下载 prometheus-webhook-dingtalk 软件包

wget https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v2.1.0/prometheus-webhook-dingtalk-2.1.0.linux-amd64.tar.gz

2.2 解压软件包

tar xf prometheus-webhook-dingtalk-2.1.0.linux-amd64.tar.gz -C /app/tools

2.3 编写配置文件

cat config.example.yml 

## Targets, previously was known as "profiles"
#指定告警模板配置文件
templates:
      # - /root/prometheus-webhook-dingtalk-2.1.0.linux-amd64/templates/default.tmpl
      - /app/tools/prometheus-webhook-dingtalk-2.1.0.linux-amd64/templates/test.tmpl
targets:
  webhook1:
    #机器人的地址
    url: https://oapi.dingtalk.com/robot/send?access_token=1859e97456bdcb436f87f8e27147cfe07557901bdc4691c1836e30640f33c60b
    # secret for signature
    #机器人的认证标签
    secret: SEC13a35ec382cbce1b46f4275ce640aedce28610b8026ceecd50ef59eb74002f8d
    message:
      ## 指定了消息的标题,使用模板 `ding.link.title` 来生成。
      title: '{{ template "ding.link.title" . }}'
      # 指定了消息的正文内容,使用模板 `ding.link.content` 来生成。
      text: '{{ template "ding.link.content" . }}'

2.4 编写告警模板

cat templates/test.tmpl 

{{ define "__subject" }}
[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}]
{{ end }}

{{ define "__alert_list" }}{{ range . }}
---

{{ if .Labels.owner }}@{{ .Labels.owner }}{{ end }}
---

   **告警名称**: {{ .Labels.alertname }}

   **告警主机**: {{ .Labels.instance }} 

   **告警级别**: {{ .Labels.severity }} 
   #description 这里引用的是ruels文件中的字段
   **告警描述**: {{ index .Annotations "description" }} 
   #时间不要动
   **告警时间**: {{ dateInZone "2006.01.02 15:04:05" (.StartsAt) "Asia/Shanghai" }}
   #可填写查看详情的网址
   **查看详情**: http://192.168.99.181:9093
{{ end }}{{ end }}

{{ define "__resolved_list" }}{{ range . }}
---

   **告警名称**: {{ .Labels.alertname }}

   **告警主机**: {{ .Labels.instance }}

   **告警级别**: {{ .Labels.severity }}

   **告警描述**: {{ index .Annotations "description" }}

   **告警时间**: {{ dateInZone "2006.01.02 15:04:05" (.StartsAt) "Asia/Shanghai" }}

   **恢复时间**: {{ dateInZone "2006.01.02 15:04:05" (.EndsAt) "Asia/Shanghai" }}
{{ end }}{{ end }}

{{ define "default.title" }}
{{ template "__subject" . }}
{{ end }}

{{ define "default.content" }}
{{ if gt (len .Alerts.Firing) 0 }}
**<font color="#FF0000">======侦测到{{ .Alerts.Firing | len  }}个告警======</font>**

{{ template "__alert_list" .Alerts.Firing }}
---

{{ end }}

{{ if gt (len .Alerts.Resolved) 0 }}
**<font color="green">======恢复{{ .Alerts.Resolved | len  }}个故障======</font>**
{{ template "__resolved_list" .Alerts.Resolved }}
{{ end }}
{{ end }}

{{ define "ding.link.title" }}{{ template "default.title" . }}{{ end }}
{{ define "ding.link.content" }}{{ template "default.content" . }}{{ end }}
{{ template "default.title" . }}
{{ template "default.content" . }}

2.5 启动webhook-dingtalk

cat /usr/lib/systemd/system/webhook-dingtalk.service

[Unit]
Description=The prometheus webhook dingtalk
After=network.target

[Service]
WorkingDirectory=/app/tools/prometheus-webhook-dingtalk-2.1.0.linux-amd64/
ExecStart=/app/tools/prometheus-webhook-dingtalk-2.1.0.linux-amd64/prometheus-webhook-dingtalk \
--config.file=config.example.yml \
--web.enable-lifecycle \
--web.enable-ui

[Install]
WantedBy=multi-user.target


systemctl daemon-reload
systemctl enabled --now webhook-dingtalk.service

3. Promtheus

3.1 配置rules规则文件

[root@prometheus-server31 /app/tools/prometheus]# cat rules/test.yaml 
# 相关的规则设置定义在一个group下。在每一个group中我们可以定义多个告警规则(rule)
groups:
  # 组名,报警规则组名称
- name: 内存告警
  rules:
  - alert: 内存使用率超过80%告警
    # expr:基于PromQL表达式告警触发条件,用于计算是否有时间序列满足该条件。
    #expr: floor(100 * (1 - (node_memory_MemFree_bytes + node_memory_Cached_bytes + node_memory_Buffers_bytes) / node_memory_MemTotal_bytes)) > 80
    expr: floor(100 * (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes))) > 80
    # for:评估等待时间,可选参数。用于表示只有当触发条件持续一段时间后才发送告警。在等待期间新产生告警的状态为pending。
    # for语句会使 Prometheus 服务等待指定的时间, 然后执行查询表达式。(for 表示告警持续的时长,若持续时长小于该时间就不发给alertmanager了,大于该时间再发。for的值不要小于prometheus中的scrape_interval,例如scrape_interval为30s,for为15s,如果触发告警规则,则再经过for时长后也一定会告警,这是因为最新的度量指标还没有拉取,在15s时仍会用原来值进行计算。另外,要注意的是只有在第一次触发告警时才会等待(for)时长。)
    for: 1m
    # labels:自定义标签,允许用户指定要附加到告警上的一组附加标签。
    labels:
      # severity: 指定告警级别,有三种等级,分别为:警告、严重、紧急,严重等级依次递增。
      severity: '<font color="#0000FF">警告</font>'
    # annotations: 附加信息,比如用于描述告警详细信息的文字等,annotations的内容在告警产生时会一同作为参数发送到Alertmanager。
    annotations:
      servername: "{{ $labels.server_name }}"
      server_ip: "{{ $labels.server_ip }}"
      value: "{{ $value }}"
      description: "**{{ $labels.server_name }}**内存使用率持续1分钟超过**80%**, 请及时处理! 当前值**{{ $value }}%**。"

  - alert: 内存使用率超过90%告警
    expr: floor(100 * (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes))) > 90
    for: 1m
    labels:
      severity: '<font color="#FFA500">严重</font>'
    annotations:
      servername: "{{ $labels.server_name }}"
      server_ip: "{{ $labels.server_ip }}"
      value: "{{ $value }}"
      description: "**{{ $labels.server_name }}**内存使用率持续1分钟超过**90%**, 请马上处理! 当前值**{{ $value }}%**。"

- name: CPU告警
  rules:
  - alert: CPU使用率超过80%告警
    expr: floor(100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[1m])) * 100)) > 80
    for: 1m
    labels:
      severity: '<font color="#0000FF">警告</font>'
    annotations:
      servername: "{{ $labels.server_name }}"
      server_ip: "{{ $labels.server_ip }}"
      value: "{{ $value }}"
      description: "**{{ $labels.server_name }}**CPU使用率持续1分钟超过**80%**, 请及时处理! 当前值**{{ $value }}%**。"

  - alert: CPU使用率超过90%告警
    expr: floor(100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[1m])) * 100)) > 90
    for: 1m
    labels:
      severity: '<font color="#FFA500">严重</font>'
    annotations:
      servername: "{{ $labels.server_name }}"
      server_ip: "{{ $labels.server_ip }}"
      value: "{{ $value }}"
      description: "**{{ $labels.server_name }}**CPU使用率持续1分钟超过**90%**, 请马上处理! 当前值**{{ $value }}%**。"

- name: 磁盘告警
  rules:
  - alert: 磁盘 **/** 目录使用率超过90%告警
    expr: floor(100 * ((node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_avail_bytes{mountpoint="/"}) / node_filesystem_size_bytes{mountpoint="/"})) >90
    for: 30m
    labels:
      severity: '<font color="#0000FF">警告</font>'
    annotations:
      servername: "{{ $labels.server_name }}"
      server_ip: "{{ $labels.server_ip }}"
      value: "{{ $value }}"
      description: "**{{ $labels.server_name }}**磁盘 **/** 目录使用率已经超过阈值**90%**, 请及时处理! 当前值**{{ $value }}%**。"

  - alert: 磁盘 **/home** 目录使用率超过90%告警
    expr: floor(100 * ((node_filesystem_size_bytes{mountpoint="/home"} - node_filesystem_avail_bytes{mountpoint="/home"}) / node_filesystem_size_bytes{mountpoint="/home"})) >90
    for: 30m
    labels:
      severity: '<font color="#0000FF">警告</font>'
    annotations:
      servername: "{{ $labels.server_name }}"
      server_ip: "{{ $labels.server_ip }}"
      value: "{{ $value }}"
      description: "**{{ $labels.server_name }}**磁盘 **/home** 目录使用率已经超过阈值**90%**, 请及时处理! 当前值**{{ $value }}%**。"

  - alert: 磁盘 **/data** 目录使用率超过90%告警
    expr: floor(100 * ((node_filesystem_size_bytes{mountpoint="/data"} - node_filesystem_avail_bytes{mountpoint="/data"}) / node_filesystem_size_bytes{mountpoint="/data"})) >90
    for: 30m
    labels:
      severity: '<font color="#0000FF">警告</font>'
    annotations:
      servername: "{{ $labels.server_name }}"
      server_ip: "{{ $labels.server_ip }}"
      value: "{{ $value }}"
      description: "**{{ $labels.server_name }}**磁盘 **/data** 目录使用率已经超过阈值**90%**, 请及时处理! 当前值**{{ $value }}%**。"

  - alert: 磁盘 **/data1** 目录使用率超过90%告警
    expr: floor(100 * ((node_filesystem_size_bytes{mountpoint="/data1"} - node_filesystem_avail_bytes{mountpoint="/data1"}) / node_filesystem_size_bytes{mountpoint="/data1"})) >90
    for: 30m
    labels:
      severity: '<font color="#0000FF">警告</font>'
    annotations:
      servername: "{{ $labels.server_name }}"
      server_ip: "{{ $labels.server_ip }}"
      value: "{{ $value }}"
      description: "**{{ $labels.server_name }}**磁盘 **/data1** 目录使用率已经超过阈值**90%**, 请及时处理! 当前值**{{ $value }}%**。"

  - alert: 磁盘 **/postgres** 目录使用率超过90%告警
    expr: floor(100 * ((node_filesystem_size_bytes{mountpoint="/postgres"} - node_filesystem_avail_bytes{mountpoint="/postgres"}) / node_filesystem_size_bytes{mountpoint="/postgres"})) >90
    for: 30m
    labels:
      severity: '<font color="#0000FF">警告</font>'
    annotations:
      servername: "{{ $labels.server_name }}"
      server_ip: "{{ $labels.server_ip }}"
      value: "{{ $value }}"
      description: "**{{ $labels.server_name }}**磁盘 **/postgres** 目录使用率已经超过阈值**90%**, 请及时处理! 当前值**{{ $value }}%**。"

- name: 离线告警
  rules:
  - alert: 服务器离线告警
    expr: up{instance =~ ".*:(9100|9200)"} == 0
    for: 30s
    labels:
      severity: '<font color="#FF0000">紧急</font>'
    annotations:
      servername: "{{ $labels.server_name }}"
      server_ip: "{{ $labels.server_ip }}"
      value: "{{ $value }}"
      description: "**{{ $labels.server_name }}**离线了,可能出现宕机情况, 请立即检查处理! "

3.2 配置 prometheus.yml 文件

vim /app/tools/prometheus/prometheus.yml
....
#指定alermanager
alerting:
  alertmanagers:
    - static_configs:
        - targets:
            - 192.168.99.181:9093
.....
rule_files:
  #指定 rules 配置文件
  - "/app/tools/prometheus/rules/test.yaml"
.....

3.3 重启prometheus

systemctl reload prometheus.server

4. 测试

根据自己定义的规则关闭一个监控的节点,查看钉钉是否有收到消息

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

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

相关文章

博物馆地图导航系统:高精度地图引擎与AR/VR融合,实现博物馆数字化转型

在人民日益追求精神文化的时代下&#xff0c;博物馆作为传承与展示人类文明的璀璨殿堂&#xff0c;其重要性不言而喻。然而&#xff0c;随着博物馆规模的不断扩大和藏品种类的日益丰富&#xff0c;游客在享受知识盛宴的同时&#xff0c;也面临着“迷路”与“错过”的困扰。博物…

Python-PLAXIS自动化建模技术与典型岩土工程

有限单元法在岩土工程问题中应用非常广泛&#xff0c;很多软件都采用有限单元解法。在使用各大软件进行数值模拟建模的过程中&#xff0c;您是否发现GUI界面中重复性的点击输入工作太繁琐&#xff1f;从而拖慢了设计或方案必选进程&#xff1f; 搭建自己的Plaxis模型&#xff…

flutter 列表下拉框加搜索

1.使用控件搜索加下拉框dropdown_search: ^0.4.9和获取中文拼音lpinyin: ^1.1.1 2.加入中文查询和首字查询 在当中找到相应的packages&#xff0c;再在SelectDialog.dart当中加入引入拼音搜索 import package:lpinyin/lpinyin.dart; 更改匹配方法manageItemsByFilter使其可…

云动态摘要 2024-07-12

给您带来云厂商的最新动态,最新产品资讯和最新优惠更新。 最新优惠与活动 数据库上云优选 阿里云 2024-07-04 RDS、PolarDB、Redis、MongoDB 全系产品新用户低至首年6折起! [免费体验]智能助手ChatBI上线 腾讯云 2024-07-02 基于混元大模型打造,可通过对话方式生成可视化…

Python | Leetcode Python题解之第232题用栈实现队列

题目&#xff1a; 题解&#xff1a; class MyQueue:def __init__(self):self.A, self.B [], []def push(self, x: int) -> None:self.A.append(x)def pop(self) -> int:peek self.peek()self.B.pop()return peekdef peek(self) -> int:if self.B: return self.B[-1…

基于SpringBoot+Vue的数码论坛系统(带1w+文档)

基于SpringBootVue的数码论坛系统(带1w文档) 基于SpringBootVue的数码论坛系统(带1w文档) 数码论坛系统能够通过互联网得到广泛的、全面的宣传&#xff0c;让尽可能多的用户了解和熟知数码论坛系统的便捷高效&#xff0c;不仅为用户提供了服务&#xff0c;而且也推广了自己&…

使用mybatis的statementHander拦截器监控表和字段并发送钉钉消息

新建mybatis的statementHander拦截器拦截器 类 面试题&#xff1a; 2.实现 解析Sql时引入JSqlParser JSqlParser 是一个 SQL 语句解析器。 它将 SQL转换为可遍历的 Java 类层次结构。 <dependency><groupId>com.github.jsqlparser</groupId><artifac…

C语言基础and数据结构

C语言程序和程序设计概述 程序:可以连续执行的一条条指令的集合 开发过程:C源程序(.c文件) --> 目标程序(.obj二进制文件,目标文件) --> 可执行文件(.exe文件) -->结果 在任何机器上可以运行C源程序生成的 .exe 文件 没有安装C语言集成开发环境,不能编译C语言程…

STM32的TIM1之PWM互补输出_死区时间和刹车配置

STM32的TIM1之PWM互补输出_死区时间和刹车配置 1、定时器1的PWM输出通道 STM32高级定时器TIM1在用作PWM互补输出时&#xff0c;共有4个输出通道&#xff0c;其中有3个是互补输出通道&#xff0c;如下&#xff1a; 通道1&#xff1a;TIM1_CH1对应PA8引脚,TIM1_CH1N对应PB13引…

IDEA 中的调试方式(以 java 为例)

文章目录 IDEA 中的调试方式(以 java 为例)1. 基本介绍2. 断点调试的快捷键2.1 设置断点并启动调试2.3 快捷键 IDEA 中的调试方式(以 java 为例) 在开发中查找错误的时候&#xff0c;我们可以用断点调试&#xff0c;一步一步的看源码执行的过程&#xff0c;从而发现错误所在。 …

JAVA基础知识思维导图分享

这里为大家分享我自己之前做的一份JAVA基础知识思维导图&#xff1a; 由于太大了上传不了&#xff0c;需要的友友们&#xff0c;可以私信我哦&#xff08;Q&#xff1a;3193045624发&#xff09;&#xff01;

初学SpringMVC之 JSON 篇

JSON&#xff08;JavaScript Object Notation&#xff0c;JS 对象标记&#xff09;是一种轻量级的数据交换格式 采用完全独立于编程语言的文本格式来存储和表示数据 JSON 键值对是用来保存 JavaScript 对象的一种方式 比如&#xff1a;{"name": "张三"}…

Datawhale 2024 年 AI 夏令营第二期——基于术语词典干预的机器翻译挑战赛

#AI夏令营 #Datawhale #夏令营 1.赛事简介 目前神经机器翻译技术已经取得了很大的突破&#xff0c;但在特定领域或行业中&#xff0c;由于机器翻译难以保证术语的一致性&#xff0c;导致翻译效果还不够理想。对于术语名词、人名地名等机器翻译不准确的结果&#xff0c;可以通…

StarRocks分布式元数据源码解析

1. 支持元数据表 https://github.com/StarRocks/starrocks/pull/44276/files 核心类&#xff1a;LogicalIcebergMetadataTable&#xff0c;Iceberg元数据表&#xff0c;将元数据的各个字段做成表的列&#xff0c;后期可以通过sql操作从元数据获取字段&#xff0c;这个表的组成…

ts踩坑!在类型“xx”上找不到具有类型“string”的参数的索引签名;或者:元素隐式具有“any”类型,因为类型为“string”的表达式不能用于索引类型

报错信息如下1&#xff1a; 在类型 “{ themeName: string; remark: string; platformName: string; platformLogo: string; footerText: string; recordNo: string; recordUrl: string; helpEnter: string; themeColor: string; topBar: string; … 9 more …; themeId: ID; …

PCL从理解到应用【04】Octree 原理分析 | 案例分析 | 代码实现

前言 Octree 作为一种高效的空间分割数据结构&#xff0c;具有重要的应用价值。 本文将深入分析 Octree 的原理&#xff0c;通过多个实际案例帮助读者全面理解其功能和应用&#xff0c;包括最近邻搜索、半径搜索、盒子搜索以及点云压缩&#xff08;体素化&#xff09;。 特性…

车载视频监控管理方案:无人驾驶出租车安全出行的保障

近日&#xff0c;无人驾驶出租车“萝卜快跑”在武汉开放载人测试成为热门话题。随着科技的飞速发展&#xff0c;无人驾驶技术已逐渐从概念走向现实&#xff0c;特别是在出租车行业中&#xff0c;无人驾驶出租车的推出将为公众提供更为安全、便捷、高效的出行服务。 视频监控技…

Vue3 markRaw的使用

markRaw 作用:将一个对象标记为不可以被转化为代理对象。返回该对象本身。 应用场景: 1.有些值不应被设置成响应式时,例如复杂的第三方类库等 2.当渲染具有不可变数据源的大列表时,跳过响应式转换可以提高性能 3.在动态渲染组件的时候我们就可以使用 markRaw 包裹。markRaw 的…

软件系统培训方案(word原件)

1. 培训概述 2. 培训目的 3. 培训对象及要求 3.1. 培训对象 3.2. 培训人员基本要求 4. 培训方式 5. 培训内容 6. 培训讲师 7. 培训教材 8. 培训质量保证 8.1. 用户培训确认报告 8.2. 培训疑问解 软件资料清单列表部分文档&#xff1a; 工作安排任务书&#xff0c;…

JS登录页源码 —— 可一键复制抱走

前期回顾 https://blog.csdn.net/m0_57904695/article/details/139838176?spm1001.2014.3001.5501https://blog.csdn.net/m0_57904695/article/details/139838176?spm1001.2014.3001.5501 登录页预览效果 <!DOCTYPE html> <html lang"en"><head…