技术标签: 监控 prometheus
前面提到了,Prometheus 数据指标采集
+ Grafana 数据 Web 展示
+ 钉钉告警消息通知
,但是仅仅是做了一个实验,并没有深究其触发告警问题,那 Prometheus 到底是如何触发告警的?我们接着往下看。
在搞清楚 Prometheus 是如何触发告警前,首先我们要清楚 Prometheus 的一个整体架构,其他部分我们先不看,我们就来看 Alertmanager 部分,从架构图中可看到它作为一个整体独立存在,Prometheus 以 Push 消息的方式与其通信,Alertmanager 最后再将 Prometheus 推送过来的告警信息经过其模板渲染后路由给指定用户&&接收端(邮件/钉钉/企业微信等),从而实现告警通知。
沿用前两篇博客案例来逐步解释。
首先,来看 Prometheus 的告警规则:
cat /home/data/prometheus/rules/ssl_cert_alerts.yml
groups: # 父分组
- name: "SSL证书过期提醒" # 子分组。该字段下可配置多个子分组(子分组名用name字段定义),也就是说Prometheus以组的形式进行告警配置。本案例中定义了名为“SSL证书过期提醒”的一个子分组。
rules: # 定义子分组的告警规则。
- alert: "证书过期时间<30天" # 定义告警名。
expr: probe_ssl_earliest_cert_expiry{
job="SSL证书时间"} - time() < 86400 * 30 # 告警条件(只有满足这个表达式条件时才会触发告警)
for: 0s # 持续的时间(满足告警条件持续时间多久后,才会发送告警到Alertmanager)
labels: # 标签(K/V的形式,如定义告警的级别 - - > 提示、告警、严重。)
severity: "提示"
annotations: # 注释(summary -- 摘要、description -- 详情)
summary: "SSL 证书即将过期!"
description: "{
{ $labels.instance }} SSL 证书将在30天后过期,请注意及时续费!"
- alert: "证书过期时间<7天"
expr: probe_ssl_earliest_cert_expiry{
job="SSL证书时间"} - time() < 86400 * 7
for: 0s
labels:
severity: "告警"
annotations:
summary: "SSL 证书即将过期!"
description: "{
{ $labels.instance }} SSL 证书将在7天后过期,请注意及时续费!"
- alert: "证书过期时间<1天"
expr: probe_ssl_earliest_cert_expiry{
job="SSL证书时间"} - time() < 86400 * 1
for: 0s
labels:
severity: "灾难"
annotations:
summary: "SSL 证书即将过期!"
description: "{
{ $labels.instance }} SSL 证书将在1天后过期,请注意及时续费!"
检测规则语法是否有误,SUCCESS 代表语法是没问题的。
docker exec prometheus promtool check rules conf/rules/ssl_cert_alerts.yml
Checking conf/rules/ssl_cert_alerts.yml
SUCCESS: 3 rules found
重启 Prometheus 使配置文件生效。
docker restart prometheus
在 Prometheus 服务端有三个告警状态:
在我的案例中有三个 SSL 证书的时间 < 7 天了,如下图:
钉钉告警配置在前面已经讲过了,这里来验证整个告警过程。
1、Prometheus 规则定义并重启服务生效
2、此时我们会看到 Prometheus 的三个告警状态的变化
为了不产生告警,我已经关闭了小于 30 天、7 天的告警规则了。
现在开启小于 7 天的告警,看看其状态变化情况。
没有经历 Pending,那是因为我的告警规则的 for 值是 0s,所以你会看到直接跳到 Firing 了。
当 Firing 的时候,Prometheus 就会将告警推送到 Alertmanager
Alertmanager 接收到来自 Prometheus 的告警时,会根据 Alertmanager 相关配置(如组等待时间、组发送间隔)将消息发送给 Email、钉钉等。
先看看一份简单的配置文件与字段解释。
global:
resolve_timeout: 1m # 恢复等待(如果1m后没收到来自Prometheus的告警,则发送恢复告警通知)
smtp_smarthost: 'smtp.163.com:465' # 邮箱服务器
smtp_from: '[email protected]' # 邮箱地址(发送用户)
smtp_auth_username: '[email protected]' # 邮箱登录地址
smtp_auth_password: 'DYKIFIZYKUOXRPFV' # 邮箱授权码(注意是授权码,不是登录密码)
smtp_require_tls: false
templates:
- '/etc/alertmanager/template/*.tmpl' # alertmanager模板文件(用于定义告警通知时的模板,如HTML模板、邮件模板等,当然像钉钉有自己的模板则就不会使用该模板,而是使用钉钉自己的模板,也就是说这是缺省模板)
route: # 根路由
group_by: ['alertname'] # 分组(通过alertname标签的值进行分组)
group_wait: 10s # 第一次产生告警,等待10s,组内有告警就一起发出,没有则单独发出
group_interval: 1m # 第二次产生告警,先等待1m,如果1m后还没恢复就进入repeat_interval。定义相同的Group之间发送告警通知的时间间隔
repeat_interval: 5m # 在最终发送消息前再等待5m,5m后还没恢复就发送第二次告警
receiver: 'ops' # 接收者(全局接收者)不管什么样的告警类型都会接收到告警信息
# continue: false # 如果为false,则不进行后续匹配,为true则继续匹配子路由
routes: # 子路由
- match: # 常规匹配
severity: critical # 匹配critical值(这里主要是看你在没在你的Prometheus规则中定义)
receiver: 'dev' # 只有匹配到critical时,才会发送告警消息给dev
# continue: true # 同样是否继续匹配(看你的实际情况)
- match_re: # 正则匹配
severity: ^(warning|critical)$ # 匹配warning或critical
receiver: 'webhook' # 只有匹配到warning或critical师,才会发送告警给webhook
receivers: # 接收者的具体信息
- name: 'ops'
email_configs:
- to: '[email protected]'
send_resolved: true
- name: 'dev'
email_configs:
- to: '[email protected]'
send_resolved: true
- name: 'test'
email_configs:
- to: '[email protected]'
send_resolved: true
- name: 'webhook'
webhook_configs:
- url: http://192.168.56.142:8060/dingtalk/webhook1/send
send_resolved: true
inhibit_rules: # 抑制规则(当匹配到critical时抑制掉warning的告警,防止重复告警)
- source_match:
severity: 'critical' # 此时,这个告警会被通知
target_match:
severity: 'warning' # 此时,这个告警会被抑制
equal: ['alertname', 'dev', 'instance'] # 匹配哪些对象的告警
任何修改配置文件的动作都要重启/热加载才会生效。
docker restart alertmanager
上面提到有3个证书要过期了,但我已经续费了,为了体现效果,我将修改过期时间。
groups:
- name: "SSL证书过期提醒"
rules:
- alert: "证书过期时间<200天"
expr: probe_ssl_earliest_cert_expiry{
job="SSL证书时间"} - time() < 86400 * 200
for: 0s
labels:
severity: "提示"
type: ssl
annotations:
summary: "SSL 证书即将过期 - 提示"
description: "{
{ $labels.instance }} SSL 证书将在200天后过期,请注意及时续费!"
- alert: "证书过期时间<100天"
expr: probe_ssl_earliest_cert_expiry{
job="SSL证书时间"} - time() < 86400 * 100
for: 0s
labels:
severity: "告警"
type: ssl
annotations:
summary: "SSL 证书即将过期 - 告警"
description: "{
{ $labels.instance }} SSL 证书将在100天后过期,请注意及时续费!"
- alert: "证书过期时间<1天"
expr: probe_ssl_earliest_cert_expiry{
job="SSL证书时间"} - time() < 86400 * 1
for: 0s
labels:
severity: "灾难"
type: ssl
annotations:
summary: "SSL 证书即将过期 - 灾难"
description: "{
{ $labels.instance }} SSL 证书将在1天后过期,请注意及时续费!"
global:
resolve_timeout: 30s
route:
group_wait: 10s
group_interval: 5s
repeat_interval: 1m
group_by: ['alertname']
receiver: 'ops'
routes:
- match:
severity: '提示'
receiver: 'web.hook.prometheusalert'
- match:
severity: '告警'
receiver: 'web.hook.prometheusalert'
- match:
severity: '灾难'
receiver: 'web.hook.prometheusalert'
receivers:
- name: 'ops'
webhook_configs:
- url: 'http://192.168.56.150:8060/dingtalk/webhook1/send'
send_resolved: true
- name: 'web.hook.prometheusalert'
webhook_configs:
- url: 'http://192.168.56.142:8060/dingtalk/webhook1/send'
send_resolved: true
inhibit_rules:
- source_match:
severity: '告警'
target_match:
severity: '提示'
equal: ['ssl']
告警策略分析:当子路由匹配到不同的 severity
时就会将消息发往不同的 receiver
,当子路由无法匹配到时,消息会默认发往根路由的 receiver
,因此,无论是否匹配到子路由规则,消息都会发往根路由的 receiver
。
抑制策略分析:当匹配到告警
标签值时会抑制提示
标签值的告警(无论根路由或子路由),但是要注意的是,抑制策略必须来自同个标签类型(即 equal 标签的值必须相同才能起到抑制效果),否则抑制不生效。举个例子:之前我将 equal
设置为alertname
是不生效的,原因是在 Prometheus
那端的 alertname
就不一样(除非你设置为一样的),因此解决方法就是将 alertname
设置为相同的值,或自定义额外标签(案例中我就添加的额外标签 - - > type 且值都统一为 ssl),这样的话当匹配到 告警
时就会抑制提示
的告警通知并检查他们是否来自于同个 ssl(即ssl标签的值相同抑制才会生效)。
看看最终效果,可见只发送了
告警
相关的消息,提示
相关的消息已经被抑制了。
除了通过 Alertmanager 配置文件配置实现抑制,那还有没其他方式实现类似抑制效果呢?是有的,就是 Alertmanager 自身的静默机制,接下来顺便看看如何设置静默。
http://192.168.56.142:9093/
两种方式:
根据现有的告警设置静默
和新建告警静默
。
1、根据现有的告警设置静默
直接点击 Silence 静默
开始静默设置
最后再看看钉钉告警
此时就只收到两条告警信息了(有一条)
2、新建告警静默
点击 New Silence
剩下的配置都一样(不再重复演示)
1、Silence - - > Exprire
2、最后点击 Confirm
3、再看看告警通知
又恢复三条告警信息了。
注意:告警恢复(resolve)的时候,消息是正常通知的,没有受抑制的影响。
其实配置都比较简单,我认为重点在于搞懂 Prometheus 是如何触发的,Alertmanager 又是如何告警的?简单总结一下:
文章浏览阅读4.9k次。java - 将秒值转换为小时分钟秒?我一直在尝试将秒值(在BigDecimal变量中)转换为editText中的字符串,如“1小时22分33秒”或类似的东西。我试过这个:String sequenceCaptureTime = "";BigDecimal roundThreeCalc = new BigDecimal("0");BigDecimal hours = new BigDecimal..._java hh:mm:ss转分钟
文章浏览阅读966次。Sentinel是阿里开源的项目,提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。中文官网地址:https://sentinelguard.io/zh-cn/docs/introduction.html当调用链路中某个资源出现不稳定,则对这个资源的调用进行限制,并让请求快速失败,避免影响到其它的资源。sentinel处理这个问题采取了两中方式:2、下载Sentinelhttps://github.com/alibaba/Sentinel/releases下载完成后找到下载的目录_sentinel文档
文章浏览阅读2.2k次。360安全浏览器已经正式上线国产版,提供有deb软件包下载,为稳定版本(browser360-cn-stable_10.0.2001.0-1_amd64.deb),当前版本号为10.0.2001.0,内核是Chromium 63。有用户反馈,使用-2的有依赖问题,-1没有依赖问题,能正常使用,在下载链接中提供该deb包下载,可参考安装360浏览器稳定版依赖关系不满足的解决思路一文。360安全浏览器..._360deb
文章浏览阅读608次。cobbler源码安装1. cobbler简介Cobbler是一个Linux服务器安装的服务,可以通过网络启动(PXE)的方式来快速安装、重装物理服务器和虚拟机,同时还可以管理DHCP,DNS等。Cobbler可以使用命令行方式管理,也提供了基于Web的界面管理工具(cobbler-web),还提供了API接口,可以方便二次开发使用。Cobbler是较早前的kickstart的升级版,优点是比较容易配置,还自带web界面比较易于管理。Cobbler内置了一个轻量级配置管理系统,但它也支持和其它配置_cobbler源码安装
文章浏览阅读477次。**Win10安装anaconda3-4.4.0+tensorflow-gpu1.12.0+keras2.2.4**本人的电脑配置:NVIDIA GTX1050ti这次安装也是破费周转,特此做下记录。不会再详细地写出具体的操作,大多数都用链接代替了。1.安装anacondaWindows安装anaconda2.安装cuda下载cudnntensorflow各个版本的CUDA以及Cudnn版本对应关系首先要清楚自己需要装什么版本的tensorflow。根据自己项目的实际需求确定tensorf_anaconda3 4.4.0
文章浏览阅读5.5k次,点赞2次,收藏6次。阿里云ACP专业认证考试值得考吗?当然值得!云吞铺子来说说ACP认证考试过关心得、经验分享、考试费用、报名考场等相关问题:ACP认证种类范围ACP认证可以分为五个领域,即云计算、大数据、云安全、人工智能和中间件。目前阿里云ACP认证考试分为:云计算工程师、大数据分析师和大数据工程师、云安全工程师和云安全行业工程师、人工智能工程师和企业级互联网架构工程..._阿里云acp考试没过要重新交费吗
文章浏览阅读1.8k次。菜鸟错误大全(六)我们都是从新手一步一个坑踩过来的,下面我们来讲讲会遇到的常见错误和解决办法: Unknown URL content://com.exaple.databasetest.provider/book:这是写错包名了,应该为“content://com.example.databasetest.provider/book”_unknown url
文章浏览阅读2.5k次,点赞2次,收藏15次。一. 支付支付主要分为几个步骤:前端携带支付需要的数据(商品id,购买数量等)发起支付请求后端在接收到支付请求后,处理支付数据,然后携带处理后的数据请求 微信服务器 的 支付统一下单接口后端接收到上一步请求微信服务器的返回数据,再次处理,然后返回前端让前端可以开始支付。前端进行支付动作前端支付完成后,微信服务器会向后端发送支付通知(也就是微信要告诉你客户已经付过钱了),后端根据这个通..._微信小程序退款前端开发
文章浏览阅读2.2w次。Sublime Text 3正式版发布作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszs一、下载地址:1. Windows 32位版http://c758482.r82.cf2.rackcdn.com/Sublime%20Text%20Build%203010%20Setup.exe2. Windows 64位版http://c758482.r82.cf2_sublime3 toolchain
文章浏览阅读776次。前言在如今的 Flutter 大潮下,本系列是让你看完会安心的文章。本系列将完整讲述:如何入门 Flutter 开发,如何快速从 0 开发一个完整的 Flutter APP,配套高完成度 Flutter 开源项目 GSYGithubAppFlutter,提供 Flutter 的开发技巧和问题处理,之后深入源码和实战为你全面解析 Flutter。 笔者相继开发过 Flutter、React Nat..._flutter 函数详解
文章浏览阅读3.5k次。杨辉三角杨辉三角也叫帕斯卡三角,在很多数量关系中可以看到,十分重要。第0行: 1第1行: ..._杨辉三角java第八届蓝桥杯
文章浏览阅读3.7k次。人们对于一些新时代诞生得词语总是会提出疑问,比如说什么是人工智能?在帮助盟军通过破解纳粹加密机Enigma赢得第二次世界大战后不到十年,数学家艾伦·图灵(Alan Turing)第二次改变了历史,提出了一个简单的问题:“机器能思考吗?”图灵1950年的论文“计算机与智能”及其随后的图灵测试确立了人工智能的基本目标和愿景。从本质上讲,人工智能是计算机科学的一个分支,旨在肯定地回答图灵的问题。它是在机器中复制或模拟人类智能的努力。人工智能的广泛目标引发了许多问题和辩论如此之多,以至于没有一个单一的领域定义被_硕士强化学习做什么方向好毕业