在上一篇我们已经部署了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: examplerules:alert: HighErrorRate#指标需要在触发告警之前的10分钟内大于0.5。expr: job:request_latency_seconds:mean5m{job="myjob"} > 0.5for: 10mlabels:severity: pageannotations:summary: High request latencydescription: description info
在告警规则模版中,可以将相关的规则设置在一个groups下面,一个groups可以定义多个告警规则。
alert:告警规则的名称。expr:基于PromQL表达式告警触发条件,用于计算是否有时间序列满足该条件。for:评估等待时间,可选参数。用于表示只有当触发条件持续一段时间后才发送告警。在等待期间新产生告警的状态为pending。labels:自定义标签,允许用户指定要附加到告警上的一组附加标签。annotations:用于指定一组附加信息,比如用于描述告警详细信息的文字等,annotations的内容在告警产生时会一同作为参数发送到Alertmanager。
配置完规则之后,Prometheus server 会有一个规则管理器进行扫描。规则管理器会根据配置的规则,基于规则PromQL表达式告警的触发条件,用于计算是否有时间序列满足该条件
下面我们实际配置两个告警规则实践下
groups:name: five_minute_node_exporterrules:#监控node-exporter进程状态alert: HostDownexpr: up{job="node_exporter"} == 0for: 1mlabels:severity: criticalannotations:summary: Host down {{ $labels.instance }}#监控内存使用率alert: MemUtilexpr: 100 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 > 1for: 1mlabels:severity: warnannotations: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/alertmanagerRestart=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: 5mroute:group_by: ['alertname']group_wait: 10sgroup_interval: 10srepeat_interval: 1hreceiver: '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_from: 'five_minuite_sre@163.com'smtp_smarthost: 'smtp.163.com:465'smtp_auth_username: 'five_minuite_sre@163.com'smtp_require_tls: falseroute:group_by: ['alertname']group_wait: 30sgroup_interval: 1mrepeat_interval: 1hreceiver: 'email'receivers:- 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:severity: 'critical'target_match:severity: 'warning'equal: ['alertname', 'dev', 'instance']
修改prometheus 配置
# Alertmanager configurationalerting:alertmanagers:- static_configs:- targets:- 127.0.0.1:9093
重新加载
systemctl reload prometheus.servicecd /data/alertmanagercheck-config alertmanager.ymlcurl -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等的知识