Prometheus+Grafana监控系统搭建
博文大纲:
一、prometheus简介
二、Prometheus组成及架构
三、部署prometheus
1)环境准备
2)部署prometheus
3)配置Peometheus监控实现报警
一、prometheus简介
Prometheus是一套开源的系统监控报警框架。它以给定的时间间隔从已配置的目标收集指标,评估规则表达式,显示结果,并在发现某些情况为真时触发警报。
作为新一代的监控框架,Prometheus具有以下特点 :
- 强大的多维度数据模型:
(1)时间序列数据通过metric名和键值对来区分;
(2)所有的metrics都可以设置任意的多维标签;
(3)数据模型更随意,,不需要刻意设置为以点分隔的字符串;
(4)可以对数据模型进行聚合、切割和切片操作;
(5)支持双精度浮点类型,标签可以设为全unicode(统一码);- 灵活、强大的查询语句:在同一个查询语句,可以对多个 metrics 进行乘法、加法、连接、取分数位等操作;
- 易于管理:不依赖于分布式存储;
- 使用 pull 模式采集时间序列数据;
- 可以采用 push gateway 的方式把时间序列数据推送至 Prometheus server 端;
- 可以通过服务发现或者静态配置去获取监控的 targets;
- 有多种可视化图形界面;
- 易于伸缩。;
二、Prometheus组成及架构
Prometheus包含了许多组件,其中许多组件都是可选的,常用的组件有:
- Prometheus Server:用于收集和存储时间序列数据;
- Client Library:客户端库,为需要监控的服务生成相应的 metrics 并暴露给 Prometheus server;
- Push Gateway:主要用于短期的 jobs。由于这类 jobs 存在时间较短,可能在 Prometheus 来 pull 之前就消失了。为此,这次 jobs 可以直接向 Prometheus server 端推送它们的 metrics;
- Exporters:用于暴露已有的第三方服务的 metrics 给 Prometheus;
- Alertmanager:从 Prometheus server 端接收到 alerts 后,会进行去除重复数据,分组,并路由到对端的接受方式,发出报警;
…………等等,还有好多,这里就列出几个常用的组件!
Prometheus官方文档中的架构图:
官方的架构图中,主要模块块包括:Prometheus server, exporters, Pushgateway, PromQL, Alertmanager 以及图形界面;
大致的工作流程是:
(1)Prometheus server 定期从配置好的 jobs 或者 exporters 中拉 metrics,或者接收来自 Pushgateway 发过来的 metrics,或者从其他的 Prometheus server 中拉 metrics;
(2)Prometheus server 在本地存储收集到的 metrics,并运行已定义好的 alert.rules,记录新的时间序列或者向 Alertmanager 推送警报;
(3)Alertmanager 根据配置文件,对接收到的警报进行处理,发出告警;
(4)在图形界面中,可视化采集数据;
三、部署prometheus
1)环境准备
注意:上述三台服务器上必须具备最基本的docker环境,上述环境的docker版本为18.09.0!
上述环境所需组件的作用如下:
- Prometheus server:普罗米修斯的主服务器(端口:9090);
- NodeEXporter:负责收集Host硬件信息和操作系统信息,(端口:9100);
- cAdvisor:负责收集Host上运行的容器信息(端口:8080);
- Grafana:负责展示普罗米修斯监控界面(3000);
- Alertmanager:用来接收Prometheus发送的报警信息,并且执行设置好的报警方式,报警内容(同样也是在dockerA主机上部署,端口:9093);
各组件的关系:NodeEXporter、cAdvisor负责收集信息发送给 Prometheus server,在由 Prometheus server交给Grafana进行图形化的显示。如需报警,则由prometheus向Alertmanager组件发送信息!
实验环境,为了简单起见,关闭防火墙、SELinux,实际环境中需开启相应的端口!
2)部署prometheus
(1)运行node-exporter容器
NodeEXporter主要负责收集Host硬件信息和操作系统信息!
[root@dockerA ~]# docker run -d --name node -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)($|/)" //使用prom/node-exporter 镜像创建一个名为node的容器,用于收集硬件和系统信息; //--net=host表示Prometheus server可以直接与node-exporter通信; //并映射9100端口
执行完成后,客户端使用浏览器进行访问,如图:
访问到以上页面表示node-exporter这个组件安装成功!
由于这个NodeEXporter组件需要在三台docker host主机上,所以以上命令就需要在另外两台主机上都执行。执行完成后,自行使用浏览器访问测试!
(2)运行cAdvisor容器
cAdvisor主要负责收集Host上运行的容器信息!
[root@dockerA ~]# 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
客户端访问测试:
访问到上述页面则表示cAdvisor这个组件安装成功!
同样这个cAdvisor组件也是需要在三台docker host上全部安装的!所以以上命令也需在另外两台主机上执行,执行完成后,自行测试!
(3)运行Prometheus server容器(只需在dockerA主机上执行即可!)
Prometheus是普罗米修斯的主服务器!
在部署Prometheus之前,需要对它的配置文件进行修改,所以首先运行一个Prometheus容器将其配置文件复制到本地,便于进行修改。
[root@dockerA ~]# docker run -d -p 9090:9090 --name prometheus --net=host prom/prometheus //运行一个Prometheus容器是为了将它的配置文件拿到本地 [root@dockerA ~]# docker cp prometheus:/etc/prometheus/prometheus.yml . //将Prometheus容器中的主配置文件复制到本地 [root@dockerA ~]# vim prometheus.yml //编辑主配置文件 - targets: ['localhost:9090','localhost:8080','localhost:9100','192.168.1.2:8080','192.168.1.2:9100','192.168.1.3:8080','192.168.1.3:9100'] //这项原本是存在的,只需修改即可! //用于指定监控本机的9090、8080、9100这三个端口,另外添加另外两台docker主机的8080、9100这两个端口。 //8080端口运行的是cAdvisor服务 //9100端口运行的是node-exporter服务 //9090端口运行的就是Prometheus服务 [root@dockerA ~]# docker rm prometheus -f //将刚才运行的容器删除 prometheus [root@dockerA ~]# docker run -d -p 9090:9090 --name prometheus --net=host -v /root/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus //重新运行一个prometheus容器,将刚才修改完成的配置文件挂载到容器中
客户端访问测试:
(4)运行grafana容器(同样只需在dockerA主机上运行即可!)
grafana主要负责展示普罗米修斯监控界面,给我们提供良好的图形化界面!
[root@dockerA ~]# mkdir grafana-storage [root@dockerA ~]# chmod 777 -R grafana-storage //创建一个目录,赋予777的权限 [root@dockerA ~]# docker run -d -p 3000:3000 --name grafana -v /root/grafana-storage:/var/lib/grafana -e "GF_SECURITY_ADMIN_PASSWORD=123.com" grafana/grafana //“-e”选项表示修改容器内部的环境变量,将admin用户的密码更改为123.com;
客户端访问测试:
上述配置完成后,我们就需要配置它以什么样的形式来给我们展示了,可以自定义,但是很麻烦,我选择直接去grafana官网寻找现成的模板。如图:
将grafana官方的模板导入到我们的grafana容器提供的web页面中,方法有两种方式:
1)第一种方式:
在grafana官网选择自己喜欢的模板,点击进入,如图:
下载后,回到自己搭建的grafana容器提供的web页面中,如图:
但是仔细看的话,会发现这个模板有些信息都检测不到,所以这里就是为了展示一种方式导入模板的方式。个人建议推荐使用第二种方式!
2)第二种方式:
选择合适的模板后,记录其ID号,如图:
记录下模板的ID号之后,同样回到自己搭建的grafana容器提供的web页面中,如图:
至此web界面的监控就部署完成了!
3)配置Peometheus监控实现报警
Prometheus的报警方式有好几种,比如:邮箱、微信、钉钉等,本次案例采用邮箱告警的方式。
(1)运行alertmanager容器
Alertmanager组件主要是用来接收Prometheus发送的报警信息,并且执行设置好的报警方式,报警内容;
只需在dockerA主机上部署即可!方法如下:
[root@dockerA ~]# docker run -d --name alertmanager -p 9093:9093 prom/alertmanager //随便运行一个容器,其目的就是将容器中服务的配置文件拿到本地 [root@dockerA ~]# docker cp alertmanager:/etc/alertmanager/alertmanager.yml . //将altermanager服务的yml配置文件拿到本地 [root@dockerA ~]# vim alertmanager.yml //编辑配置文件 global: resolve_timeout: 5m smtp_from: '1454295320@qq.com' #发送者信息 smtp_smarthost: 'smtp.qq.com:465' smtp_auth_username: '1454295320@qq.com' #接收者信息 smtp_auth_password: 'gfuxsudyqyulbaad' #使用qq邮箱生成的授权码 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: '1454295320@qq.com' //发送者信息 send_resolved: true //当容器恢复正常时,也会发送一份邮件 inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance'] //配置文件中常用需要修改的地方已经做了备注
alertmanager.yml配置文件中一级字段:
- global:全局配置(包括报警解决的超时时间、SMTP相关配置、各种渠道通知的API地址等新消息);
- route:用来设置报警的分发策略;
- receivers:配置告警消息接收者信息;
- inhibit_rules:抑制规则配置,当存在与另一组匹配的警报时,抑制规则将仅用于一组匹配的;
[root@dockerA ~]# docker rm -f alertmanager //将原本的alertmanager 容器删除 [root@dockerA ~]# docker run -d --name alertmanager -p 9093:9093 -v /root/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager //重新运行alertmanager 容器,并将配置文件挂载到容器中 //建议运行容器之后,使用docker ps | grep alertmanager 确保容器正常运行 //如果配置文件编写错误,那么这个容器是无法启动的
(2)配置alertmanager报警规则
[root@dockerA ~]# mkdir -p prometheus/rules && cd prometheus/rules //创建目录用于存放规则的目录 [root@dockerA rules]# vim node-up.rules //编写规则 groups: - name: node-up //自定义名称 rules: - alert: node-up expr: up{job="prometheus"} == 0 // job的名称必须和prometheus配置文件中的 - job_name: 'prometheus'对应 for: 15s labels: severity: 1 team: node annotations: summary: "{{ $labels.instance }} 已停止运行超过 15s!"
可以根据以上配置文件进行修改,若想自己编写报警规则,可以参考它的官方文档,如图:
(3)关联Prometheus
[root@dockerA ~]# vim prometheus.yml 8 alerting: 9 alertmanagers: 10 - static_configs: 11 - targets: 12 - 192.168.1.1:9093 //此行将原本的内容更改为alertmanager容器的IP+端口 13 14 # Load rules once and periodically evaluate them according to the global 'evaluat ion_interval'. 15 rule_files: 16 - "/usr/local/prometheus/rules/*.rules" //这一行需要手动添加,指定容器内的路径 [root@dockerA ~]# docker rm -f prometheus //修改完配置为文件后,需要将容器删除,重新运行一台新的容器 [root@dockerA ~]# 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 //指定步骤(2)编写的rule文件的路径,
为防止格式可能会出现错误,附上截图一张,如下:
至此,如果prometheus页面中的target有异常(比如宕机),那么就会给你的邮箱发送报警信息。
我手动停掉容器,收到的邮件如下:
为了追求美观,我们采取设置一下报警信息的模板!
(4)设置报警信息模板
[root@dockerA ~]# cd prometheus [root@dockerA prometheus]# mkdir alertmanager-tmpl [root@dockerA prometheus]# cd alertmanager-tmpl/ [root@dockerA prometheus]# vim email.tmpl {{ define "email.from" }}1454295320@qq.com{{ end }} {{ define "email.to" }}1454295320@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 }} [root@dockerA ~]# vim alertmanager.yml global: resolve_timeout: 5m smtp_from: '1454295320@qq.com' smtp_smarthost: 'smtp.qq.com:465' smtp_auth_username: '1454295320@qq.com' smtp_auth_password: 'flnuwdktcbzwffag' smtp_require_tls: false smtp_hello: 'qq.com' templates: //添加此行 - '/etc/alertmanager-tmpl/*.tmpl' //指定容器中模板的路径 route: group_by: ['alertname'] group_wait: 5s group_interval: 5s repeat_interval: 5m receiver: 'email' receivers: - name: 'email' email_configs: - to: '{{ template "email.to" }}' //必须和模板中对应 html: '{{ template "email.to.html" . }}' //必须和模板中对应 send_resolved: true inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance'] [root@dockerA ~]# docker rm alertmanager -f //删除容器 [root@dockerA ~]# docker run -d --name alertmanager -p 9093:9093 -v /root/alertmanager.yml:/etc/alertmanager/alertmanager.yml -v /root/prometheus/alertmanager-tmpl:/etc/alertmanager-tmpl prom/alertmanager //创建容器本地创建的模板文件 //创建完成后,确定容器是正常运行
至此,新的报警模板也生成了,如果以下容器有Down的,就会给你发送新的邮件,恢复正常后,也会发送邮件,同样,邮件中的内容格式是有误的,但是你可以正常接收到报警信息,若想要更改其报警模板,可以参考官方文档
邮箱收到的报警信息如下:
比原本的效果要好很多!就简单介绍一下这一个吧,有兴趣可以参考官网的文档,自行进行编写!
————————————本文到此结束,感谢阅读————————————
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
常见的假日网络诈骗
假期又来了!对我而言,一年中的这个时间意味着与家人和朋友共度美好时光。它代表了对他人的喜悦和善良的时刻。不幸的是,并不是每个人都认同这一观点。在每年的这个时候,网络犯罪分子和诈骗者喜欢通过增加诈骗的数量和复杂程度来利用假日精神,以利用受害者谋取自己的经济利益。 网络犯罪分子和骗子经常利用人们的奉献精神,特别是在假期期间。他们利用社会工程学和其他技术来捕食受害者在本季节中的情感和善意,以试图窃取金钱和个人信息。他们还试图在购物和其他活动中掩盖自己的攻击,希望他们的行为不会引起注意。 当我们进入假期时,重要的是我们都要保持警惕。知道要寻找的内容对于保持网络安全大有帮助。为了帮助您,以下是一些较常见的骗局: 常见的假日网络诈骗 1. 相似网站: 在进行假日购物时,请确保您访问的网站是合法的。当心那些使用知名品牌名称以及额外的单词和字符的URL。在网址中查找“ https”和一个锁形符号,以表明站点正在使用安全性。查找拼写错误的单词,对您的个人信息的要求以及价格似乎特别低的价格-尤其是对于热门但又很难找到的商品。很有可能这些交易太好了以至于无法实现。 2. 假货运通知: 如果您收到一封电子邮件...
- 下一篇
简单聊一聊Ansible自动化运维
一、Ansible概述 Ansible是今年来越来越火的一款开源运维自动化工具,通过Ansible可以实现运维自动化,提高运维工程师的工作效率,减少人为失误。Ansible通过本身集成的非常丰富的模块可以实现各种管理任务,其自带模块超过上千个。更为重要的是,它操作非常简单,即使小白也可以轻松上手,但它提供的功能又非常丰富,在运维领域,几乎可以做任何事。 1、Ansible特点 Ansible自2012年发布以来,很快在全球流行,其特点如下: Ansible基于Python开发,运维工程师对其二次开发相对比较容易; Ansible丰富的内置模块,几乎可以满足一切要求; 管理模式非常简单,一条命令可以影响上千台主机; 无客户端模式,底层通过SSH通信; Ansible发布后,也陆续被AWS、Google Cloud Platform、Microsoft Azure、Cisco、HP、VMware、Twitter等大公司接纳并投入使用; 二、Ansible的角色 使用者:如何使用Ansible实现自动化运维? Ansible工具集:Ansible可以实现的功能? 作用对象:Ansible可以...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8