官方文档地址: ALERTING RULES
Prometheus-Operator API文档地址: Prometheus Operator API
Prometheus 告警规则允许我们使用 Prometheus 表达式语言 PromQL 定义告警条件,并在触发告警时发送通知给外部的接收者。
要使告警规则生效,需要再 Prometheus 的配置文件中添加以下内容:
1 | rule_files: |
PrometheusRule
PrometheusRule 是 Prometheus Operator 自定义的一种 Kubernetes 资源类型,用来定义 Prometheus 的告警规则。
可以通过以下命令查看 Prometheus Stack 默认配置好的告警策略:
1
2
3
4
5
6
7
8
9# kubectl get prometheusrules -n monitoring
NAME AGE
alertmanager-main-rules 19d
kube-prometheus-rules 19d
kube-state-metrics-rules 19d
kubernetes-monitoring-rules 19d
node-exporter-rules 19d
prometheus-k8s-prometheus-rules 19d
prometheus-operator-rules 19d也可以通过添加 -oyaml 参数查看某个 rule 的详细配置
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
33
34
35
36
37
38
39
40# kubectl get prometheusrules -n monitoring node-exporter-rules -oyaml
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
creationTimestamp: "2021-09-23T08:22:11Z"
generation: 1
labels:
app.kubernetes.io/component: exporter
app.kubernetes.io/name: node-exporter
app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: 1.2.2
prometheus: k8s
role: alert-rules
name: node-exporter-rules
namespace: monitoring
resourceVersion: "16163"
uid: 3c8cc99a-1cba-4038-be5f-1cc8c49af8e2
spec:
groups:
- name: node-exporter
rules:
- alert: NodeFilesystemSpaceFillingUp
annotations:
description: Filesystem on {{ $labels.device }} at {{ $labels.instance }}
has only {{ printf "%.2f" $value }}% available space left and is filling
up.
runbook_url: https://runbooks.prometheus-operator.dev/runbooks/node/nodefilesystemspacefillingup
summary: Filesystem is predicted to run out of space within the next 24 hours.
expr: |
(
node_filesystem_avail_bytes{job="node-exporter",fstype!=""} / node_filesystem_size_bytes{job="node-exporter",fstype!=""} * 100 < 40
and
predict_linear(node_filesystem_avail_bytes{job="node-exporter",fstype!=""}[6h], 24*60*60) < 0
and
node_filesystem_readonly{job="node-exporter",fstype!=""} == 0
)
for: 1h
labels:
severity: warning
... 省略 N 行 ...spec.groups 下面的代码块就是告警规则的相关配置,以上代码包含一条告警策略的完整内容,其中:
- alert: 告警策略的名称;
- annotations: 告警注释信息,一般写告警信息;
- description: 告警的描述信息
- summary: 告警摘要信息
- runbook_url: 告警信息的详细描述地址,可以不写,可以参考地址 kube-prometheus runbooks
- expr: 告警表达式;
- for: 评估等待时间,告警持续多久才会发送告警数据;
- labels: 告警的标签,用于告警的路由使用
配置自定义告警策略
假设需要对域名访问延迟进行监控,将访问延迟大于1秒的进行告警,此时可以创建一个 PrometheusRule,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
labels:
app.kubernetes.io/component: exporter
app.kubernetes.io/name: blackbox-exporter
prometheus: k8s # 用户告警规则的自动发现标签,如果不写可能会无法发现该规则;kube-prometheus/manifests/prometheus-prometheus.yaml 文件中的 ruleSelector 选择器配置相关
role: alert-rules # 用于告警规则的自动发现标签,如果不写可能会无法发现该规则;kube-prometheus/manifests/prometheus-prometheus.yaml 文件中的 ruleSelector 选择器配置相关
name: blackbox
namespace: monitoring
spec:
groups: # 对告警规则进行分组
- name: blackbox-exporter # 分组名称
rules: # 分组里面的告警规则
- alert: DomainAccessDelayExceeds1s # 告警策略名称
annotations: # 告警信息注释
description: 域名:{{ $labels.instance }} 探测延迟大于1秒,当前延迟为:{{ $value }} # 告警描述
summary: 域名探测,访问延迟超过1秒 # 告警摘要
expr: sum(probe_http_duration_seconds{job=~"blackbox"}) by (instance) > 1 # 告警表达式
for: 1m # 评估等待时间
labels: # 告警路由标签
severity: warning
type: blackbox创建并查看该 PrometheusRule
1
2
3
4
5
6# kubectl create -f blackbox-domain-monitor.yaml
prometheusrule.monitoring.coreos.com/blackbox created
# kubectl get prometheusrule -n monitoring blackbox
NAME AGE
blackbox 42s在 Prometheus 的 Web UI 界面查看规则
如果探测延迟有超过 1s 的域名,就会触发告警,为了演示效果,这里将告警规则触发条件改成 0.5s,如图所示: