Prometheus监控规则与告警实践


在上一篇我们已经部署了Prometheus server 与note-exporter 实现数据采集与查看,这个篇章主要实践Prometheus 的监控配置,AlertManager与Grafana的部署与监控实战,学习完基本入门了企业级监控系统的实践。

配置告警规则

    有了上一个篇博文(prometheus部署与体验)的数据之后我们就可以进入告警规则的学习了。Prometheus 进程内置了告警判断引擎,prometheus.yml 中可以指定告警规则配置文件。

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.rule_files:  # - "first_rules.yml"  # - "second_rules.yml"

    可以把告警规则文件拆分,然后在prometheus.yml 中引用。我们把监控文件命名为 five_minute_node_exporter.yml,修改配置文件

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.rule_files:   - "five_minute_node_exporter.yml"

编写告警规则

我们先看下告警规则模版

groups:- name: example  rules:  - alert: HighErrorRate    #指标需要在触发告警之前的10分钟内大于0.5。    expr: job:request_latency_seconds:mean5m{job="myjob"} > 0.5    for: 10m    labels:      severity: page    annotations:      summary: High request latency      description: description info
    在告警规则模版中,可以将相关的规则设置在一个groups下面,一个groups可以定义多个告警规则。
alert:告警规则的名称。expr:基于PromQL表达式告警触发条件,用于计算是否有时间序列满足该条件。for:评估等待时间,可选参数。用于表示只有当触发条件持续一段时间后才发送告警。在等待期间新产生告警的状态为pending。labels:自定义标签,允许用户指定要附加到告警上的一组附加标签。annotations:用于指定一组附加信息,比如用于描述告警详细信息的文字等,annotations的内容在告警产生时会一同作为参数发送到Alertmanager。


    配置完规则之后,Prometheus server 会有一个规则管理器进行扫描。规则管理器会根据配置的规则,基于规则PromQL表达式告警的触发条件,用于计算是否有时间序列满足该条件

下面我们实际配置两个告警规则实践下


groups:- name: five_minute_node_exporter  rules:  #监控node-exporter进程状态  - alert: HostDown    expr: up{job="node_exporter"} == 0    for: 1m    labels:      severity: critical    annotations:      summary: Host down {{ $labels.instance }}  #监控内存使用率  - alert: MemUtil    expr: 100 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 > 1    for: 1m    labels:      severity: warn    annotations:      summary: Mem usage larger than 1%, instance:{{ $labels.instance }}

reload prometheus 重新加载配置文件

systemctl reload prometheus.service

查看Alerts监控规则与数据


告警分成 3 个状态,Inactive、Pending、Firing

Inactive:非活动状态,表示正在监控,但是还未有任何警报触发 ,正是HostDown规则的状态。Pending:表示这个警报必须被触发。由于警报可以被分组、压抑/抑制或静默/静音,所以等待验证,一旦所有的验证都通过,则将转到 Firing 状态。比如MemUtil 规则 设置for 1m,表示触发规则连续一分钟才会告警,我们在prometheus.yml 设置了evaluation_interval: 15s ,执行频率为15s 得连续4次都触发阈值才告警。Firing:将警报发送到 AlertManager,它将按照配置将警报的发送给所有接收者。一旦警报解除,则将状态转到 Inactive,如此循环。

通过告警配置我们可以看到告警数据,不过告警信息的外发通知就需要依赖另外一个组件:AlertManager

AlertManager 部署


解压安装

tar zvxf alertmanager-0.25.0.linux-amd64.tar.gzmkdir /data/alertmanagercp -arp alertmanager-0.25.0.linux-amd64/* /data/alertmanagerchown -R prometheus:prometheus  /data/alertmanager

添加systemctl 管理

cat </etc/systemd/system/alertmanager.service[Unit]Description="alertmanager"After=network.target
[Service]Type=simpleUser=prometheusExecStart=/data/alertmanager/alertmanagerWorkingDirectory=/data/alertmanager
Restart=on-failureSuccessExitStatus=0LimitNOFILE=65536StandardOutput=syslogStandardError=syslogSyslogIdentifier=alertmanager

[Install]WantedBy=multi-user.targetEOF

加载启动

systemctl daemon-reloadsystemctl start alertmanager.servicesystemctl status alertmanager.service

访问默认的9093端口

    Alertmanager 会读取二进制同级目录下的 alertmanager.yml 配置文件,默认的alertmanager.yml配置

global:  resolve_timeout: 5m
route: group_by: ['alertname'] group_wait: 10s group_interval: 10s repeat_interval: 1h receiver: 'web.hook'receivers:- name: 'web.hook' webhook_configs: - url: 'http://127.0.0.1:5001/'inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance']

Alertmanager的配置主要包含两个部分:路由(route)以及接收器(receivers)。所有的告警信息都会从配置中的顶级路由(route)进入路由树,根据路由规则将告警信息发送给相应的接收器。

全局配置(global):用于定义一些全局的公共参数,如全局的SMTP配置,Slack配置等内容;模板(templates):用于定义告警通知时的模板,如HTML模板,邮件模板等;告警路由(route):根据标签匹配,确定当前告警应该如何处理;接收人(receivers):接收人是一个抽象的概念,它可以是一个邮箱也可以是微信,Slack或者Webhook等,接收人一般配合告警路由使用;抑制规则(inhibit_rules):合理设置抑制规则可以减少垃圾告警的产生

我们可以定义一组接收器,比如可以按照角色(比如SRE,DBA)来划分多个接收器。接收器可以关联邮件,微信以及其它方式接收告警信息。

在配置文件中使用route定义了顶级的路由,路由是一个基于标签匹配规则的树状结构。所有的告警信息从顶级路由开始,根据标签匹配规则进入到不同的子路由,并且根据子路由设置的接收器发送告警。目前配置文件中只设置了一个顶级路由route并且定义的接收器为default-receiver。因此,所有的告警都会发送给default-receiver

设置告警发送的配置


global:#设置一个全局 SMTP  smtp_from: 'five_minuite_sre@163.com'  smtp_smarthost: 'smtp.163.com:465'  smtp_auth_username: 'five_minuite_sre@163.com'  #smtp_auth_password: '授权码  smtp_require_tls: false  # 路由分组route:  group_by: ['alertname']  group_wait: 30s # 在组内等待所配置的时间,如果同组内,30秒内出现相同报警,在一个组内出现。  group_interval: 1m # 如果组内内容不变化,合并为一条警报信息,5m后发送。  repeat_interval: 1h # 发送报警间隔,如果指定时间内没有修复,则重新发送报警  receiver: 'email'
receivers:# ops分组的定义 - name: 'web.hook' webhook_configs: - url: 'http://127.0.0.1:5001/'
- name: 'email' email_configs: - to: 'five_minuite_sre@163.com'# 抑制器配置inhibit_rules: # 抑制规则 - source_match: # 源标签警报触发时抑制含有目标标签的警报,在当前警报匹配 status: 'critical' severity: 'critical' target_match: severity: 'warning' # 目标标签值正则匹配,可以是正则表达式如: ".*MySQL.*" equal: ['alertname', 'dev', 'instance'] # 确保这个配置下的标签内容相同才会抑制,也就是说警报中必须有这三个标签值才会被抑制。

修改prometheus 配置

# Alertmanager configurationalerting:  alertmanagers:    - static_configs:        - targets:           - 127.0.0.1:9093

重新加载

 
systemctl reload prometheus.service cd /data/alertmanager ./amtool check-config alertmanager.yml  curl -X POST http://localhost:9093/-/reload

可以在web 页面跟邮箱收到告警信息




alertmanger dashboard

    这个时候我们已经打通了prometheus server 与alertmanager 监控的链路,可以根据需求配置监控,跟告警接收人了。因为prometheus自带的指标图使用起来很不友好跟学习成本也大,这个时候我们就需要引入另外一个主角:Grafana。

Grafana 部署

下载

wget https://dl.grafana.com/oss/release/grafana-9.4.1.linux-amd64.tar.gztar zvxf grafana-9.4.1.linux-amd64.tar.gzmkdir /data/grafanacp -arp grafana-9.4.1/*  /data/grafana/

接入systemctl 管理


cat </etc/systemd/system/grafana.service[Unit]Description=GrafanaAfter=network.target
[Service]ExecStart=/data/grafana//bin/grafana-server \ --config=/data/grafana//conf/defaults.ini \ --homepath=/data/grafana/
[Install]WantedBy=multi-user.targetEOF
加载与启动
systemctl daemon-reloadsystemctl enable grafana.servicesystemctl start  grafana.servicesystemctl status  grafana.service
    Grafana 默认的监听端口是 3000,访问后就可以看到登录页面了,默认的用户名和密码都是 admin。

直接带端口访问

    先进行配置数据源,在菜单位置:Configuration -> Data sources,点击 Add data source 就能进入数据源类型选择页面,选择 Prometheus,填写 Prometheus 的链接信息,主要是 URL,点击 Save & test 完成数据源配置。

这个是我们配置的datasource,可以在这里直接查询

或者创建可视化面板



也可以直接从模版导入


从granafa官网获取模版的json

https://grafana.com/grafana/dashboards/1860-node-exporter-full/

最终效果


    到这里我们基本就搭建完成了一个企业级的监控与可视化系统了,当然还需要很多知识的补充与优化,我们会在后面的文章深入探索prometheus 的使用,监控,策略,面板,PromQL等的知识

请使用浏览器的分享功能分享到微信等