Prometheus简介
prometheus受启发于Google的Brogmon监控系统(相似kubernetes是从Brog系统演变而来), 从2012年开始由google工程师Soundcloud以开源形式进行研发,并且与2015年早起对外发布早期版本。 2016年5月继kubernetes之后成为第二个加入CNCF基金会的项目,同年6月正式发布1.0版本。2017年底发布基于全兴存储层的2.0版本,能更好地与容器平台、云平台配合。
Prometheus优势
prometheus是基于一个开源的完整监控方案,其对传统监控系统的测试和告警模型进行了彻底的颠覆,形成了基于中央化的规则计算、统一分析和告警的新模型。相对传统的监控系统有如下几个优点。
易于管理: 部署使用的是go编译的二进制文件,不存在任何第三方依赖问题,可以使用服务发现动态管理监控目标。
监控服务内部运行状态: 我们可以使用prometheus提供的常用开发语言提供的client库完成应用层面暴露数据,采集应用内部运行信息。
强大的查询语言promQL: prometheus内置一个强大的数据查询语言PromQL,通过PromQL可以实现对监控数据的查询、聚合。同时PromQL也被应用于数据可视化(如grafana)以及告警中的。
高效: 对于监控系统而言,大量的监控任务必然导致有大量的数据产生。而Prometheus可以高效地处理这些数据。
可扩展:prometheus配置比较简单, 可以在每个数据中心运行独立的prometheus server, 也可以使用联邦集群,让多个prometheus实例产生一个逻辑集群,还可以在单个prometheus server处理的任务量过大的时候,通过使用功能分区和联邦集群对其扩展。
易于集成: 目前官方提供多种语言的客户端sdk,基于这些sdk可以快速让应用程序纳入到监控系统中,同时还可以支持与其他的监控系统集成。
可视化:prometheus server自带一个ui, 通过这个ui可以方便对数据进行查询和图形化展示,可以对接grafana可视化工具展示精美监控指标。
Prometheus的基础架构
这里在简单说下, prometheus负责从pushgateway和job中采集数据, 存储到后端Storatge中,可以通过PromQL进行查询, 推送alerts信息到AlertManager。 AlertManager根据不同的路由规则进行报警通知。
Prometheus的核心组件
Prometheus Server是Prometheus组件中的核心部分,负责实现对监控数据的获取,存储以及查询。
Prometheus Server可以通过静态配置管理监控目标,也可以配合使用Service Discovery的方式动态管理监控目标,并从这些监控目标中获取数据。其次
Prometheus Server需要对采集到的监控数据进行存储,Prometheus Server本身就是一个时序数据库,将采集到的监控数据按照时间序列的方式存储在本地磁盘当中。最后PrometheusServer对外提供了自定义的PromQL语言,实现对数据的查询以及分析。
Prometheus Server内置的Express Browser UI,通过这个UI可以直接通过PromQL实现数据的查询以及可视化。
exporter简单说是采集端,通过http服务的形式保留一个url地址,prometheus server 通过访问该exporter提供的endpoint端点,即可获取到需要采集的监控数据。exporter分为2大类。
直接采集:这一类exporter直接内置了对Prometheus监控的支持,比如cAdvisor,Kubernetes等。原生监控
间接采集: 原有监控目标不支持prometheus,需要通过prometheus提供的客户端库编写监控采集程序,例如Mysql Exporter, JMX Exporter等。 非原生监控
在prometheus中,支持基于PromQL创建告警规则,如果满足定义的规则,则会产生一条告警信息,进入AlertManager进行处理。可以集成邮件,Slack或者通过webhook自定义报警。
由于Prometheus数据采集采用pull方式进行设置的,内置必须保证prometheus
pushgateway是另一种数据采集的方式,采用被动推送来获取监控数据的prometheus插件,它可以单独运行在任何节点上,并不一定要运行在被监控的客户端。
· 首先通过用户自定义编写的脚本把需要监控的数据发送给pushgateway,
· pushgateway再将数据推送给对应的Prometheus服务
使用Pushgateway的主要原因
原因一:因为Prometheus 采用 pull 模式,可能由于不在一个子网或者防火墙,导致 Prometheus 无法直接拉取各个 target 数据。
原因二:在监控业务数据的时候,需要将不同数据汇总, 由 Prometheus 统一收集。
Prometheus的优缺点
优点:
基于时间序列模型,时间序列是指将某种现象某一个统计指标在不同时间上的各个数值,按时间先后顺序排列而形成的序列 ,时间序列分析的主要目的是根据已有的历史数据对未来进行预测。
基于K V的数据模型
采样数据的查询,完全基于数学运算
采用HTTP pull/push两种对应的数据采集传输方式
本身自带图形调试
缺点:
因其数据采集的精度 如果集群数量太⼤,那么单点的监控有性能瓶颈
对磁盘资源也是耗费的较⼤,这个具体要看 监控的集群量 和 监控项的多少 和保存时间的长短
安装Prometheus
下载Prometheus安装包 Prometheus官网选择自己想要的安装包
[root@prometheus ~]# tar zxvf prometheus-2.42.0.linux-amd64.tar.gz
[root@prometheus ~]# mv prometheus-2.42.0.linux-amd64 /usr/local/prometheus
[root@prometheus ~]# mkdir /usr/local/prometheus/data
[root@prometheus ~]# useradd -s /sbin/nologin prometheus
[root@prometheus ~]# chown -R prometheus:prometheus /usr/local/prometheus/ -R
配置系统启动脚本
[root@prometheus ~]# vim /usr/lib/systemd/system/prometheus.service
[Unit]
Description=prometheus
After=network.target
[Service]
User=prometheus
Group=prometheus
WorkingDirectory=/usr/local/prometheus
ExecStart=/usr/local/prometheus/prometheus
[Install]
WantedBy=multi-user.target
[root@prometheus ~]# systemctl daemon-reload
[root@prometheus ~]# systemctl enabled --now prometheus
[root@prometheus ~]# systemctl status prometheus.service
[root@prometheus ~]# netstat -anptu | grep 9090
[root@prometheus ~]# firewall-cmd --add-port=9090/tcp --permanent
[root@prometheus ~]# firewall-cmd --reload
后端存储配置
默认情况下prometheus会将采集的数据存储到本机的data目录, 存储数据的大小受限和扩展不便,这是使用influxdb作为后端的数据库来存储数据。
influxdb安装配置
influxdb的官方文档地址为: https://docs.influxdata.com/influxdb/v1.7/introduction/downloading/ 根据不同系统进行下载,这里使用官方提供的rpm进行安装。
下载rpm
[root@prometheus ~]# wget https://dl.influxdata.com/influxdb/releases/influxdb-1.7.8.x86_64.rpm
本地安装rpm
[root@prometheus ~]# yum localinstall influxdb-1.7.8.x86_64.rpm
[root@prometheus ~]# systemctl enable --now influxdb
[root@prometheus ~]# systemctl status influxdb
[root@prometheus ~]# firewall-cmd --add-port=8086/tcp --permanent
[root@prometheus ~]# firewall-cmd --reload
客户端登陆测试, 创建一个prometheus的database供后续的prometheus使用。
[root@prometheus ~]# influx
> create database prometheus;
> show databases;
name: databases
name
----
_internal
prometheus
配置prometheus集成influxdb
[root@prometheus ~]# vim /usr/local/prometheus/prometheus.yml
remote_write:
- url: "http://localhost:8086/api/v1/prom/write?db=prometheus"
remote_read:
- url: "http://localhost:8086/api/v1/prom/read?db=prometheus"
[root@prometheus ~]# systemctl restart prometheus
测试数据是否存储到influxdb中
[root@prometheus ~]# influx
> use prometheus;
> show MEASUREMENTS;
> select * from prometheus_http_requests_total limit 10 ;
Prometheus配置文件讲解
1、Prometheus以scrape_interval规则周期性从监控目标上收集数据,然后将数据存储到本地存储上。
2、scrape_interval可以设定全局也可以设定单个metrics。# 数据采集间隔
3、Prometheus以evaluation_interval规则周期性对告警规则做计算,然后更新告警状态。
4、evaluation_interval只有设定在全局。 # 告警周期
• global:全局配置
• alerting:告警配置
• rule_files:告警规则
• scrape_configs:配置数据源,称为target,每个target用job_name命名。又分为静态配置和服务发现
# 全局配置global:
# 默认抓取周期,可用单位ms、smhdwy #设置每15s采集数据一次,默认1分钟
[ scrape_interval: | default = 1m ]
# 默认抓取超时
[ scrape_timeout: | default = 10s ]
# 估算规则的默认周期 # 每15秒计算一次规则。默认1分钟
[ evaluation_interval: | default = 1m ]
# 和外部系统(例如AlertManager)通信时为时间序列或者警情(Alert)强制添加的标签列表
external_labels:
[ : ... ]
# 规则文件列表
rule_files:
[ - ... ]
# 抓取配置列表
scrape_configs:
[ - ... ]
# Alertmanager相关配置
alerting:
alert_relabel_configs:
[ - ... ]
alertmanagers:
[ - ... ]
# 远程读写特性相关的配置
remote_write:
[ - ... ]
remote_read:
[ - ... ]
在prometheus中,我们可以使用web页面进行数据的查询和展示,不过展示效果不太理想,这里使用一款专业的展示平台进行展示。
Grafana安装
[root@localhost ~]# wget https://dl.grafana.com/enterprise/release/grafana-enterprise-9.4.3-1.x86_64.rpm
[root@localhost ~]# yum install grafana-enterprise-9.4.3-1.x86_64.rpm -y
[root@localhost ~]# systemctl enable grafana-server.service --now
[root@localhost ~]# systemctl status grafana-server.service
[root@localhost ~]# netstat -anptu | grep 3000
tcp6 0 0 :::3000 :::* LISTEN 19757/grafana
[root@prometheus ~]# firewall-cmd --add-port=3000/tcp --permanent
[root@prometheus ~]# firewall-cmd --reload
访问本地ip加grafana端口号
192.168.43.254:3000
默认账号:admin 默认密码:admin
新密码--确认新密码
添加数据源
点击 "Add data source" 按钮 ,选择Prometheus作为数据源类型
添加dashboard
选择import导入方式,输入1860,可以看到如下图。
保存仪表盘
添加精简导出器
我这边根据网络上面的dashardboard进行修改,使用在工作中的dashboard如下图。
Node-exporter dashboard网址如下
https://grafana.com/grafana/dashboards?dataSource=prometheus