Prometheus(普罗米修斯)
是一个系统和服务的监控平台。它可以自定义时间间隔从已配置的目标收集指标,评估规则表达式,显示结果,并在发现某些情况时触发警报
与其他监视系统相比,Prometheus的主要区别特征是:
一个多维数据模型(时间序列由指标名称定义和设置键/值尺寸)
一个灵活的查询语言来利用这一维度
不依赖于分布式存储;单服务器节点是自治的
时间序列收集通过HTTP 上的拉模型进行
通过中间网关支持推送时间序列
通过服务发现或静态配置发现目标
多种图形和仪表板支持模式
支持分层和水平联合
实验环境:
docker01 | 192.168.1.70 | NodeEXporter | cAdvisor+Prometheus server+gragana |
---|---|---|---|
docker02 | 192.168.1.60 | NodeEXporter | cAdvisor |
docker03 | 192.168.1.50 | NodeEXporter | cAdvisor |
[root@localhost ~]# hostnamectl set-hostname docker1
[root@localhost ~]# su -
[root@localhost ~]# hostnamectl set-hostname docker2
[root@localhost ~]# su -
[root@localhost ~]# hostnamectl set-hostname docker3
[root@localhost ~]# su -
全部关闭防火墙,禁用selinux
[root@docker01 ~]# systemctl stop firewalld
[root@docker01 ~]# systemctl disable firewalld
[root@docker01 ~]# setenforce 0
需要部署的组件
Prometheus server(9090):普罗米修斯的主机服务器
NodeEXporter(9100):负责收集host硬件信息和操作系统信息 //谷歌开发的监控软件。收集数据,不太直观。有历史保留,方便后期做优化
cAdvisor(8080):负责收集host上运行的容器信息
Grafana(3000):负责展示普罗米修斯监控界面 //类似于kibana的图形界面,提供可视化web页面
1)三个节点,全部部署node-exporter和cadvisor
//分别在三个节点上导入镜像
[root@docker01 ~]# docker load < node-exporter.tar && docker load < mycadvisor.tar
//部署node-exporter,收集硬件和系统信息(三台都需要部署)
[root@docker01 ~]# docker run -d -p 9100:9100 -v /proc:/host/proc \
> -v /sys:/host/sys -v /:/rootfs --net=host \
> prom/node-exporter --path.procfs /host/proc \
> --path.sysfs /host/sys \
> --collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"
PS:注意这里使用了–net=host,这样prometheus server可以直接与node-exporter通信
验证,打开浏览器验证结果(192.168.1.70:9100)
//部署安装cAdvisor,收集节点容器信息(三台都需要部署)
[root@docker01 ~]# docker run -v /:/rootfs:ro -v /var/run:/var/run/:rw \
> -v /sys:/sys:ro -v /var/lib/docker:/var/lib/docker:ro \
> -p 8080:8080 --detach=true --name=cadvisor \
> --net=host google/cadvisor
打开浏览器验证(192.168.1.70:8080)
2)在docker01上部署prometheus server服务
在部署prometheus之前,我们需要对它的配置文件进行修改,所以我们先运行一个容器,将其配置文件拷贝出来
[root@docker01 ~]# docker load < prometheus.tar
[root@docker01 ~]# docker run -d -p 9090:9090 --name prometheus --net=host prom/prometheus
[root@docker01 ~]# docker exec -it prometheus /bin/sh
/prometheus $ cd /etc/prometheus/
/etc/prometheus $ ls
console_libraries consoles prometheus.yml
[root@docker01 ~]# docker cp prometheus:/etc/prometheus/prometheus.yml ./
[root@docker01 ~]# vim prometheus.yml
- targets: ['localhost:9090','localhost:8080','localhost:9100','192.168.1.60:8080','192.168.1.60:9100','192.168.1.50:8080','192.168.1.50:9100']
PS:这里制定了prometheus的监控项,包括它也会监控自己收集到的数据
[root@docker01 ~]# docker rm -f prometheus
//重新运行容器:
[root@docker01 ~]# docker run -d -p 9090:9090 --name prometheus --net=host -v /root/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
//浏览器访问:192.168.1.70:9090
PS:这里能够看到我们各个监控项
3)在docker01上部署grafana服务,用来展示prometheus收集到的数据
[root@docker01 ~]# docker load < grafana.tar
[root@docker01 ~]# mkdir grafana-storage
[root@docker01 ~]# chmod 777 -R grafana-storage/
[root@docker01 ~]# docker run -d -p 3000:3000 --name grafana -v /root/grafana-storage:/var/lib/grafana -e "GF_SECURITY_ADMIN_PASSWORD=123.com" grafana/grafana
浏览器访问:192.168.1.70:3000
用户名:admin
密码:123.com
//创建数据源
PS:看到这这提示,说明prometheus和grafana服务是正常连接的
此时,虽然grafana收集到了数据,但怎么显示它,仍然是个问题,grafana支持自定义显示信息,不过要自定义起来非常麻烦,不过好在,grafana官方为我们提供了一些模板,来供我们使用
Grafana官网:https://grafana.com
//可以根据自己的喜好选择模板
选中一款模板后,然后,我们又两种方式可以套用这个模板
第一种方式:通过JSON文件使用模板
下载完成之后,回到grangana控制台
第二种方式:
可以直接通过模板的ID号
配置AlertManager
AlertManager:用来接收prometheus发送的报警信息,并且执行设置好的报警方式、报警内容
AlertManager.yml配置文件:
global:全部配置,包括报警解决后的超时时间、SMTP相关配置、各种渠道通知的API地址等新消息
route:用来设置报警的分发策略
receivers:配置告警消息接收者信息
inhibit_rules:抑制规则配置,当存在于另一组匹配的报警时,抑制规则将禁用一组匹配的警报
//运行一个容器获取配置文件并进行配置
[root@docker01 ~]# docker run -d --name alertmanager -p 9093:993 prom/alertmanager:latest
[root@docker01 ~]# docker cp alertmanager:/etc/alertmanager/alertmanager ./
[root@docker01 ~]# cat alertmanager.yml
global:
resolve_timeout: 5m
smtp_from: '2960824193@qq.com'
smtp_smarthost: 'smtp.qq.com:465'
smtp_auth_username: '2960824193@qq.com'
smtp_auth_password: 'aseydtzejqfqdhai'
smtp_require_tls: false
smtp_hello: 'qq.com'
route:
group_by: ['alertname']
group_wait: 5s
group_interval: 5s
repeat_interval: 5m
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: '2960824193@qq.com'
send_resolved: true
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
//删除容器并重新运行
[root@docker01 ~]# docker rm -f alertmanager
[root@docker01 ~]# docker run -d --name alertmanager -p 9093:9093 -v /root/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager:latest
//浏览器访问:192.168.1.70:9093
Prometheus配置alertmanager报警规则
[root@docker01 ~]# mkdir -p prometheus/rules
[root@docker01 ~]# cd prometheus/rules/
[root@docker01 rules]# ls
node-up.rules
[root@docker01 rules]# cat node-up.rules
groups:
- name: node-up
rules:
- alert: node-up
expr: up{job="prometheus"} == 0 //这个job要和prometheus里的job名称一样
for: 15s
labels:
severity: 1
team: node
annotations:
summary: "{{ $labels.instance }} 已停止运行超过 15s!"
-----------------------------------------------------------------------------------------------
/etc/prometheus $ cat prometheus.yml
.......
- job_name: 'prometheus'
//监控的内容是:
- targets: ['localhost:9090','localhost:8080','localhost:9100','192.168.1.60:9100','192.168.1.60:8080','192.168.1.50:9100','192.168.1.50:8080']
.......
//编辑prometheus的配置文件
[root@docker01 ~]# vim prometheus.yml
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
- 192.168.1.70:9093 //目标为alertmanager容器
rule_files:
- "/usr/local/prometheus/rules/*.rules" //路径是容器内的路径
//删除prometheus容器,重新挂载配置文件
[root@docker01 ~]# docker rm -f prometheus
[root@docker01 ~]# docker run -d -p 9090:9090 --name prometheus --net=host -v /root/prometheus.yml:/etc/prometheus/prometheus.yml -v /root/prometheus/rules/node-up.rules:/usr/local/prometheus/rules/node-up.rules prom/prometheus
//浏览器访问:192.168.1.70:9090
//随便关闭一个容器进行测试
AlertManager配置自定义邮件模板
[root@docker01 ~]# mkdir prometheus/alertmanager-tmpl
[root@docker01 ~]# cd prometheus/alertmanager-tmpl/
[root@docker01 alertmanager.tmpl]# cat email.tmpl
{{ define "email.from" }}2960824193@qq.com{{ end }} //哪个邮箱来发送信息
{{ define "email.to" }}2960824193@qq.com{{ end }} //发送到哪个邮箱
{{ define "email.to.html" }}
{{ range .Alerts }}
=========start==========<br>
告警程序: prometheus_alert<br>
告警级别: {{ .Labels.severity }} 级<br>
告警类型: {{ .Labels.alertname }}<br>
故障主机: {{ .Labels.instance }}<br>
告警主题: {{ .Annotations.summary }}<br>
触发时间: {{ .StartsAt.Format "2019-08-04 16:58:15" }} <br>
=========end==========<br>
{{ end }}
{{ end }}
//修改altermanager的配置文件
[root@docker01 ~]# vim alertmanager.yml
//在第九行添加
templates:
- '/etc/alertmanager-tmpl/*.tmpl' //容器内的路径
//修改第20行,和第21行:
- to: '{{ template "email.to" }}' //必须和email.tmpl中的{{ define “email.to”}} 2960824193@qq.com{{end}}对应
html: '{{ template "email.to.html" . }}' //必须和email.tml中的{{ define "email.to.html" }}名字对应
//删除alertmanager容器,重新运行并挂载
[root@docker01 ~]# docker rm -f alertmanager
[root@docker01 ~]# docker run -d --name alertmanager -p 9093:9093 -v /root/alertmanager.yml:/etc/alertmanager/alertmanager.yml -v /root/prometheus/alertmanager-tmpl/:/etc/altermanager-tmpl prom/alertmanager:latest
//停止容器测试