Prometheus-Alertmanager 警报管理器-部署和设置
文章目录
- 一、介绍
- 二、核心概念
- 1 Grouping 分组
- 2 Inhibition 抑制
- 3 Silences 静默(静音)
- 5 High Availability 高可用性
- 三、部署
- 1 二进制方式
- 下载
- 配置 systemd
- 2 docker-compose 方式
- 四、配置
- 1 配置文件介绍
- 1.1 全局配置
- 1.2 `receiver` 接收器
- 标准接收器相关设置
- 接收器集成设置
- 1.3 time_interval 时间间隔
- `time_interval`
- `time_interval_spec`
- `time_range`
- `weekday_range`
- `days_of_month_range
- `month_range`
- `year_range`
- `location`
- 1.4 路由相关配置
- `<route>` 根路由
- 标签匹配器 `matcher`
- `routers`子路由配置
- 1.5 抑制相关配置 Inhibition
- `<inhibit_rules>`
- 2 静默配置
一、介绍
Alertmanager 用于接收 Prometheus 推送的警报信息,并对这些警报信息进行分组、路由、删除重复数据等处理,还可以进一步设置某些警报的静默,抑制等。最后还可以使用 邮件,Webhook 方式等发送通知。
二、核心概念
1 Grouping 分组
分组将性质相似的警报分类到单个通知中。这 在多个系统同时发生故障的较大中断期间特别有用,并且 数百到数千个警报可能会同时触发。
试想一个部署有 MySQL 的服务器网络中断,导致 k8s 集群中所有应用示例无法连接到这台MySQL。假设 k8s 集群中有成百上千个应用实例,将会同时发送警报信息到 Alertmanager。
其实作为管理者,只想获得一个警报信息即可,并且可以看到都有哪些实例受到影响。因此 Alertmanager 可以配置按机器和警报名称进行分组,以便发送一条比较紧凑、有汇总的通知。
2 Inhibition 抑制
抑制是指如果某些其他警报已经启动,则抑制某些警报的通知的概念。
某些其他警报和某些警报是存在一定的关联性。
例如:正在触发警报,通知无法访问整个群集。Alertmanager可以配置为,如果该特定警报正在启动,则将与该集群有关的所有其他警报静音。这将阻止数百或数千个与实际问题无关的触发警报的通知。
抑制 可通过Alertmanager的配置文件进行配置。
3 Silences 静默(静音)
静默是在给定时间内简单地静音警报的一种简单方法。
静默是基于匹配器配置的,就像路由树一样。将检查传入警报是否与激活状态的静默的所有条件相等或正则表达式相匹配。如果符合或者匹配,则不会发出该警报的通知。
静默是在Alertmanager的web界面中配置的。
5 High Availability 高可用性
Alertmanager支持为实现高可用性而创建集群的配置。这可以使用 --cluster-*
标志进行配置。
重要的是不要在Prometheus及其AlertManager之间进行流量负载平衡,而是将Prometheus指向所有AlertManager的列表。
要创建警报管理器的高可用性集群,实例需要 配置为相互通信。这是使用标志配置的。--cluster.*
--cluster.listen-address
字符串:集群监听地址(默认为 “0.0.0.0:9094”; 空字符串 “” 表示禁用 HA 模式)--cluster.advertise-address
字符串:集群公告地址--cluster.peer
值`:初始对等体(对每个附加对等方重复标志)--cluster.peer-timeout
值:对等超时期限(默认为“15s”)--cluster.gossip-interval
值:集群消息传播速度 (默认为“200ms”)--cluster.pushpull-interval
值:值越低,值越大 以牺牲带宽为代价的收敛速度(默认为“1m0s”)--cluster.settle-timeout
值:等待群集的最长时间 在评估通知之前要解决的连接。--cluster.tcp-timeout
值:TCP 连接、读取和写入的超时值(默认为“10s”)--cluster.probe-timeout
值:在标记节点不正常之前等待 ACK 的时间 (默认为“500ms”)--cluster.probe-interval
值:随机节点探测器之间的间隔(默认“1s”)--cluster.reconnect-interval
值:尝试重新连接到丢失的对等体之间的间隔(默认为“10s”)--cluster.reconnect-timeout
值:尝试重新连接到丢失的对等体的时间长度(默认值:“6H0m0s”)--cluster.label
值:标签是要包含在每个数据包和流上的可选字符串。它唯一标识集群并防止发送八卦消息时出现交叉通信问题(默认:“”)
高可用架构图
三、部署
1 二进制方式
下载
在 Prometheus 下载页面可以找到不同的版本和适合不同平台的二级制部署包
这里以 Linux amd64 为例。
curl -o alertmanager.tgz -L https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz
配置 systemd
命令行启动参数
参数 | 含义 |
---|---|
--config.file="alertmanager.yml" | 指定配置文件 |
--storage.path="data/" | 指定数据存储基础路径 |
--data.retention=120h | 数据保留时长 |
--web.listen-address=:9093 | 用于公开度量和web界面的地址。 |
--web.external-url=WEB.EXTERNAL-URL | 指定一个 FQDN ,比如 --web.external-url=http://grafana.host.com ,这样警报信息中会包含查看当时这个警报的图形链接。 |
命令行的所有配置参数可以使用此命令获取: alertmanager -h
[Unit]
Description=Alertmanager 警报管理器
After=network-online.target
Wants=network-online.target[Service]
#EnvironmentFile=-
ExecStart=/usr/local/bin/alertmanagerKillSignal=SIGQUITRestart=alwaysRestartPreventExitStatus=1 6 SIGABRTTimeoutStopSec=5
KillMode=process
PrivateTmp=true
LimitNOFILE=1048576
LimitNPROC=1048576[Install]
WantedBy=multi-user.target
2 docker-compose 方式
version: "3.9"
services:alertmanager:user: "65534"image: quay.io/prometheus/alertmanagercommand: --config.file=/etc/alertmanager/alertmanager.yml --storage.path=/alertmanager --web.listen-address=:9093 --web.listen-address=:9098volumes:- "./alertmanager.yml:/etc/alertmanager/alertmanager.yml"- "./data:/alertmanager"network_mode: "host"expose:# web 端口- "9093"# 集群端口- "9094"# 还是 web 端口- "9098"
--web.listen-address=
参数可以使用多次指定多个
四、配置
配置文件中一般配置 静默规则、通知路由,通知接收器等。
Alertmanager 和 Prometheus 一样支持热加载配置,只需要向进程发送信号:SIGHUP
或者向服务发送POST 请求
curl -X POST http://ip:9093/-/reload
如果配置文件中有错误,配置文件将不会更新。
1 配置文件介绍
下面是一些配置示例,覆盖了最主要的基础配置, 这里有完整的配置说明
1.1 全局配置
global:# 用于发送电子邮件的默认SMTP智能主机,包括端口号.# 端口号通常为 25 或者 TLS 的 SMTP 为 465smtp_smarthost: 'stmpt.126.com:25' # 默认的SMTP发件人标头字段smtp_from: 'xxx@126.com'# 要显示给SMTP服务器的默认主机名。[ smtp_hello: '126.com' | default = "localhost" ]# 使用CRAM-MD5、LOGIN和PLAIN的SMTP身份验证用户名,一般是邮箱的用户名。# 如果为空,则Alertmanager不会对SMTP服务器进行身份验证。如果 SMTP 需要认证,则会失败。# 此邮箱需在其邮箱服务器上开通 SMTP 功能。[ smtp_auth_username: 'xxx@126.com' ]# 身份验证秘钥,不是登录密码。[ smtp_auth_password: <secret> ]# 发送邮件是否使用 TLS, 如果是true ,smtp_smarthost 的值中的端口应该是 465# 请注意,Go不支持到远程 SMTP 服务器的未加密连接。[ smtp_require_tls: <bool> | default = true ]# 如果警报不包括EndsAt,ResolveTimeout是alertmanager使用的默认值。# 经过这段时间后,如果警报尚未更新,它可以将其声明为已解决。# 这对普罗米修斯的警报没有影响,因为它们总是包括EndsAt。[ resolve_timeout: <duration> | default = 5m ]# 从中读取自定义通知模板定义的文件。
# 最后一个元素可以使用通配符匹配器,例如 'templates/*.tmpl'
templates:[ - <filepath> ... ]# 路由的根节点,称为根路由.
route: <route># 通知接收者的列表。这里可以配置邮件、webhook 等接收告警消息者。
receivers:- <receiver> ...# 一个包含一个或多个静默规则的列表.
inhibit_rules:[ - <inhibit_rule> ... ]# 指定可在路由树 "active_time_intervals" 字段中引用的时间间隔名称,以便在一天中的特定时间静音/激活特定路由。
# 具体如何设置,继续参看接下来的章节
time_intervals:[ - <time_interval> ... ]
1.2 receiver
接收器
标准接收器相关设置
接收器是一个或多个通知集成的命名配置。
包含如下字段:
receivers:# 接收器的唯一名称。- name: <string># 多个通知集成的配置,如下仅展示和介绍经常使用的几种。email_configs: # 发邮件[ - <email_config>, ... ]webhook_configs: # 利用 webhook 发送钉钉消息[ - <webhook_config>, ... ]wechat_configs: # 发企业微信[ - <wechat_config>, ... ]
接收器集成设置
这些设置允许配置特定的接收器集成。
<email_config>
# 是否通知已解决的警报。
[ send_resolved: <boolean> | default = false ]# 接收警报信息的邮件地址,多个用英文逗号分开。例如: 'xxx@qq.com,yyy.@qq.com'
to: <tmpl_string># 向接收人展示的发件人的地址。
[ from: <tmpl_string> | default = global.smtp_from ]# 发送电子邮件的SMTP主机。
[ smarthost: <string> | default = global.smtp_smarthost ]# 要标识给SMTP服务器的主机名。
[ hello: <string> | default = global.smtp_hello ]# SMTP身份验证信息
[ auth_username: <string> | default = global.smtp_auth_username ]
[ auth_password: <secret> | default = global.smtp_auth_password ]# SMTP TLS要求。
# 请注意,Go不支持到远程SMTP终结点的未加密连接
[ require_tls: <bool> | default = global.smtp_require_tls ]# TLS configuration.
tls_config:[ <tls_config> ]# 电子邮件通知的HTML正文,这里一般使用定义好的模板,这里的 email.default.html 是模板名称.
# 模板名称是在全局的 "templates" 字段指定的模板文件中定义的。
[ html: <tmpl_string> | default = '{{ template "email.default.html" . }}' ]
# 电子邮件通知的文本正文。
[ text: <tmpl_string> ]# 其他邮件头电子邮件头键/值对。
[ headers: { <string>: <tmpl_string>, ... } ]
示例
receivers:
- name: 'team-X-mails'email_configs:- to: 'team-X+alerts@example.org, team-Y+alerts@example.org'- name: 'team-X-pager'email_configs:- to: 'team-X+alerts-critical@example.org'pagerduty_configs:- routing_key: <team-X-key>- name: 'team-Y-mails'email_configs:- to: 'team-Y+alerts@example.org'headers:subject: "邮件标题"from: "邮件来自哪儿"to: "发给谁的"
<webhook_config>
webhook接收器允许配置通用接收器。
如果发送钉钉,需要配合一个插件 prometheus-webhook-dingtalk
prometheus-webhook-dingtalk 会启动一个服务,并暴露一个接口。
alertmanager 可以通过 webhook_config
中的 url
字段的配置,向 prometheus-webhook-dingtalk 发送一个 POST 的 HTTP 请求。从而实现警报信息向钉钉发送的目的。
# 是否通知已解决的警报。
[ send_resolved: <boolean> | default = true ]# 要向其发送HTTP POST请求的端点。
url: <secret># 要包含在单个webhook消息中的最大警报数。超过此阈值的警报将被截断。
# 将其保留为默认值0时,将包括所有警报。
[ max_alerts: <int> | default = 0 ]
Alertmanager将以以下JSON格式向配置的端点发送HTTP POST请求:
{"version": "4","groupKey": <string>, // key identifying the group of alerts (e.g. to deduplicate)"truncatedAlerts": <int>, // how many alerts have been truncated due to "max_alerts""status": "<resolved|firing>","receiver": <string>,"groupLabels": <object>,"commonLabels": <object>,"commonAnnotations": <object>,"externalURL": <string>, // backlink to the Alertmanager."alerts": [{"status": "<resolved|firing>","labels": <object>,"annotations": <object>,"startsAt": "<rfc3339>","endsAt": "<rfc3339>","generatorURL": <string>, // identifies the entity that caused the alert"fingerprint": <string> // fingerprint to identify the alert},...]
}
其实,webhoook_config
的配置不仅仅支持钉钉,它是一个通用的 webhook 工具。 有一个与此功能集成的列表。
要实现钉钉告警,需要安装一个钉钉插件的 webhook 服务,具体点击链接
<wechat_config>
微信通知通过微信API发送。
# Whether to notify about resolved alerts.
[ send_resolved: <boolean> | default = false ]# The API key to use when talking to the WeChat API.
[ api_secret: <secret> | default = global.wechat_api_secret ]# The WeChat API URL.
[ api_url: <string> | default = global.wechat_api_url ]# The corp id for authentication.
[ corp_id: <string> | default = global.wechat_api_corp_id ]# API request data as defined by the WeChat API.
[ message: <tmpl_string> | default = '{{ template "wechat.default.message" . }}' ]
# Type of the message type, supported values are `text` and `markdown`.
[ message_type: <string> | default = 'text' ]
[ agent_id: <string> | default = '{{ template "wechat.default.agent_id" . }}' ]
[ to_user: <string> | default = '{{ template "wechat.default.to_user" . }}' ]
[ to_party: <string> | default = '{{ template "wechat.default.to_party" . }}' ]
[ to_tag: <string> | default = '{{ template "wechat.default.to_tag" . }}' ]
1.3 time_interval 时间间隔
time_interval
指定可在路由树中引用的命名时间间隔,以表示在一天中的特定时间处于 静音或者激活 状态的特定路由。
time_intervals:# 一个 time_interval 开始- name: <string> # 此时间间隔的名称,可以在子路由中被引用。time_intervals:# 下面定义一个一个的时间间隔[ - <time_interval_spec> ... ]# 一个time_interval 结束
time_interval_spec
包含时间间隔的实际定义。语法支持以下字段:
time_intervals:- name: <string> # 此时间间隔的名称,可以在子路由中被引用。time_intervals:- times:[ - <time_range> ...]weekdays:[ - <weekday_range> ...]days_of_month:[ - <days_of_month_range> ...]months:[ - <month_range> ...]years:[ - <year_range> ...]location: <string>
所有字段都是列表。在每个非空列表中,必须满足至少一个元素才能与字段匹配。
如果未指定字段,则任何值都将与该字段匹配。
为了使某个瞬间的时间与完整的时间间隔相匹配,所有字段都必须匹配。
如果未指定时区,则时间以UTC为单位。
一些字段支持区间和负指数,详情如下。
time_range
包含开始时间和不包含结束时间的范围,可以方便地表示在小时边界上开始/结束的时间。
例如,start_time:'17:00'
和 end_time:'24:00'
将从 17:00 开始,并在 24:00 之前结束。它们是这样规定的:
time_intervals:- times:- start_time: HH:MMend_time: HH:MM
weekday_range
一周中的日期列表,一周从周日开始,到周六结束。应按名称指定日期(例如“Sunday”)。
为了方便起见,还接受形式为<start_day>:<end_day>
的范围,并且范围两端都包含。
例如:要表示: 星期一到星期三,星期六,星期日,应写成:['monday:wednesday','saturday', 'sunday']
`days_of_month_range
一个月中的数字天数列表。
天数从1开始。负值也可以接受,从月底开始,例如1月份的-1表示1月31日。
例如:['1:5','-3:-1']
。超过月初或月底将导致它被钳制。
例如,在2月份指定 ['1:31']
将根据闰年将实际结束日期固定为28或29。包括两端。
month_range
由不区分大小写的名称(例如“January”)或数字标识的日历月份列表,其中January=1。
也可接受范围。例如,['1:3','may:august','december']
。包括两端。
year_range
年份的数字列表。接受范围。例如,["2020:2022","2030"]
。两端均包含。
location
与IANA时区数据库中的位置匹配的字符串,例如 东八区,即中国时区:Asia/Shanghai
。
location: 'Asia/Shanghai'
您也可以使用 'Local'
表示使用 Alertmanager 运行的机器作为本地时间的位置, 或使用 'UTC'
表示UTC时间。
如果未提供时区,则时间间隔以UTC时间为单位。
注意:在Windows上,只有 'Local '
或 'UTC'
才受支持,除非您使用 ZONEINFO
环境变量提供自定义时区数据库。
关于中国时区,可以参考这篇知乎的文章 https://zhuanlan.zhihu.com/p/450867597
1.4 路由相关配置
通过与路由相关的设置,可以根据时间配置警报的路由、聚合、抑制和静音方式。
<route>
根路由
route
块定义路由树中的节点及其子节点。
如果子节点中的某些可选配置未设置,那些可选的配置参数(就是用中括号括起来的配置参数)将从其父节点继承。
每个警报都进入配置的顶级路由的路由树,该路由树必须匹配所有警报(即没有任何配置的匹配器)。
然后它遍历子节点。如果 continue
设置为 false
,则在第一个匹配的子路由之后就停止继续匹配。
如果 continue
为 true
,则警报将继续与后续同级路由匹配。
如果警报与节点的任何子节点都不匹配(没有匹配的子节点或不存在),则会根据当前节点的配置参数来处理警报,一般会由默认 route
块配置的 receiver
处理。
# 根路由,每个传入的警报都会经过这里
route:# 根路由不能有任何匹配器,因为它是所有警报的入口点。# 它需要配置一个默认的接收器,以便将与任何子路由不匹配的警报发送给此接收器。# 其值需要是全局 receivers 中配置的其中一个。[ receiver: <string> ]# 传入警报分组所依据的标签。# 例如 含有 cluster=A 和 alertname=LatencyHigh 标签的多个警报将被批处理到一个组中。# 若要按所有可能的标签进行聚合,请使用特殊值"..."作为唯一的标签名称,例如:group_by:['...']# 这有效地完全禁用了聚合,按原样传递所有警报。# 这不太可能是你想要的,除非你的警报量很低,或者你的上游通知系统执行自己的分组。group_by: ['alertname', 'cluster']# 当传入警报创建新的警报组时,请至少等待 "group_wait" 时间后再发送初始通知。# 这种方式可以确保您在 "group_wait" 时间内获得同一组的多个警报,这些警报在这个时间内进行批处理后,再一起开始触发。group_wait: 30s# 百度翻译:发送 有关添加到已发送初始通知的警报组中的新警报的通知之前等待的时间。# 自己的理解:基本意思就是 对于一个已经发送过初始通知的组,再次发送新的警报需要等待的时间。# 通常 5m 或者更长# 这个附上原文# How long to wait before sending a notification about new alerts # that are added to a group of alerts for which an initial notification has already been sent.group_interval: 5m# 如果已成功发送警报通知,则在再次发送通知之前等待多长时间。(通常约3小时或更长时间)。# 请注意,此参数由Alertmanager的“--data.reduration”配置标志隐式绑定。通知将在repeat_interval或数据保留期结束后重新发送,以先发生的为准`repeat_interval`不应小于`group_interval'。repeat_interval: 3h# 警报是否应继续匹配后续同级节点。[ continue: <boolean> | default = false ]# 警报必须满足的匹配器列表才能匹配节点, 一般在子路由中设置。matchers:[ - <matcher> ... ]# 路由应该静默的时间。# 与全局设置 "time_intervals" 字段中定义的静音时间间隔的名称相匹配。# 此外,根节点不能有任何静音时间。# 当路由被静音时,它不会发送任何通知,但在其他情况下会正常工作(包括如果未设置“continue”选项,则结束路由匹配过程)mute_time_intervals:[ - <string> ...]# 路由应处于活动状态的时间。它们必须与全局设置 "time_intervals" 字段中定义的时间间隔的名称相匹配。# 空值表示路线始终处于活动状态。 此外,根节点不能有任何 active times。# 路由将仅在活动时发送通知,但在其他情况下正常运行(包括如果未设置 "continue" 选项,则结束路由匹配过程)。active_time_intervals:[ - <string> ...]# 以上所有属性都由所有子路由继承,并且可以在每个路由上覆盖。# 一个或者更多子路由routers:[ - <router> ...]
标签匹配器 matcher
标签匹配器是用在 routes and inhibition rules 之间进行警报的匹配。
也就是使用标签匹配器配置了匹配的规则,如果哪个警报中所包含的标签和匹配的规则相符合,就代表此警报是要处理的警报,如果某个 子路由中使用此 匹配器,那就是此子路由要处理这个警报,如果某个 inhibition rules 中使用了此匹配器,那就是这个 inhibition rules 处理此警报。
匹配器是一个字符串,具体语法由三个标记组成:
- 有效的标签名
=, !=, =~, or !~
中其中的一个运算符。=~
和!~
用于正则表达式的 匹配和不匹配。- 运算符后面是 UTF-8字符串,可以用双引号括起来。在每个标记之前或之后,可能存在任意数量的空白。
运算符右边的内容可以是空字符串,支持反斜杠转义规则。
当有多个匹配器规则时候,他们的书写语法是将每一个规则放在一个 yaml 语法的列表中,它们之间的关系是 and。这意味着在针对给定警报上的标签进行测试时,匹配器的所有规则评估结果必须为“true”。例如,具有以下标签的警报:
{"project":"beijing","service":"mysql"}
必须使用如下匹配器规则进行匹配
route:routers:- matchers:- project = beijing- service = mysql
下面使用正则表达式的匹配规则也是可以的
route:routers:- matchers:- project = beijing- service =~ "mysql|postgresql"
当然将上述匹配规则写成一行,使用 []
进行包裹也是可以的。
route:routers:- matchers:[project = beijing, service =~ "mysql|postgresql"]
将匹配规则内层在包上一层大括号也是支持的。
route:routers:- matchers:['{project=beijing, service=~ "mysql|postgresql"}']
routers
子路由配置
# 具体的一个一个的子路由树.routes:# 此子路由使用正则表达式进行匹配,凡是警报的标签 service 的值是 foo1 或者 foo2 或者 baz 的警报就会# 走这个子路由- matchers:- service = ^(foo1|foo2|baz)$# 凡是走这个子路由的警报,使用如下的接收器接收警报信息, team-X-mails 是在全局中的 receivers 配置块中定义的# 一个接收器名称。 receiver: team-X-mails# 子路由中可以嵌套一个或者多个子路由# 当这个子路由中出现包含并且匹配标签 "severity" 的值是 "critical" 的,# 将警报信息从 "team-X-pager" 接收器发送出去。# 否则还是返回给父级路由中定义的接收器 "team-X-mails" 发送警报。routes:- matchers:- severity = criticalreceiver: team-X-pager- matchers:- service = filesreceiver: team-Y-mails# 同样这个是在符合 "service" 的值是 "files" 中的警报中,再挑选出配置 "severity: critical" 的警报# 从接收器 team-Y-pager 发送警报信息。否则继续返回给父级定义的接收器 team-Y-mails 发送出去警报信息。routes:- matchers:- severity = criticalreceiver: team-Y-pager# This route handles all alerts coming from a database service. If there's# no team to handle it, it defaults to the DB team.- matchers:- service = databasereceiver: team-DB-pager# Also group alerts by affected database.group_by: [alertname, cluster, database]routes:- matchers:- owner = team-Xreceiver: team-X-pager- matchers:- owner = team-Yreceiver: team-Y-pager
示例:
#根路具有的所有参数,如果子路由中未设置这些参数,则这些参数将由子路由继承。
route:group_wait: 30sgroup_interval: 5mrepeat_interval: 4hgroup_by: [cluster, alertname]receiver: 'default-receiver'# 所有与以下子路由不匹配的警报都将保留在根节点上,并使用接收器 "default-receiver" 发送警报信息。routes:# 所有service=mysql或service=casandra的警报都使用接收器 "database-pager" 发送警报信息- receiver: 'database-pager'group_wait: 10smatchers:- service=~"mysql|cassandra"#所有带有 team="frontend" 标签的警报都匹配此子路由.# 它们按 product 和 environment 分组,而不是按根路由中定义的 cluster 和 alertname 分组。# 并使用接收器 "frontend-pager" 发送警报信息。- receiver: 'frontend-pager'group_by: [product, environment]matchers:- team="frontend"# 所有带有service=inhouse服务标签的警报都与此子路由匹配。# 该路线将在下班时间和节假日期间静音。# 即使匹配,它也将继续到下一个子路线- receiver: 'dev-pager'matchers:- service="inhouse-service"mute_time_intervals:- offhours- holidayscontinue: true# 所有带有 service=inhouse-service 标签的警报都与此子路由匹配# 该路由将仅在非工作时间和节假日期间有效。- receiver: 'on-call-pager'matchers:- service="inhouse-service"active_time_intervals:- offhours- holidays
1.5 抑制相关配置 Inhibition
这允许在系统或服务之间建立依赖关系,以便在中断期间,仅发送一组互连警报中最相关的警报。
例如,一台服务器网络中断,同时也配置的这台服务器上的相关服务的状态检查等警报,那只需要发送此服务器网络中断的警报即可,服务器上的服务的状态告警可以被处理为 静音,因为服务器上的服务状态的检查依赖此服务器的网络。
<inhibit_rules>
抑制规则允许在一个或多个匹配了 source_matchers 定义的匹配规则的警报正在触发的情况下,使一组匹配了 target_matchers 定义的匹配规则的警报静默。
从语义上讲,缺失的标签和值为空的标签是一回事。因此,如果源警报和目标警报中都缺少以等号列出的所有标签名称,则将应用禁止规则。
为了防止警报抑制自身,与规则的目标端和源端匹配的警报不能被相同情况的警报(包括自身)抑制。但是,我们建议选择目标和源匹配器,以使警报永远不会同时匹配双方。它更容易推理,而且不会引发这种特殊情况。
# 使抑制生效的匹配规则。
# 至少需要有一个警报完全匹配如下列表中的匹配规则,抑制才会生效。
source_matchers:[ - <matcher> ... ]
# 同时满足的如下列表中匹配规则的所有警报将会被静音。
target_matchers:[ - <matcher> ... ]# 匹配 source_matchers 的源警报和匹配 target_matchers 的目标警报中,它们的标签名必须都含有 equal 值中的标签名,且标签值必须相等,才会使抑制生效。
[ equal: '[' <labelname>, ... ']' ]
示例
#如果同一警报的级别已经是严重级别,我们将任何 warning 级别的通知都设为静默。
inhibit_rules:
- source_matchers:- severity="critical"target_matchers:- severity="warning"# 如果警报名称相同,则应用抑制。# 注意:# 如果源警报和目标警报中都缺少“equal”中列出的所有标签名称,则将应用抑制规则!equal: ['alertname']
2 静默配置
静默是可以让一个或多个警报在指定的某个时间段进入静默状态。
适用于(单不限于)如下场景:
- 升级服务时候,对所要升级的服务设置在升级的时间段不发送警报通知。
- 在服务迁移的时候,对涉及到的服务在迁移的时间段不发送警报通知。
- ① 点击日历图标,选择开始时间和结束时间
- ② Matchers 中填写的是匹配标签的规则,值需要使用双引号引起来
- ③ Creater 填写创建者,可以任意写
- ④ 点击
+
进行添加,可以多次添加 - ⑤ Comment 填写关于这个静默的说明文字
- ⑥ 最后点击 Create
添加之后,再次点击 Silences 会看到所有的 静默列表。
相关文章:
Prometheus-Alertmanager 警报管理器-部署和设置
文章目录 一、介绍二、核心概念1 Grouping 分组2 Inhibition 抑制3 Silences 静默(静音)5 High Availability 高可用性 三、部署1 二进制方式下载配置 systemd 2 docker-compose 方式 四、配置1 配置文件介绍1.1 全局配置1.2 receiver 接收器标准接收器相…...
恒运资本:小盘股的优点?投资小盘股要注意哪些方面?
股市是一个充溢时机和危险的当地,不同出资者有不同的偏好,有的人喜爱追逐大盘蓝筹股,有的人则钟情于小盘股。那么小盘股的长处?出资小盘股要注意哪些方面?恒运资本也为我们准备了相关内容,以供参考。 小盘股…...
LeetCode:2. 两数之和
这个解题思路来自代码随想录:代码随想录 (programmercarl.com) class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {std::unordered_map <int,int> map;for(int i 0; i < nums.size(); i) {// 遍历当前元素&am…...
OpenCV(二十四):可分离滤波
目录 1.可分离滤波的原理 2.可分离滤波函数sepFilter2D() 3.示例代码 1.可分离滤波的原理 可分离滤波的原理基于滤波器的可分离性。对于一个二维滤波器,如果它可以表示为水平方向和垂直方向两个一维滤波器的卷积,那么它就是可分离的。也就是说&#x…...
【JS进阶】防抖与节流
防抖与节流 1.防抖 1.1 为什么要防抖? 在项目中,有的操作是高频触发的,但是其实触发一次就好了,比如我们短时间内多次缩放页面,那么我们不应该每次缩放都去执行操作,应该只做一次就好。再比如说监听输入…...
【css】linear-gradient()的用法
linear-gradient() CSS函数创建一个由两种或多种颜色沿一条直线进行线性过渡的图像,其结果是<gradient>数据类型的对象,此对象是一种特殊的<image> 数据类型。 语法 /* 渐变轴为 45 度,从蓝色渐变到红色 */ linear-gradient(45deg, blue, red);/* 从右…...
java: 读取snakeyaml-1.26.jar各种jar包时出错; error in opening zip file
可能的问题 jar有问题idea没有权限等等其他问题。但执行后报错就是读取不了,还报error in opening zip file这个错。 解决问题 我的错就是jar包有问题。我先后进行了很多次把jar包位置里的东西全部删除,然后重新maven下载但是不管用。最后从网站上下载…...
医疗知识图谱 neo4j
开源项目: https://github.com/liuhuanyong/QASystemOnMedicalKG 一.效果 二.需要安装: pip install pyahocorasick pip install py2neo 三.需要修改: 需要改的点: 1.改连接的方式 2.改读文件的方式 MedicalGraph 运行&am…...
【LeetCode-简单题】367. 有效的完全平方数
文章目录 题目方法一:二分查找 题目 方法一:二分查找 找 1 - num 之间的 mid, 开方是整数 就找得到 mid, 不是整数自然找不到mid class Solution { // 二分查找 ;找 1 - num 之间的mid 开方是整数 就找得到 不是…...
vben-admin中渲染table表格时怎么处理不同的数据结构
最近在用vben admin开发后台管理系统,vben admin这个后管端框架封装的非常细,颗粒度非常细,如果了解里面的组件或者api用法,那开发起来非常快。如果不了解,那就非常痛苦了,目前关于vben admin这块的开发问题…...
从零开始在树莓派上搭建WordPress博客网站并实现公网访问
文章目录 序幕概述1. 安装 PHP2. 安装MySQL数据库3. 安装 Wordpress4. 设置您的 WordPress 数据库设置 MySQL/MariaDB创建 WordPress 数据库 5. WordPress configuration6. 将WordPress站点发布到公网安装相对URL插件修改config.php配置 7. 支持好友链接样式8. 定制主题 序幕 …...
Go基础18-理解方法的本质以选择正确的receiver类型
Go语言虽然不支持经典的面向对象语法元素,比如类、对象、继承等,但Go语言也有方法。和函数相比,Go语言中的方法在声明形式上仅仅多了一个参数,Go称之为receiver参数。receiver参数是方法与类型之间的纽带。 Go方法的一般声明形式…...
Go基础12-理解Go语言表达式的求值顺序
Go语言在变量声明、初始化以及赋值语句上相比其先祖C语言做了一些改进,诸如: ● 支持在同一行声明和初始化多个变量(不同类型也可以) var a, b, c 5, "hello", 3.45 a, b, c : 5, "hello", 3.45 // 短变量…...
OJ练习第165题——修车的最少时间
修车的最少时间 力扣链接:2594. 修车的最少时间 题目描述 给你一个整数数组 ranks ,表示一些机械工的 能力值 。ranksi 是第 i 位机械工的能力值。能力值为 r 的机械工可以在 r * n2 分钟内修好 n 辆车。 同时给你一个整数 cars ,表示总…...
纯前端实现 导入 与 导出 Excel
最近经常在做 不规则Excel的导入,或者一些普通Excel的导出,当前以上说的都是纯前端来实现;下面我们来聊聊经常用到的Excel导出与导入的实现方案,本文实现技术栈以 Vue2 JS 为例 导入分类: 调用 API 完全由后端来解析数…...
关于一次两段式提交和数据库恢复数据我的一些想法
binlog是服务层的功能,而redolog是innodb引擎的功能,binlog主要用于主从复制,redolog主要用做数据的恢复,我们必须保证binlog和redolog日志数据的一致性。恢复数据时也必须遵守此一致性。 1.如果只写一次redolog会出现什么问题&a…...
阿里巴巴springcloud的gateway网关如何用继承接口WebExceptionHandler定义一个json格式的404错误页面实例
如果你想通过实现 WebExceptionHandler 接口来定义一个返回 JSON 格式的 404 错误页面的实例,可以按照以下方式操作: import org.springframework.core.annotation.Order; import org.springframework.http.HttpStatus; import org.springframework.ster…...
『力扣每日一题07』字符串最后一个单词的长度
气死我啦,今天这道题花了快一个小时,我学完了答案的解法,放上去在线 OJ ,一直报错,找来找去都找不到自己错在哪,明明跟答案一模一样。后来还是学了另一种解法,才跑出来的(̥̥̥̥̥̥̥̥o̥̥…...
成都睿趣科技:抖音开店初期要注意什么
随着社交媒体和短视频平台的崛起,抖音已经成为了一个风靡全球的短视频应用,拥有着庞大的用户群体。因此,越来越多的创业者开始在抖音上开设自己的线上店铺,希望借助这个平台赚取丰厚的利润。然而,在抖音开店初期&#…...
QT 5.13保姆级安装教程
辨清关系 要想学习一个新的东西,我们必须知其事,达其理,悟其道,然后才能无往而不利也! 我们常听到QT、Qt Creator 和 Qt SDK ,这三者究竟是什么,他们之间的关系又是如何的?在安装QT之前我们先来了解一下他们之间的关系: Qt:Qt 是一个跨平台的 C++ 应用程序开发框架,…...
js 创建DOM,并添加父DOM上,移除某个DOM的所有子节点
在sectionIdDiv上,添加子DOM <div ref"sectionIdDiv" class"sectionIdDiv"> </div>创建你要添加的子DOM ## 创建DOM let elementDom document.createElement(div)## 设置DOM的样式 elementDom.style.height "15px" e…...
element el-input 二次封装
说明:为实现输入限制,不可输入空格,长度限制。 inputView.vue <template><!-- 输入框 --><el-input:type"type":placeholder"placeholder"v-model"input"input"inputChange":maxle…...
[源码系列:手写spring] IOC第十三节:Bean作用域,增加prototype的支持
为了帮助大家更深入的理解bean的作用域,特意将BeanDefinition的双例支持留到本章节中,创建Bean,相关Reader读取等逻辑都有所改动。 内容介绍 在Spring中,Bean的作用域(Scope)定义了Bean的生命周期和可见性。包括单例和…...
【性能优化】事件委托
一、为什么要用事件委托 当 dom 有事件处理程序时,我们一般都会直接给它设置事件处理程序,设想一下,如果在一个父元素中有很多个 dom 需要添加事件处理呢?比如 ul 中处在100个 li,每个 li 都有相同的 click 事件&…...
C 风格文件输入/输出---无格式输入/输出---(std::fputc,std::putc,std::fputs)
C 标准库的 C I/O 子集实现 C 风格流输入/输出操作。 <cstdio> 头文件提供通用文件支持并提供有窄和多字节字符输入/输出能力的函数,而 <cwchar>头文件提供有宽字符输入/输出能力的函数。 无格式输入/输出 写字符到文件流 std::fputc, std::putc in…...
建议收藏!Harmony应用配置文件概述(Stage模型)
一. 应用配置文件 每个应用项目必须在项目的代码目录下加入配置文件,这些配置文件会向编译工具、操作系统和应用市场提供应用的基本信息。 在基于Stage模型开发的应用项目代码下,都存在一个app.json5及一个或多个module.json5这两种配置文件。 app.json5…...
金蝶云星空和四化智造MES(WEB)单据接口对接
金蝶云星空和四化智造MES(WEB)单据接口对接 接入系统:四化智造MES(WEB) MES建立统一平台上通过物料防错防错、流程防错、生产统计、异常处理、信息采集和全流程追溯等精益生产和精细化管理,帮助企业合理安排…...
Shell命令切换root用户、管理配置文件、检查硬件
Shell命令切换root用户、管理配置文件、检查硬件 切换root用户 两种方法 su命令详细介绍 sudo命令详细介绍 /etc/passwd文件 /etc/passwd文件里为什么有乱七八糟的用户? /etc/shadow文件 管理配置文件 检查硬件命令 查看CPU 查看GPU 与其他基于UNIX的系统…...
DataX(MySQL同步数据到Doris)
1.场景 这里演示介绍的使用 Doris 的 Datax 扩展 DorisWriter实现从Mysql数据定时抽取数据导入到Doris数仓表里 2.编译 DorisWriter 这个的扩展的编译可以不在 doris 的 docker 编译环境下进行,本文是在 windows 下的 WLS 下进行编译的 首先从github上拉取源码 …...
sql server服务无法启动怎么办?如何正常启动?
sql server软件是一款关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点。并且有些应用软件使用过程中是需要sql server数据库的后台支持的,我们在数据编程操作时经常会使用这款编程软件,在编程时系统有时会提示sql server服务无…...
南水北调建设管理局网站/seo电商运营是什么意思
曾有人问我,为什么要去干解析 dex 文件这种麻烦的事?我想说的是写个解析脚本不是为了模仿着 apktools 造轮子,而是在解析过程中寻找逆向的道路,方法会变,工具会变,但一切都建立在 dex 上的安卓不会变一、什么是 Dex 文…...
医疗网站建设/平谷头条新闻
咳咳,上课。 起立。 老师再见。??? 你们就这么希望老师走吗。。。。 好了,同学们,今天这节课给大家介绍一下设计模式的一种——模板方法设计模式。 那么什么是模板方法设计模式呢? 当功能内部…...
19手机网站/seo外包优化
回望2020 2020年第一天。2020年第一个月。2020年第一季度。十一,国庆。现在,2021.1.12020年第一天。 今天是2020年的第一天,昨晚我刚刚经历了一场紧张刺激且尴尬的转正答辩。我来到这家公司6个月了,说实话,我很不开心。昨晚的答辩是我们的部门大boss亲自坐镇,我看得出来…...
佛山微网站建设哪家专业/本地建站软件有哪些
在java1996年发布,当年12月即发布了java bean1.00-A,有什么用呢?通过统一的规范可以设置对象的值(get,set方法),这是最初的java bean;在实际企业开发中,需要实现事务,安全,分布式,javabean就不好用了.sun公司就开始往上面堆功能,这里java bean就复杂为EJB;EJB功能强大,但是太重…...
网站建设的关键点/seo免费入门教程
产品合格证标签是产品生产出售过程中的一个重要的标牌,产品合格证的外观有很多种,方形合格证,圆形合格证,三角形合格证,那么这些各种各样的合格证标签是怎么制作出来的呢?下面以三角形合格证为例子教大家如…...
创建网站建设/免费网站推广网站在线
面对这种问题,大家应该都有这样的疑惑,我全部都是byte类型的数据,而且两个相加也并没超过byte类型的表示范围,但是为什么会报错Type mismatch: cannot convert from int to byte? 接下来为大家解惑: n,m,…...