AlertManager 简介与使用

article/2025/10/4 12:50:59

简介


之前我们学习 Prometheus 的时候就了解到 Prometheus 包含一个报警模块,就是我们的 AlertManager,Alertmanager 主要用于接收 Prometheus 发送的告警信息,它支持丰富的告警通知渠道,而且很容易做到告警信息进行去重,降噪,分组等,是一款前卫的告警通知系统。

架构

                                                                       架构

接下来我们就来学习下 AlertManager 的具体使用方法。

通过在 Prometheus 中定义告警规则,Prometheus 会周期性的对告警规则进行计算,如果满足告警触发条件就会向 Alertmanager 发送告警信息。

在 Prometheus 中一条告警规则主要由以下几部分组成:

  • 告警名称:用户需要为告警规则命名,当然对于命名而言,需要能够直接表达出该告警的主要内容
  • 告警规则:告警规则实际上主要由 PromQL 进行定义,其实际意义是当表达式(PromQL)查询结果持续多长时间(During)后触发告警

在 Prometheus 中,还可以通过 Group(告警组)对一组相关的告警进行统一定义。Alertmanager 作为一个独立的组件,负责接收并处理来自 Prometheus Server 的告警信息。Alertmanager 可以对这些告警信息进行进一步的处理,比如当接收到大量重复告警时能够消除重复的告警信息,同时对告警信息进行分组并且路由到正确的通知方,Prometheus 内置了对邮件、Slack 多种通知方式的支持,同时还支持与 Webhook 的集成,以支持更多定制化的场景。例如,目前 Alertmanager 还不支持钉钉,用户完全可以通过 Webhook 与钉钉机器人进行集成,从而通过钉钉接收告警信息。同时 AlertManager 还提供了静默和告警抑制机制来对告警通知行为进行优化。

 

安装


从官方文档Configuration | Prometheus中我们可以看到下载AlertManager二进制文件后,可以通过下面的命令运行:

$ ./alertmanager --config.file=simple.yml- name: alertmanagerimage: prom/alertmanager:v0.14.0imagePullPolicy: IfNotPresentargs:- "--config.file=/etc/alertmanager/alertmanager.yml"

其中-config.file参数是用来指定对应的配置文件的,由于我们这里同样要运行到 Kubernetes 集群中来,所以我们使用docker镜像的方式来安装,使用的镜像是:prom/alertmanager:v0.15.3

首先,指定配置文件,同样的,我们这里使用一个 ConfigMap 资源对象:(alertmanager-conf.yaml)

apiVersion: v1
kind: ConfigMap
metadata:name: alert-confignamespace: kube-ops
data:config.yml: |-global:# 在没有报警的情况下声明为已解决的时间resolve_timeout: 5m# 配置邮件发送信息smtp_smarthost: 'smtp.163.com:25'smtp_from: 'ych_1024@163.com'smtp_auth_username: 'ych_1024@163.com'smtp_auth_password: '<邮箱密码>'smtp_hello: '163.com'smtp_require_tls: false# 所有报警信息进入后的根路由,用来设置报警的分发策略route:# 这里的标签列表是接收到报警信息后的重新分组标签,例如,接收到的报警信息里面有许多具有 cluster=A 和 alertname=LatncyHigh 这样的标签的报警信息将会批量被聚合到一个分组里面group_by: ['alertname', 'cluster']# 当一个新的报警分组被创建后,需要等待至少group_wait时间来初始化通知,这种方式可以确保您能有足够的时间为同一分组来获取多个警报,然后一起触发这个报警信息。group_wait: 30s# 当第一个报警发送后,等待'group_interval'时间来发送新的一组报警信息。group_interval: 5m# 如果一个报警信息已经发送成功了,等待'repeat_interval'时间来重新发送他们repeat_interval: 5m# 默认的receiver:如果一个报警没有被一个route匹配,则发送给默认的接收器receiver: default# 上面所有的属性都由所有子路由继承,并且可以在每个子路由上进行覆盖。routes:- receiver: emailgroup_wait: 10smatch:team: nodereceivers:- name: 'default'email_configs:- to: '517554016@qq.com'send_resolved: true- name: 'email'email_configs:- to: '517554016@qq.com'send_resolved: true

分组

分组机制可以将详细的告警信息合并成一个通知,在某些情况下,比如由于系统宕机导致大量的告警被同时触发,在这种情况下分组机制可以将这些被触发的告警合并为一个告警通知,避免一次性接受大量的告警通知,而无法对问题进行快速定位。

 

这是 AlertManager 的配置文件,我们先直接创建这个 ConfigMap 资源对象:

$ kubectl create -f alertmanager-conf.yaml
configmap "alert-config" created

然后配置 AlertManager 的容器,我们可以直接在之前的 Prometheus 的 Pod 中添加这个容器,对应的 YAML 资源声明如下:

  - name: alertmanagerimage: prom/alertmanager:v0.15.3imagePullPolicy: IfNotPresentargs:- "--config.file=/etc/alertmanager/config.yml"ports:- containerPort: 9093name: httpvolumeMounts:- mountPath: "/etc/alertmanager"name: alertcfgresources:requests:cpu: 100mmemory: 256Milimits:cpu: 100mmemory: 256Mi
volumes:
- name: alertcfgconfigMap:name: alert-config

这里我们将上面创建的 alert-config 这个 ConfigMap 资源对象以 Volume 的形式挂载到 /etc/alertmanager 目录下去,然后在启动参数中指定了配置文件--config.file=/etc/alertmanager/config.yml,然后我们可以来更新这个 Prometheus 的 Pod:

$ kubectl apply -f prome-deploy.yaml
deployment.extensions "prometheus" configured

当然我们也可以将 AlertManager 的配置文件内容直接放入到之前的 Prometheus 的 ConfigMap 的资源对象中,也可以用一个单独的 Pod 来运行 AlertManager 这个容器,完整的资源清单文件可以参考这里:https://github.com/cnych/kubeapp/tree/master/prometheus

AlertManager 的容器启动起来后,我们还需要在 Prometheus 中配置下 AlertManager 的地址,让 Prometheus 能够访问到 AlertManager,在 Prometheus 的 ConfigMap 资源清单中添加如下配置:

alerting:alertmanagers:- static_configs:- targets: ["localhost:9093"]

 更新这个资源对象后,稍等一小会儿,执行 reload 操作:

$ kubectl delete -f prome-cm.yaml
configmap "prometheus-config" deleted
$ kubectl create -f prome-cm.yaml
configmap "prometheus-config" created
# 隔一会儿后
$ kubectl get svc -n kube-ops
NAME         TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                          AGE
prometheus   NodePort   10.102.74.90   <none>        9090:30358/TCP                   3d
$ curl -X POST "http://10.102.74.90:9090/-/reload"

更新完成后,我们查看 Pod 发现有错误,查看下 alertmanager 容器的日志,发现有如下错误信息:

$ kubectl get pods -n kube-ops
NAME                          READY     STATUS             RESTARTS   AGE
prometheus-56d64bf6f7-rpz9j   1/2       CrashLoopBackOff   491        1d
$ kubectl logs -f prometheus-56d64bf6f7-rpz9j alertmanager -n kube-ops
level=info ts=2018-11-28T10:33:51.830071513Z caller=main.go:174 msg="Starting Alertmanager" version="(version=0.15.3, branch=HEAD, revision=d4a7697cc90f8bce62efe7c44b63b542578ec0a1)"
level=info ts=2018-11-28T10:33:51.830362309Z caller=main.go:175 build_context="(go=go1.11.2, user=root@4ecc17c53d26, date=20181109-15:40:48)"
level=error ts=2018-11-28T10:33:51.830464639Z caller=main.go:179 msg="Unable to create data directory" err="mkdir data/: read-only file system"

这个是因为新版本dockerfile中的默认WORKDIR发生了变化,变成了/etc/alertmanager目录,默认情况下存储路径--storage.path是相对目录data/,因此,alertmanager 会在我们上面挂载的 ConfigMap 中去创建这个目录,所以会报错,我们可以通过覆盖--storage.path参数来解决这个问题,在容器启动参数中添加该参数:

- name: alertmanagerimage: prom/alertmanager:v0.15.3imagePullPolicy: IfNotPresentargs:- "--config.file=/etc/alertmanager/config.yml"- "--storage.path=/alertmanager/data"

重新更新 Pod,可以发现 Prometheus 已经是 Running 状态了:

$ kubectl apply -f prome-deploy.yaml
deployment.extensions "prometheus" configured
$ kubectl get pods -n kube-ops
NAME                          READY     STATUS      RESTARTS   AGE
prometheus-646f457455-gr8x5   2/2       Running     0          3m
$ kubectl logs -f prometheus-646f457455-gr8x5 alertmanager -n kube-ops
level=info ts=2018-11-28T11:03:16.054633463Z caller=main.go:174 msg="Starting Alertmanager" version="(version=0.15.3, branch=HEAD, revision=d4a7697cc90f8bce62efe7c44b63b542578ec0a1)"
level=info ts=2018-11-28T11:03:16.054931931Z caller=main.go:175 build_context="(go=go1.11.2, user=root@4ecc17c53d26, date=20181109-15:40:48)"
level=info ts=2018-11-28T11:03:16.351058702Z caller=cluster.go:155 component=cluster msg="setting advertise address explicitly" addr=10.244.2.217 port=9094
level=info ts=2018-11-28T11:03:16.456683857Z caller=main.go:322 msg="Loading configuration file" file=/etc/alertmanager/config.yml
level=info ts=2018-11-28T11:03:16.548558156Z caller=cluster.go:570 component=cluster msg="Waiting for gossip to settle..." interval=2s
level=info ts=2018-11-28T11:03:16.556768564Z caller=main.go:398 msg=Listening address=:9093
level=info ts=2018-11-28T11:03:18.549158865Z caller=cluster.go:595 component=cluster msg="gossip not settled" polls=0 before=0 now=1 elapsed=2.000272112s
level=info ts=2018-11-28T11:03:26.558221484Z caller=cluster.go:587 component=cluster msg="gossip settled; proceeding" elapsed=10.009335611s

报警规则


现在我们只是把 AlertManager 容器运行起来了,也和 Prometheus 进行了关联,但是现在我们并不知道要做什么报警,因为没有任何地方告诉我们要报警,所以我们还需要配置一些报警规则来告诉我们对哪些数据进行报警。

警报规则允许你基于 Prometheus 表达式语言的表达式来定义报警报条件,并在触发警报时发送通知给外部的接收者。

同样在 Prometheus 的配置文件中添加如下报警规则配置:

  prometheus.yml: |rule_files:- /etc/prometheus/rules.ymlalerting:alertmanagers:- static_configs:- targets: ["localhost:9093"]
[root@master prometheus]# cat prometheus-deploy.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata:name: prometheus-servernamespace: monitorlabels:app: prometheus
spec:replicas: 1selector:matchLabels:app: prometheuscomponent: server#matchExpressions:#- {key: app, operator: In, values: [prometheus]}#- {key: component, operator: In, values: [server]}template:metadata:labels:app: prometheuscomponent: serverannotations:prometheus.io/scrape: 'false'spec:serviceAccountName: monitorcontainers:- name: prometheusimage: prom/prometheus:v2.2.1imagePullPolicy: IfNotPresentcommand:- prometheus- --config.file=/etc/prometheus/prometheus.yml- --storage.tsdb.path=/prometheus- --storage.tsdb.retention=720h- --web.enable-lifecycleports:- containerPort: 9090protocol: TCPvolumeMounts:- mountPath: /etc/prometheusname: prometheus-config- name: localtimemountPath: /etc/localtimevolumes:- name: prometheus-configconfigMap:name: prometheus-config- name: localtimehostPath:path: /usr/share/zoneinfo/Asia/Shanghai

其中rule_files就是用来指定报警规则的,这里我们同样将rules.yml文件用 ConfigMap 的形式挂载到/etc/prometheus目录下面即可:

apiVersion: v1
kind: ConfigMap
metadata:name: prometheus-confignamespace: kube-ops
data:prometheus.yml: |............rules.yml: |groups:- name: test-rulerules:- alert: NodeMemoryUsageexpr: (node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes)) / node_memory_MemTotal_bytes * 100 > 20for: 2mlabels:team: nodeannotations:summary: "{{$labels.instance}}: High Memory usage detected"description: "{{$labels.instance}}: Memory usage is above 20% (current value is: {{ $value }}"
[root@master prometheus]# kubectl exec -it prometheus-server-5775f99578-vngfh -n monitor -c prometheus sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/prometheus $ ls /etc/prometheus/
prometheus.yml  rules.yml

 上面我们定义了一个名为NodeMemoryUsage的报警规则,其中:

  • for语句会使 Prometheus 服务等待指定的时间, 然后执行查询表达式。
  • labels语句允许指定额外的标签列表,把它们附加在告警上。
  • annotations语句指定了另一组标签,它们不被当做告警实例的身份标识,它们经常用于存储一些额外的信息,用于报警信息的展示之类的。

为了方便演示,我们将的表达式判断报警临界值设置为20,重新更新 ConfigMap 资源对象,由于我们在 Prometheus 的 Pod 中已经通过 Volume 的形式将 prometheus-config 这个一个 ConfigMap 对象挂载到了/etc/prometheus目录下面,所以更新后,该目录下面也会出现rules.yml文件,所以前面配置的rule_files路径也是正常的,更新完成后,重新执行reload操作,这个时候我们去 Prometheus 的 Dashboard 中切换到alerts路径下面就可以看到有报警配置规则的数据了:

prometheus alerts

                                                        prometheus alerts

我们可以看到页面中出现了我们刚刚定义的报警规则信息,而且报警信息中还有状态显示。一个报警信息在生命周期内有下面3种状态:

  • inactive: 表示当前报警信息既不是firing状态也不是pending状态
  • pending: 表示在设置的阈值时间范围内被激活了
  • firing: 表示超过设置的阈值时间被激活了

我们这里的状态现在是firing就表示这个报警已经被激活了,我们这里的报警信息有一个team=node这样的标签,而最上面我们配置 alertmanager 的时候就有如下的路由配置信息了: 

routes:
- receiver: emailgroup_wait: 10smatch:team: node

 所以我们这里的报警信息会被email这个接收器来进行报警,我们上面配置的是邮箱,所以正常来说这个时候我们会收到一封如下的报警邮件:

prometheus email receiver

                                               prometheus email receiver


http://chatgpt.dhexx.cn/article/Hi5A3hJZ.shtml

相关文章

【云原生】Grafana Alerting 告警模块介绍与实战操作

文章目录 一、概述二、Grafana Alerting 模块介绍三、配置图表四、告警告警规则五、配置告警通道&#xff08;Contact points&#xff09;1&#xff09;Email1、配置smtp&#xff08;grafana.ini&#xff09;2、配置消息模板3、配置告警通道 2&#xff09;WebHook1、编写webhoo…

alertmanager 简介

alertmanager 简介 tags: alertmanager 文章目录 alertmanager 简介1. 前言2. 架构3. 特性3.1 group&#xff08;分组&#xff09;3.2 Inhibition&#xff08;抑制&#xff09;3.3 Silences&#xff08;静默&#xff09; 1. 前言 Prometheus的报警功能主要是利用Alertmanager…

JS中alert的三种使用方式

JS中的alert&#xff0c;作用是在浏览器中弹出一个警告框。 而使用alert&#xff0c;有三种方式&#xff0c;不同的方式&#xff0c;所呈现的效果也不相同。 第一种方式&#xff1a;直接写在script标签中 代码如下&#xff1a; <!DOCTYPE html> <html><head&…

alert弹窗

如何制作一份漂亮的alert弹出框&#xff1f; 在web项目中&#xff0c;往往会用到alert弹出框&#xff0c;但是原生的js弹出框样式丑陋无法满足你的需求&#xff0c;这时你该怎么办呢&#xff1f; 我的做法是&#xff1a;重写window.alert方法。它的好处是不依赖其他组件&…

Kibana:Alerting - 警报介绍

在我之前的很多文章中&#xff0c;我都介绍了 Alerting。你可以在 “Elastic&#xff1a;菜鸟上手指南” 中的 “通知及警报” 一节找到。在今天的文章中&#xff0c;我将使用最新的 7.13 版本来展示如何使用规则&#xff08;rules&#xff09; 来检测复制条件下的 alerts。 警…

k8s--基础--26.7--监控告警系统--Alertmanager--发送报警到qq邮箱,钉钉

k8s–基础–26.7–监控告警系统–Alertmanager–发送报警到qq邮箱&#xff0c;钉钉 1、创建alertmanager-cm.yaml文件 在master1节点操作 1.1、脚本 vi /root/k8s/monitor/alertmanager-cm.yaml内容 kind: ConfigMap apiVersion: v1 metadata:name: alertmanagernamespace:…

lazarus Textout中文字符串乱码

https://wenda.so.com/q/1560151974218812 lazarus Textout中文字符串乱码 5取nmlgb10级分类&#xff1a;编程开发被浏览146次2019.06.10 检举 我用Textout在窗口输出 你好系统却显示其它字体&#xff0c;求懂内行的帅哥美女指教一下&#xff0c;这是我的代码 TextOutA(hdcb,10…

VS2010 MFC TextOut垂直显示内容的显示、清除和修改

学习MFC&#xff0c;用到垂直显示内容&#xff0c;在网上查找了一些方法&#xff0c;做一下总结。 在View类的头文件中增加CString m_strLeft&#xff1b; 在View类中增加WM_PAINT消息的函数OnPaint&#xff08;&#xff09;&#xff0c;设置输出字体&#xff0c;设置颜色 CPai…

CDC在OnPaint函数中采用TextOut函数初始化静态文本框

创建静态文本框之后如果想要在程序段中初始话文本框中的内容可以采用CDC类中的TextOut()函数&#xff0c;但是如果在OnPaint&#xff08;&#xff09;中直接书写代码会导致待输出字符被静态文本框覆盖这是因为对话框上的文本控件是在对话框显示后才画上去的&#xff0c;所以用t…

8.向窗口输出文字 : TextOut 和 DrawText 函数

使用 DrawText() 向客户区的中间位置输出了一段文本&#xff0c;说一下文字的输出。 设备环境&#xff08;DC&#xff09; 在Windows中&#xff0c;一切能在显示器上看到的都是图形&#xff0c;不但包括点、线、矩形、圆等&#xff0c;也包括文字、字体。对用户来说文字和图片…

pdc-textout(_PDC-结论

pdc->textout( Oh, yes, PDC was the shiznit. We learned about the Pillars of Longhorn: 哦&#xff0c;是的&#xff0c;PDC真是愚蠢。 我们了解了Longhorn的Struts&#xff1a; Lornhorn - Its ALPHA, but its real. Feel free to peruse the SDK. Theres 3 years of…

封印(TextOut函数实际应用)

C中有一个函数&#xff1a;TextOut&#xff0c;这个函数有很多分枝&#xff0c;TextOutA&#xff0c;TextOutW。。。。都在windows.h头文件里面 这个函数干嘛用呢&#xff1f;就是在给定的HDC中显示文字。。 结果被我们坑人党知道了 嘿嘿嘿&#xff0c;于是我们写了个东西&am…

windows文本绘制 TextOut、DrawText、CreateFont、SetTextColor、SetBkColor、SetBkMode

文本绘制 TextOut-将文字绘制在指定坐标位置 DrawText-在矩形区域绘制字符串 int DrawText(HDC hdc, //DC句柄LPCSTR lpString, //字符串int nCount, //字符串长度LPRECT lpRect, //绘制文字的矩形框UINT uFormat //绘制的方式,重点&#xff0c;花样繁多的关键点 );绘制文字样…

MFC textout()输出字体设置

//设置字体 CFont font; font.CreateFont(33, // 字体的高度 0, // 字体的宽度 0, // nEscapement 0, // nOrientation FW_NORMAL, // nWeight 字体的粗细FALSE, // bItalic 字体是否斜体 FALSE, …

gdi 编程c语言pdf,二、Windows编程GDI—TextOut细节

TextOut是用于显示文字的最常用的GDI函数。语法是&#xff1a; TextOut (hdc, x, y, psText, iLength) ; 以下将详细地讨论这个函数。 第一个参数是设备内容句柄&#xff0c;它既可以是GetDC的传回值&#xff0c;也可以是在处理WM_PAINT消息时BeginPaint的传回值。 设备内容的属…

中年人学C语言Windows程序设计,3 窗口中文本的输出TextOut

中年人学C语言Windows程序设计&#xff0c;3 文本的输出TextOut 函数功能 TextOut 函数使用当前选择的字体、背景颜色和文本颜色&#xff0c;将一个字符串绘制于窗口的指定位置。 API 函数原型&#xff1a; 注释&#xff1a;In 说明该参数是输入的&#xff0c;opt 说明该参…

c语言textout字体大小,《WINDOWS程序设计》第四章关于TEXTOUT的小问题

《WINDOWS程序设计》第四章关于TEXTOUT的小问题 文章原文是这样说的&#xff1a; 您会发现常常需要显示格式化的数字跟简单的字符串。我在第二章讲到过&#xff0c;您不能使惯用的工具(可 爱的printf 函数)来完成这项工作&#xff0c;但是可以使用sprintf 和Windows 版的sprint…

c语言textout字体大小,textout函数怎么用

MFC里 用pDC->TextOut 这个函数怎么实现未知数据输我最近刚开始学计算机图形学还是个纯小白…… 不大懂 想问各路大神。比如欢迎来到CSS布局HTML,TextOut 是用来输出文本的;你说的问题,我看了半天没看懂,你可以是想先格式化字符串再输出是吧,可以如下: 用CString格式化…

Windows API——TextOut()函数学习

1.函数功能 The TextOut function writes a character string at the specified location, using the currently selected font, background color, and text color. TextOut函数使用当前选定的字体、背景颜色和文本颜色在指定位置写入字符串。 2.函数原型 BOOL TextOutA( …

35.文本输出函数TabbedTextOut、ExtTextOut、TextOut、SetBkColor

TextOut和TabbedTextOut、ExtTextOut的区别 TextOut是简单文本输出&#xff0c;不带格式的&#xff0c;可以控制文本的对齐方式 TabbedTextOut是可以控制带\t&#xff08;制表符号&#xff09;的文本 ExtTextOut是在TextOut的基础上&#xff0c;增加字符间距、背景颜色和剪裁框…