开发者学堂课程【3天吃透 Prometheus:Alertmanager 告警】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1244/detail/18450
Alertmanager 告警
七、告警规则
告警规则跟记录规则是一样的。有着类似或相关功能的告警规则同样可以组织为一个入口,从而为规则名称提供名称空间。意思就是在同一个 group 中,你的 alert 的名字就是你的。规则名必须在唯一,但是在不同组里边可以相同。所以我们说它是名称空间的效果。当然这是我给它下的概念,这个不一定准确这样描述。为了让大家对应理解的,后面 e x, t r 才是我们真正的告警触发表达式。它一定得是个 Burger r 式,它一定要记得我们得用比作操作好,用于计算是否有时间序列可以满足该条件。而且满足了就意味着有时才是异常的。所以如果我们要正好取反条件,你可以用其他方式给他用,反正用取反的表来表述就行。而 for 表示控制。在触发光点之前,测试表达式的值必须为出的时长。刚才我们又来强调这里的逻辑,如果表达式为 true ,那就持续时长没能满足 firing 的时长,这个时候它告警状态就会pending,一旦满足了就表示fairy。表达式的值为 false 的时候将处于 inactive 状态,这就表示没异常。 labels, annotation 都已经解释过了,或者说但你要知道的是 labels 和 annotations 当中的标签值。标签的值应该是标签,它 labels 里面是我们加的标签名。标签值是支持模板化的,我们可以给他一个详细的根据。不同的主机来发送不同的告警。比如想告诉你有节点上了,或者是刚才 discord 是什么叫实例已经宕机超过一分钟。这时候我可以去引用它的标签值来给它放到 description 这样的 annotation 当中,甚至放到 label 当中都是可以的。
八、告警模板
这里有个实例告警模板,你来看这样在难道这个当中,我们 title instance 使用模板,指明到底是哪个 target 和哪个 instance done?而且 description 当中也指明了哪个instance,而且是哪个 job 的 instance 已经 down 过,已经 down 时间超过 1 分钟了。
这其实就叫模板的引用。而这就是标准的 go 模板。 promises 模板语法。遵循标准的 go 模板语法,这里我应该少写个字,叫标准的 go 模板语法,并暴露一些包含时间标签和值的变量。时间是叫事件标签,可能和时间或者时间序列标签。叫时间序列标签和值的变量。我要引用标签,使用固定格式。注意这有空格。一般而言,我们会加上空格。这是固定的前缀,叫 dollar label。点要加上 label 名。这个 label 名就是传给当前告警的时间序列的标签的名。于是它会自动的把这样一个模板替换成时间序列的标签的值。如果要引用它的值,要使用到value,叫指标样本应用。这可能稍微有点麻烦,因为这里要引用两个值。
第一,这个地方要替换成标签值。哪个标签的值是你在这指定的标签名的值。比如我们在这里使用的是要 dollar label instance。这里就意味着我们哪开主机 down 。他把对等标签 instance 值替换在此处。而这个概率是指标的样本。时间序列的时候应该有最新的一次的采样值,是时间序列的值叫dollar,记得好模板。所以刚才我们就可以使用 dollar labels,instance, dollar labels 什么 job 来进行引用了。当然我们这里引用的是内界的摩尔的标签值。我们来看一看刚才告警发生没有,我们邮件来工作地终于来了。 and theory 对应的 instance down no the exporter 哪报的什么问题?我们可以看邮件。注意这是使用邮件模板发进来的。所以你要使用一个 HTML 的格式化,也可能看得更清晰。我们这所拿到的应该是一个 HTML 的源文件,我们应该使用邮件的查看的客户端专门来查看。我们的告警信息能够支持使用模板。切换到 permission 去编辑 alert and rules 目录下的文件。
比如title,它写为叫instance。 down 都不加以后,哪个 instance 画括号括起来,这儿也写上叫 dollar label 点儿标签就叫instance。叫 dollar labels。还是 label 点instance。到了 label 点 job 点到。每一个实例方面,通常还有一个教务标签,它说明了该 target 应该属于哪个实例。我们把它抽对规则,应该就可以正常用起来。我们把 permission 重启一下。 then youll be fast forward,我看一下 alright as well 说nails,WS。稍微写成legal,应该是有 s 错误地方。我把节点 03 给它start。
我们再看到这里的告警信息的时候, instance down 这里的描述被发现这儿并没有做任何替换。各位注意,真正替换的时候是被发给 alert venture,这边真正发出以后通常会替换。当然这个地方显示依然不会替换。已经带上模板了,等会以后邮件当中模板就会完成替换。告警模板一旦发出以后。对,一旦等他发出,这底下会有显示。这地方这叫有show这里是会替换的。这是规则中本人肯定一定不会替换。这里已经显示不到 02 。
九、告警路由
下面我们说过 alert manager root 配置是支持树状路由表的,但是我们刚才在配置中只用了一个根路由,只指了个root,后面写个 receiver 就完了,没有做任何区分。
但事实上我们是完全可以使用 match 去区分一下对应的 alert 的一些属性信息。如果能匹配到,我可以给它分别发给不同的receiver。
看个示例应该就把很容易理解。这是我们倒警路的配置参数,
看这个示例,首先我们最好能先多定义几个倒数信息。
或者又加了两个,一个是节点。上说如果开空间系统,预测未来 12 小时内,预测最多在 12 小时内。如果使用如果它可用空闲比例已经小于 0 了。比如是小于1,以字节为单位,比如一字节的位写成小一兆了, 10241024 小于 10 兆了, 1 百兆了。这样写都写好。写成改成一个表达式,我就说字段很满了。接着对 permission 而言也是一样。我们定义说permission,它自己的重复规则是不是重载成功了,或者我配图页就重载成功了。其中 promise 有一个指标,就是 permit last reload successful。最近的重载是否成功了?成功就为1,不成功就为0,所以我们等于0。警告表示我们 permit 自己重载规则,失败也要告警。仍然写的是两个比较简单的归语法,很容易理解。
u 为什么要加这两个。你看我在 label 上,一个 severity 为critical,一个 severity 为boring。我可以把它以它为为标准来分别实现向不同的用户发路由。
比较我们定义的格式,其他的没变, global 也没变, template 也没变,但是 receiver 在这除了默认个 email receiver 之外。另外一个 receiver 叫 support team,叫支持团队。 route right 路由的 roots root,对 root 下面有默认的receiver,表示所有的没有最终抽检人的都给开发给默认。第一个 similar to be critical,所以为 critical 的级别的都直接发给 support team 还没办法。除此之外,还有一个基于正则表达式模式匹配的。意思是只要有 severity 标签,无论它是 warning 还是critical,都发给 email receiver。 比如 match 的时候,你可以使用的标签不一定是 severity 标签。大家记得我们这人看到的标签有这么多个,你要确保你的时间序列上只要有一个标签,公共的时间序列,其中任何一个都可以调用。除了像 smart 以外,我们这里还有什么 a t p name。我们还有 app name,所以我们说如果 app name 等于 node exporter,我就发给基础设施管理团队。如果 APP name 等于比如我们做模式匹配,如果包含了什么什么MQ,我就发给消息中心的团队。如果是什么什么 DB 结尾的,我们有一张命名,我就发给输入的团队,不知道大家说的大家记得吗?这种就是所谓的叫做告警路由机制。
为了能够实现出效果,我们这里隔音应用一下,比如把这两项 get a frustration for you result。这本来就是我们的节点集的,所以我们给它加了刚才节点集的创意。规则上编辑 alert instance alert 缩进这里要缩进一下alert,这是两个普通的alert,看清楚,只不过下面可能不会被触发。我们写实例有点突然,现在有点 phenomenal pilot they can do labels severity Annotations Discretion 。
另外一个 promises 的,我们应该给它写到我们的单独的配置文件中。但是为了能够更容易被触发怎么办?我们再来一个别的能验证出来。比如我们去 Prometheus 上,我们看一下 node 级别的有哪些指标。memory that is this, i c a m t, i t TCP 这都是做的指标监控的。我就说内存或者CPU,我们有意的给它做一点 CPU 的压测或者什么之类的,看能不能把 CPU 的利用率给提高一点。比如我们认为 CPU 的使用率如果大于2%, CPU 的使用率如果大于2%。跟 CPU 有关的有吗?这只有Volcano。seconds total to do ready 我们来看有Idol,我们认为剪 Idol 以后如果大于2,我们就认为就开始告警。我们 CQ 大于两面应该是很容易的,就有意模拟出来需要告警。我们 c q 占用率超在了多少告一个规则,告一个意思,就是我们的磁盘会在未来 12 小时之中可能会满掉,而它的配置方法会看到。我们使用 predict linear 预测 know the file system free points 文件系统。拿个文件系统挂个根上文件系统这里以每小时为单位做进行计算,或者以一个小时之内的增长类型进一个样本进行计算。做预测差不多才认为未来 12 小时可能会满掉的概率有多少。我们计算出的那个样本值,我们放大一点,计算出那个样本的值可能会小于0,那就完全满了。小于 0 可能也不大的时候,有时候我们给它小,比如小于 1 个g,那就是1024,乘以 1024 再乘1024。还有这样的状态,写 10 道得了,102C。
在 PPT 中没写完整。回到我们的 electron manager 上, seal up your local alert manager 去编辑 alert manager game YAML。在这我们要开始做告警路由的配置。这告警路由上我们要做什么,要 match 哪个规哪一种状态发给谁, match 状态发给谁。我们要进多个receiver,所以在底下我们的 tie receiver,比如 receiver 我的取名换个名就叫 support team,给我们支持团队。上面是换成我叫管理团队好了,叫 admin team。而后默认的路由都发给 support team。而对于 support team 而言,我们给了一个专门用户账号,我随便假设存在另外一个账号。比如以ontrol these are promises, for all for the first ask the host,我要键盘用户账号能看到这意思。在这做路由的路由规则要看清楚。我们要使用 group by group weight grow interval, rapidly interval,这用来指明我们如何发告警以及如何进行分组的。后面这是我们的指明我们如何进行路由。表示分完组以后,对于同一个组内的状态信息,我们要等待 30 秒。在生成一个告警,要在那等 30 秒看有没有后续。告警又如果有的话,就合并起来一块发,或者只发一个。group interval 美国多长时间做一次分组?我们为了解释这是如果告警信息被重复发送的话,就每隔多长时间重发一次。 5 分钟重发一次太快了。你应该 2 个小时,要一个小时或者 5 个小时再重发。我这儿只是为了更加简单的被重复了。删掉 root match 如果级别是severity,我们的 receiver 就是admin。其他的 match celebrity you got your warning。all receiver 定成 support tip。在每一个 user 下面可以再写入词。还可以再有子路由。还可以再roots。比如如果是critical,我还可以指定说 match happy that match。在 match 的时候我们可以指定。比如如果是 a p p 是 node exporter 怎么办?如果 a p p 是 promise 怎么办?如果 a p p name 是 grafana 怎么办?
同一个 critical 级别下,但有可能是多个不同应用程序产生的。每个应用程序的 creative 可以发出不同的receiver,底下不定义的 receiver 就行了。所以我们说子路由还可以,再有子路由,子由生存就可以了。 receiver 所以应该没问题。确认一下, do you want nature?上面又有一套错误,它会自动的把英文引号换成中文引号。如果我们在 PPT 中出现中文,所以老会出现这个问题。于是回头来,我来看一看我们有意的节点 down 试一试。节点 down 按照我刚才的说法,应该发给谁了? 如果是 warning 级别就发给support。但是好像不容易演出的效果。他只要发邮件就行,他只要能发告警的就行。所以我们把两个节点得给他 store 起来,得 stop 掉一样的触发告警。但是我们不能把模拟系统的填满来模拟,所以第二个报警触发不了,我们就触发第一个,简单测试就行,于是我们回到verse,这都看到没什么问题,告警触发,待会就可能触发了,在节点 1 上,我们去 user add 加一个用户一个叫alert,再 user add 一个, alert 之外再加一个,比如 other man。为了一些区别,把第一个改成 put them at the house,这个账号就不再使用 root 了,默认 root 当做默认的receiver。因此我们可以再加个receiver,这个就叫Bert,或者叫CTO,而后它的邮件叫root。 CTO 的邮件 support 团队的是alert,这样一起用名。所以我把默认的 receiver 换成CTO。其实默认应该是一个最不要紧的团队,应该是support。这里有一种 critic man warning,按照刚才的逻辑,因为 instance 这样我们第二个已经 end 起来了,另外一个因为它还没有看到回复的状态。等他 firing 之后, critical 应该会发给 admin 用户。admin。 today suit,使用 mail 看邮件就行了,不过现在它应该还没触发。现在告警信息已经触发,我来看一下还有没有收到邮件来看,没问题,我们的当前因为是 admin 用户,我现在就是 admin 用户,我们搜到一个叫做alert,他应该收不到邮件, oh 素的 alert 用户没有。我们做了路由, critical 级别的,是要发给 admin 的,这里我们已经验证出来油尖路由的功能了。所以朋友们将来如果组织的有钉钉的,或者是有微信的,我们的方法是一样的,只不过它们是不同的 receiver 而已,别的没有任何区别。邮件告关于告警,我们演示的相关功能,还有一个话题我们没说的,就是 receiver 的具体定义格式,不同的媒介下,第一个是各位不同,但是大家照着 Simon 干起来就行,还有一个就是我们所谓的叫抑制规则。抑制规则什么情况下我们可以把告警做个抑制,不会不要确保的。
我们分组完以后,刚才已经加了分组功能,它本身就不会对一个组当时再进行重复发送,而我们如果期望贪功能够在一段时间内不要重复发送,这时候我们要定义所谓叫做抑制规则。