主机角色 | 系统版本 | IP地址 | 备注 |
Prometheus Server Grafana Server Alertmanager | CentOS7.6 | 172.27.30.94 | Prometheus服务器 Alertmanager服务 |
node_exporter | CentOS7.6 | 172.27.30.92 | 被监控主机 |
node_exporter | CentOS7.6 | 172.27.30.85 | 被监控主机 |
- ###下载安装包
- [root@test tmp]# wget https://github.com/prometheus/prometheus/releases/download/v2.35.0-rc0/prometheus-2.35.0-rc0.linux-amd64.tar.gz[root@test tmp][root@test tmp]
- ###解压安装包
- [root@test tmp]# tar xvf prometheus-2.35.0-rc1.linux-amd64.tar.gz -C /home/
- [root@test home]# mv prometheus-2.35.0-rc1.linux-amd64 prometheus
-
- ###运行Prometheus
- #第一种方法,传统启动(更新配置需重启服务生效)
- [root@test prometheus]# ./prometheus --config.file=prometheus.yml
- #第二种方法,热加载配置(更新配置不需重启服务)
- [root@test prometheus]# ./prometheus --config.file=prometheus.yml --web.enable-lifecycle
- [root@test ~]# curl -X POST http://localhost:9090/-/reload //更新配置后可使用此命令热加载
-
- ###创建启动文件
- [root@test system]# vi /usr/lib/systemd/system/prometheus.service
- [Unit]
- Description=prometheus is service
-
- [Service]
- Type=simple
- ExecStart=/home/prometheus/prometheus --config.file=/home/prometheus/prometheus.yml --web.enable-lifecycle
- ExecReload=/bin/kill -HUP $MAINPID
- KillMode=process
- Restart=on-failure
- RestartSec=42s
-
- [Install]
- WantedBy=multi-user.target
- [root@test system]# systemctl daemon-reload
- ###启动服务
- [root@test system]# systemctl restart prometheus
- [root@test system]# systemctl enable prometheus
- ###防火墙开通9090端口
- [root@test ~]# firewall-cmd --permanent --add-port=9090/tcp
- [root@test ~]# firewall-cmd --reload
默认地址:http://172.27.30.94:9090/metrics
默认地址:http://172.27.30.94:9090/graph
- [root@test ~]# cat /home/prometheus/prometheus.yml
- # my global config
- global:
- scrape_interval: 15s # 默认15s 全局每次数据收集的间隔
- evaluation_interval: 15s # 规则扫描时间间隔是15秒,默认不填写是 1分钟
- #scrape_timeout: 5s #超时时间
- #external_labels: # 用于外部系统标签的,不是用于metrics(度量)数据
- # scrape_timeout is set to the global default (10s).
-
- # Alertmanager configuration
- alerting:
- alertmanagers:
- - static_configs:
- - targets:
- # - alertmanager:9093
-
- # Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
- rule_files:
- # - "first_rules.yml"
- # - "second_rules.yml"
-
- # A scrape configuration containing exactly one endpoint to scrape:
- # Here it's Prometheus itself.
- scrape_configs:
- # The job name is added as a label `job=
` to any timeseries scraped from this config. - - job_name: "prometheus" //任务目标名,可以理解成分组,每个分组包含具体的target组员
-
- # metrics_path defaults to '/metrics' //抓取路径,默认/metrics
- # scheme defaults to 'http'.
-
- static_configs:
- - targets: ["localhost:9090"]
- [root@test ~]#
global: 全局配置(如果有内部单独设定,会覆盖这个参数)
alerting: 告警插件定义。主要是指定prometheus将报警规则推送到指定的alertManager实例地址rule_files: 告警规则。 按照设定参数进行扫描加载,用于自定义报警规则,其报警媒介和route路由由alertmanager插件实现。
scrape_configs:采集配置。配置数据源,包含分组job_name以及具体target。又分为静态配置和服务发现。prometheus的数据采集通过此片段配置
remote_writer:指定后端的存储的写入地址
remote_reader:指定后端的存储的读取api地址。
Prometheus运行后会生成“data”目录,Prometheus内存和硬盘都是以为KB为单位分块存储的。
在Prometheus的世界中,无论是内存还是磁盘,它都是以1KB单位分成块来操作的。
整体流程是 抓取数据 -> 写到head chunk,写满1KB,就再生成新的块,完成的块,是不可再变更的 -> 根据配置文件的设置,有一部份chunk会被保留在内存里,按照LRU算法,定期将块写进磁盘文件内。
- [root@test prometheus]# tree /home/prometheus/data/
- /home/prometheus/data/
- ├── chunks_head
- │ └── 000001
- ├── queries.active
- └── wal
- ├── 00000000
- ├── 00000001
- └── 00000002
-
- 2 directories, 5 files
Node-exporter 可以采集机器(物理机、虚拟机、云主机)的监控指标数据,能够采集到的指标包括cpu、内存、磁盘、网络、文件数等信息。
- ###下载node_exporter包
- [root@node ~]#wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
- [root@node ~]# tar xvf node_exporter-1.3.1.linux-amd64.tar.gz -C /home/
- [root@node ~]# mv /home/node_exporter-1.3.1.linux-amd64 /home/node_exporter
- ###创建node_exporter启动文件
- [root@node ~]# vi /usr/lib/systemd/system/node_exporter.service
- [Unit]
- Description=prometheus node_exporter
-
- [Service]
- Type=simple
- ExecStart=/home/node_exporter/node_exporter
- ExecReload=/bin/kill -HUP $MAINPID
- KillMode=process
- Restart=on-failure
- RestartSec=42s
- MemoryLimit=300M //内存最大占用300M
- CPUQuota=100% //最多占用一个CPU线程
-
- [Install]
- WantedBy=multi-user.target
-
- "/usr/lib/systemd/system/node_exporter.service" [New] 15L, 266C written
- ####重新加载启动文件目录,并设置开机自启
- [root@node ~]# systemctl daemon-reload
- [root@node ~]# systemctl start node_exporter
- [root@node ~]# systemctl enable node_exporter
注意:被控节点防火墙需要放通9100端口
- [root@test node_exporter]# vi /home/prometheus/prometheus.yml
- - job_name: "agent"
- static_configs:
- - targets: ["172.27.30.92:9100","172.27.30.85:9100"
- [root@test node_exporter]# curl -X POST http://172.27.30.94:9090/-/reload
登录Prometheus,在Targets下可查看已监听到的主机
Grafana是一款用Go语言开发的开源数据可视化工具,可以做数据监控和数据统计,带有告警功能。
- ###官网下载较慢,在清华镜像站下载
- [root@test ~]# wget --no-check-certificate https://mirrors.tuna.tsinghua.edu.cn/grafana/yum/rpm/grafana-8.4.6-1.x86_64.rpm
- ###安装grafana
- [root@test ~]# yum localinstall -y grafana-8.4.6-1.x86_64.rpm
- ###启动grafana,设置开机自启
- [root@test ~]# systemctl start grafana-server
- Warning: grafana-server.service changed on disk. Run 'systemctl daemon-reload' to reload units.
- [root@test ~]# systemctl enable grafana-server
- ###开通防火墙3000端口
- [root@test ~]# firewall-cmd --permanent --add-port=9100/tcp
grafana默认登录的管理员账号密码都是:admin 默认端口3000
Home——DATA SOURCE
添加配置Prometheus数据源,修改Prometheus的URL,保存提交
Grafana 官方和社区对已经做好了常用的 DashBoard,可以在官网通过下载json文件或copy id将其导入到自己grafana面板。(熟练后可以自己创建编辑模板)
选择Prometheus数据源,根据需求搜索相关模板
复制DashBoard模板id
通过Grafana + 图标导入(import)。输入复制的DashBoard模板id,选择数据源保存即可。
Alertmanager是Prometheus的一个报警通知组件,需要结合Prometheus使用。Prometheus将监测到的异常事件发送给Alertmanager,Alertmanager发送异常事件的通知(邮件、钉钉、微信等)。
prometheus触发一条告警的过程:
prometheus—>触发阈值—>超出持续时间—>alertmanager—>分组|抑制|静默—>媒体类型—>邮件|钉钉|微信等。
Alert的三种状态:
pending:警报被激活,但是低于配置的持续时间。这里的持续时间即rule里的FOR字段设置的时间。改状态下不发送报警。
firing:警报已被激活,而且超出设置的持续时间。该状态下发送报警。
inactive:既不是pending也不是firing的时候状态变为inactive
- [root@test ~]# wget https://github.com/prometheus/alertmanager/releases/download/v0.24.0/alertmanager-0.24.0.linux-amd64.tar.gz
- [root@test ~]# tar xvf alertmanager-0.24.0.linux-amd64.tar.gz -C /home/
- [root@test ~]# mv /home/alertmanager-0.24.0.linux-amd64 /home/alertmanager
- [root@test ~]# /home/alertmanager/alertmanager --version
- alertmanager, version 0.24.0 (branch: HEAD, revision: f484b17fa3c583ed1b2c8bbcec20ba1db2aa5f11)
- build user: root@265f14f5c6fc
- build date: 20220325-09:31:33
- go version: go1.17.8
- platform: linux/amd64
配置邮箱告警
- ### global:全局配置,主要配置告警方式,如邮件、webhook等。
- [root@grafana home]# cat /home/alertmanager/alertmanager.yml
- global:
- resolve_timeout: 5m //处理超时,默认5min
- smtp_smarthost: 'smtp.ssitg.com:25' //邮件发送服务器
- smtp_from: 'jifang@ssitg.com' //邮件发送地址
- smtp_auth_username: 'jifang@ssitg.com' //邮件发送地址用户名
- smtp_auth_password: 'Qwer.com123' //邮件发送地址密码
- smtp_require_tls: false //是否使用 tls,根据环境不同,来选择开启和关闭。
-
- templates: //告警模板位置
- - '*.tmp'
-
- ###路由分组
- route: //设置报警的分发策略
- group_by: ['alertname'] //用于分组聚合,对告警通知按标签(label)进行分组
- group_wait: 30s //在组内等待所配置的时间,如果同组内30秒内出现相同报警,在一个组内出现。
- group_interval: 5m //如果组内内容不变化,合并为一条警报信息,5m后发送。
- repeat_interval: 1h //发送报警间隔,如果指定时间内没有修复,则重新发送报警。
- receiver: 'email' //配置告警消息接收者,与下面配置的对应。例如常用的 email、wechat、slack、webhook 等消息通知方式。
-
- receivers: //配置报警信息接收者信息
- - name: 'email'
- email_configs:
- - to: '{{ template "email.to" . }}' //接收警报的email(调用模板文件中的)
- html: '{{ template "email.to.html" . }}' //发送邮件的内容(调用模板文件中的)
- send_resolved: true //故障恢复后通知
-
- inhibit_rules: // 抑制规则配置,当存在与另一组匹配的警报(源)时,抑制规则将禁用与一组匹配的警报(目标)
- - source_match: //源标签警报触发时抑制含有目标标签的警报,在当前警报匹配 status: 'High'
- severity: 'critical'
- target_match:
- severity: 'warning' //目标标签值正则匹配,可以是正则表达式如: ".*MySQL.*"
- equal: ['alertname', 'dev', 'instance'] // 确保这个配置下的标签内容相同才会抑制,也就是说警报中必须有这三个标签值才会被抑制。
创建邮箱模板
- ###创建邮箱模板配置
- [root@grafana home]# vi /home/alertmanager/alert.tmp
- {{ define "email.from" }}jifang@ssitg.com{{ end }}
- {{ define "email.to" }}licl@ssitg.com{{ end }}
- {{ define "email.to.html" }}
- {{ range .Alerts }}
- =========start==========
- 告警程序: prometheus_alert
- 告警级别: {{ .Labels.severity }} 级
- 告警类型: {{ .Labels.alertname }}
- 故障主机: {{ .Labels.instance }}
- 告警主题: {{ .Annotations.summary }}
- 告警详情: {{ .Annotations.description }}
- 触发时间: {{ .StartsAt.Format "2019-08-04 16:58:15" }}
- =========end==========
- {{ end }}
- {{ end }}
- [root@test alertmanager]# /home/alertmanager/amtool check-config /home/alertmanager/alertmanager.yml
- Checking '/home/alertmanager/alertmanager.yml' SUCCESS
- Found:
- - global config
- - route
- - 1 inhibit rules
- - 1 receivers
- - 1 templates
- SUCCESS
-
- [root@test alertmanager]#
- ###创建启动文件
- [root@test system]# vi /usr/lib/systemd/system/alertmanager.service
- [Unit]
- Description=alertmanager is service
-
- [Service]
- Type=simple
- ExecStart=/home/alertmanager/alertmanager --config.file=/home/alertmanager/alertmanager.yml
- ExecReload=/bin/kill -HUP $MAINPID
- KillMode=process
- Restart=on-failure
- RestartSec=42s
-
- [Install]
- WantedBy=multi-user.target
- [root@test system]# systemctl daemon-reload
- ###启动服务
- [root@test system]# systemctl restart prometheus
- [root@test system]# systemctl enable prometheus
默认地址:http://172.27.30.94:9093
修改Prometheus配置文件
- ###配置Prometheus配置文件
- [root@grafana ~]# vi /home/prometheus/prometheus.yml
- # Alertmanager configuration
- alerting:
- alertmanagers:
- - static_configs:
- - targets:
- - 172.27.30.94:9093 //指定Alertmanager 的地址
- rule_files: //指定报警规则文件
- - rules/*.yml
- ###重新加载Prometheus配置
- [root@grafana ~]# curl -X POST http://localhost:9090/-/reload
创建报警规则
- ###编辑报警规则文件
- [root@grafana ~]# mkdir /home/prometheus/rules
- [root@grafana ~]# vi /home/prometheus/rules/node_alived.yml
- groups:
- - name: 实例存活告警规则
- rules:
- - alert: 实例存活告警
- expr: up == 0
- for: 1m
- labels:
- user: prometheus
- severity: warning
- annotations:
- summary: "主机宕机 !!!"
- description: "该实例主机已经宕机超过一分钟了。"
- - name: 内存报警规则
- rules:
- - alert: 内存使用率告警
- expr: (1 - (node_memory_MemAvailable_bytes / (node_memory_MemTotal_bytes))) * 100 > 80
- for: 1m
- labels:
- severity: warning
- annotations:
- summary: "服务器可用内存不足。"
- description: "内存使用率已超过80%(当前值:{{ $value }}%)"
- - name: CPU报警规则
- rules:
- - alert: CPU使用率告警
- expr: 100 - (avg by (instance)(irate(node_cpu_seconds_total{mode="idle"}[1m]) )) * 100 > 80
- for: 1m
- labels:
- severity: warning
- annotations:
- summary: "CPU使用率正在飙升。"
- description: "CPU使用率超过80%(当前值:{{ $value }}%)"
- - name: 磁盘使用率报警规则
- rules:
- - alert: 磁盘使用率告警
- expr: 100 - node_filesystem_free_bytes{fstype=~"xfs|ext4"} / node_filesystem_size_bytes{fstype=~"xfs|ext4"} * 100 > 80
- for: 20m
- labels:
- severity: warning
- annotations:
- summary: "硬盘分区使用率过高"
- description: "分区使用大于80%(当前值:{{ $value }}%)"
-
- ###重新加载配置文件
- [root@grafana ~]# curl -X POST http://localhost:9090/-/reload
登陆prometheus的UI界面,查看Alerts规则
模拟服务器宕机