在上一篇我们已经部署了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腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!