Prometheus监控规则与告警实践

2023-11-21 23:43:38 浏览数 (3)

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

配置告警规则

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

代码语言:javascript复制
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"
代码语言:javascript复制
    可以把告警规则文件拆分,然后在prometheus.yml 中引用。我们把监控文件命名为 five_minute_node_exporter.yml,修改配置文件
代码语言:javascript复制
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
   - "five_minute_node_exporter.yml"

编写告警规则

我们先看下告警规则模版

代码语言:javascript复制
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
代码语言:javascript复制
    在告警规则模版中,可以将相关的规则设置在一个groups下面,一个groups可以定义多个告警规则。alert:告警规则的名称。
代码语言:javascript复制
expr:基于PromQL表达式告警触发条件,用于计算是否有时间序列满足该条件。
for:评估等待时间,可选参数。用于表示只有当触发条件持续一段时间后才发送告警。在等待期间新产生告警的状态为pending。
labels:自定义标签,允许用户指定要附加到告警上的一组附加标签。
annotations:用于指定一组附加信息,比如用于描述告警详细信息的文字等,annotations的内容在告警产生时会一同作为参数发送到Alertmanager。

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

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

代码语言:javascript复制
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 重新加载配置文件

代码语言:javascript复制
systemctl reload prometheus.service

查看Alerts监控规则与数据

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

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

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

AlertManager 部署

解压安装

代码语言:javascript复制
tar zvxf alertmanager-0.25.0.linux-amd64.tar.gz
mkdir /data/alertmanager
cp -arp alertmanager-0.25.0.linux-amd64/* /data/alertmanager
chown -R prometheus:prometheus  /data/alertmanager

添加systemctl 管理cat <<EOF >/etc/systemd/system/alertmanager.service

代码语言:javascript复制
[Unit]
Description="alertmanager"
After=network.target
[Service]
Type=simple
User=prometheus
ExecStart=/data/alertmanager/alertmanager
WorkingDirectory=/data/alertmanager
Restart=on-failure
SuccessExitStatus=0
LimitNOFILE=65536
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=alertmanager
[Install]
WantedBy=multi-user.target
EOF

加载启动

代码语言:javascript复制
​​​​​​​
systemctl daemon-reload
systemctl start alertmanager.service
systemctl status alertmanager.service

访问默认的9093端口

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

代码语言:javascript复制
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)进入路由树,根据路由规则将告警信息发送给相应的接收器。

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

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

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

设置告警发送的配置

代码语言:javascript复制
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 配置

代码语言:javascript复制
​​​​​​​
# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
           - 127.0.0.1:9093

重新加载

代码语言:javascript复制
​​​​​​​
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 部署

下载

代码语言:javascript复制
wget https://dl.grafana.com/oss/release/grafana-9.4.1.linux-amd64.tar.gz
tar zvxf grafana-9.4.1.linux-amd64.tar.gz
mkdir /data/grafana
cp -arp grafana-9.4.1/*  /data/grafana/

接入systemctl 管理

代码语言:javascript复制
​​​​​​​
cat <<EOF >/etc/systemd/system/grafana.service
[Unit]
Description=Grafana
After=network.target
[Service]
ExecStart=/data/grafana//bin/grafana-server 
 --config=/data/grafana//conf/defaults.ini 
 --homepath=/data/grafana/
[Install]
WantedBy=multi-user.target
EOF
代码语言:javascript复制
加载与启动
代码语言:javascript复制
systemctl daemon-reload
systemctl enable grafana.service
systemctl start  grafana.service
systemctl status  grafana.service
代码语言:javascript复制
    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等的知识

可以查看原文:

https://mp.weixin.qq.com/s/gCFVBKVLIcJwBcvBNSaf2g

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞