Prometheus+Grafana 搭建监控系统
今天将第一版监控系统上线,过程整个就是一路坎坷。不过踩坑,填坑,确实也是为自己积攒了一些小经验。
prometheus的服务发现
Prometheus的监控使用的是pull的模式,也就是每隔几秒钟去各个target采集一次metric。那么如果是多个target,如果是静态配置的话,那么就得在配置文件里面一个一个添加,尽管可以使用接口去更新配置文件,但如果服务太多,那工作量也很大。而且如果遇到微服务的情况并且容器化部署,那么可能ip地址都是随机改变的,那么就将更麻烦了。所以就有服务发现的模式出来了,有很多种实现的方式,consul,dns等等,针对我们现有的平台,我们选择了file_sd_config:
1 | scrape_configs: |
基于文件的方式,只需要在/home/config
目录下增加json文件就可以了,这也是在网上找的一个方案,所以我也记录下来,万一也能帮助到别人了
1 | [ |
监控报警规则 rule_files:
1 | rule_files: |
规则可以在这里配置多个,这里其实也是支持通配符的。也就是:
1 | rule_files: |
我使用的是yml格式,如果你会的话,也可以是用.rule
;
1 | groups: |
上面的yaml就是定义了两个规则,go_goroutines>200
以及up==0
一个是go的协程数,一个是被监控目标是否可以正常采集。在则合理推荐使用labels,这样如果是使用alertmanager做预警,那么可以使用这些label。for
的意思指接到一个触发报警rule的收将状态变成active,然后如果在for之内的评估期内如果没有报警就变成pending状态,如果有就变成firing,发送报警。
alertmanager发送报警邮件
alertmanager相当于通知中心,它只会在Prometheus发送报警后,通过某些渠道(邮件,即时通讯等)发送通知。当然它在通知这方面做了相当多的事情。
alertmanager 通知分组
如果是一个频繁的bug,引起Prometheus一直触发警报,如果不做限制,那么就会引起邮箱轰炸。alertmanager中的route就是做这个的。通过路由器将不同的邮件发送给不同的人。
1 | route: |
这里的group_by: [label,...]
将通知分组,group_interval: 30s
指的是如果在30s内收到同一组的邮件告警,那么将合并他们为一条邮件然后发送。repeat_interval: 10s
当第一次发送邮件后下一次发送邮件的间隔。这个值一定要改,尤其是上线之后。routes主要是将邮件进行区分发送,这里我们之前在rule里面配置的label就可以起作用了。使用match来匹配那些label然后做不同的路由。
alertmanager 邮件抑制
邮件抑制的意思,我觉得更应该是邮件优先原则。指的是如果有两组告警,一组告警非常紧急,一组不重要,如果两组一起来告警,那么可能会引起,邮箱里面重要的告警被不重要的淹没了,从而导致我们忽略了某些重要告警。所以我们可以进行配置:
1 | inhibit_rules: |
上面的规则就是,如果有serverity为critical的标签,那么serverity为warning的告警先不发,只发critical的告警。在Prometheus的rule里面如下配置:
所以,多配置点label还是有点用的,哈哈。
ps:抑制的是某一种高级别的邮件发送,而这个邮件会按照定好的时间间隔一直发送,不会说只发一条就不发了。
alertmanager 邮件静默
邮件静默其实就是指在某一段时间内,将某一类型的告警暂时忽略不让它发送告警。(又用到label了。。)创建静默的方式有两种,一个是直接在告警信息上创建;另一个是直接new silence:
需要配置一个label。之后一定一定要配置时间,第一次使用的时候,我以为静默是一直忽略,然后我就下班了。之后回到家中,2h默认时间过后,我的邮箱爆炸了。。。所以静默是有时间限制的,一定要,一定要设置。
alertmanager的邮件模板
1 | templates: |
1 | {{ define "email.czj.html" }} |
邮件模板这里我是在网上找了一个非常详细的帖子。我觉得写的非常详细,主要注意就是要在模板的一行的define,要和receivers的html中tempate相对应。之后就是在模板中引用go语言的变量用点+大写变量名
。详细可以看这边博客alertmanager 邮件模板。从源码解释,很详细。
alertmanager 邮件配置
注意一个,是否开启ssl。我们用的是http,所以把ssl关闭。我用163配置的:
1 | global: |
一般本地测试的时候:smtp_require_tls
这个可以是true,但是一般服务器不通外网可能不行。
prometheus 与 alertmanager 降低日志级别
日志调到debug级别,两者都可以用.alertmanager --help
或者./promtheus --help
来查看所有可选项。
alertmanager:./alertmanager --config.file='config163.yml' --log.level=debug
;
prometheus: ./prometheus --web.enable-lifecycle --config.file='prometheus.yml' --log.level=debug --web.external-url=http://localhost:9090/pro --web.route-prefix=pro
后面Prometheus的--web.external-url=http://localhost:9090/pro
,--web.route-prefix=pro
。这两个参数就类似加个服务号,如果有子路径做反向代理,Prometheus最好启动的时候就加上这两个。
比如在nginx用子路径做反向代理:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
server {
listen 127.0.0.1:80;
#server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
# proxy_pass http://127.0.0.1:9090/;
}
location /alertmanager/ {
proxy_pass http://127.0.0.1:9093/;
}
location /pro/ {
proxy_pass http://127.0.0.1:9090/pro/;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
暂时就这些吧。
参考链接
GETTING STARTED prometheus.io
alertmanager邮件模版
alertmanager报警规则详解
Prometheus智能化报警流程避免邮件轰炸
Custom Alertmanager Templates