工作日志
今天是8月16日,星期一,线上办公第🔟天,隐隐约约感觉要解封啦,😙
任务清单
今天的任务只有一个主题——深入研究alertmanager的配置
任务记录
深入研究alertmanager的配置
研究到哪就写到哪吧,如果公司没有分配给我新的工作,那这周基本都在这上面了。
今天看了很多的文章,有官方文档也有大佬们写的博客,无外乎就在研究两个问题,一个是路由配置,一个是报警时间相关的问题
1⃣️:路由配置
配置目的:
满足多元化的监控报警要求,比如说区块链方面的报警传给前端的同事,服务器性能方面的报警则要传给运维工作人员(是的,就是我🤠)
怎么配置:
下面是alertmanager.yml文件具体内容:
global:
resolve_timeout: 5m
# default is 5m
route:
group_by: ['alert'] # 与rules.yml中的group name保持一致,表示 `alert`组中的警告都使用下面的路由发送
group_wait: 5s # 发出警报后等待同组警报的时间
group_interval: 5m # 告警时间间隔
repeat_interval: 10m # 重复发送报警的时间间隔
receiver: 'default' # 默认根路由的接受者
routes: # 子路由
- receiver: 'blockchain_Alert'
match:
project: blockchain # match匹配rules.yml文件里label定义的project,project为blockchain的警报发往 `blockchain_Alert`接受者
- receiver: 'performance_Alert'
match: # match匹配,与上面的意思相同
project: performance
receivers: # 各项接受者的具体配置,其中决定了警报究竟去哪里
- name: 'default' # 匹配receiver为‘default’的alert通过webhook发送至下面的url
webhook_configs:
- url: 'http://xx.xx...'
- name: 'performance_Alert' # 与上面的说明一样,但可以把alert传给两个不同的url
webhook_configs:
- url: 'http://xx.xx...'
- url: 'http://xx.xx...'
- name: 'blockchain_Alert' # 上同啦
webhook_configs:
- url: 'http://xx.xx...'
# inhibit_rules:
# - source_match:
# severity: 'critical'
# target_match:
# severity: 'warning'
# equal: ['alertname', 'dev', 'instance']
在alertmanager的路由配置中,一般是由一个根路由(root route)后接若干个子路由(child root)组成,当然你可以只写一个路由,但考虑到日后监控报警工作的多元化,因此强烈建议设置成多个子路由的形式,方便后面的管理。
为了搭配alertmanager.yml文件的正常运行,所以rules.yml要设置成下面这个样子:
group:
- name: 'alert' # 与alertmanager.yml文件中参数group_by后面的字符串保持一致,同时说明以下两个alert属于同一个组'alert'
rules:
- alert: PrometheusTargetMissing
expr: up == 0
for: 10s
labels:
level: medium
project: performance # 此处为文件alertmanager.yml中match的匹配依据
annotations:
description: "A Prometheus target {{$labels.job}} has disappeared. It might be crashed."
- alert: BlockchainProblem_Test
expr: delta(substrate_block_height{status="best"}[20s]) >= 2
for: 0s
labels:
level: test
project: blockchain # 同上,此处为文件alertmanager.yml中match的匹配依据
annotations:
description: "The change of the block height(best) within 20 seconds is greater than or equal to 2"
这么一路配置下来,就能正常运行报警系统了
2⃣️:报警时机(报警时间)的理解
配置目的:
对alert进行实时准确的报警
具体理解:
一个经典的例子如下所示:
cd prometheus-2.28.1.linux-amd64/ | vim prometheus.yml
# prometheus.yml的配置大致如下
global:
scrape_interval: 20s
evaluation_interval: 1m
# -- snip --
vim rules.yml
# rules.yml的关键配置如下
# 此处语法大家不必较真,只是个例子
ALERT NODE_LOAD_1M
IF node_load1 > 20
FOR 1m
# -- snip --
那么请问,触发JobMissing警报所用的时间为多少?🤨
是个好问题,一开始我也没有琢磨出来,这也是我一直想知道的
分析这个问题应该从下面的图看起:
结合下面的分析,大家可以慢慢推敲出答案:
- The load of a node constantly changes, but it gets scraped by Prometheus every
scrape_interval
(ie.20s
) - Alert rules are then evaluated against the scraped metrics every
evaluation_interval
(ie.1m
) - When an alert rule expression is true (ie.
node_load1 > 20
), the alert switches to pending, in order to honor theFOR
clause - At the next evaluation cycles, if the alert expression is still true, once the
FOR
clause is honored the alert finally switches tofiring
and a notification is pushed to the alert manager
公布一下答案:it takes a time between 1m
and 20s + 1m + 1m
.
把原文挂出来分享给大家:Prometheus: understanding the delays on alerting
这还有个中文翻译的版本:多久可以收到prometheus的告警?
总结
通过今天的学习,对alertmanager的配置又有了一个更深入的了解,我的第二个项目又能升级一下啦。
明天继续加油研究,顺便和师哥交流一下今天的进度,继续升级我的项目😄