Prometheus(普罗米修斯)是古希腊的一个神明,名字的意思是「先见之明」。从它的名字可以看出,
Prometheus 是做「先见之明」的监控告警用途。维基百科简单写了它的作用:Prometheus is a free software
application used for event monitoring and alerting(Prometheus 是用来监控、报警的免费软件)。
Prometheus 官网则是用「From metrics to insight」(用指标洞察系统的意思)描述了 Prometheus 的用途。
看到这里我们大概知道 Prometheus 其实就是一个数据监控解决方案,它能帮你简单快速地搭建起一套可视化
的监控系统。但这么说还是有点抽象,下面我举几个简单的例子,帮助大家理解 Prometheus 究竟能做什么?
对于运维人员来说,他们需要监控机器的 CPU、内存、硬盘的使用情况,以此来保证运行在机器上的应用的稳定
性。对于研发人员来说,他们关注某个异常指标的变化情况,从而来保证业务的稳定运行。对于产品或运营来说,
他们更关心产品层面的事情,例如:某个活动参加人数的增长情况,活动积分的发放情况。
对于上面说到的这些功能,Prometheus 都能够实现。Prometheus 能根据这些收集的数据实现告警功能。
例如:运维希望在 CPU 达到 80% 的时候给值班的运维人员发送邮件,产品希望活动积分发放数量超过10万的时
候发送告警邮件。这些都可以通过 Prometheus 实现。
除了数据收集、告警功能之外,Prometheus 还有很多强大的功能,例如:强大的 ProQL 查询、许多客户端库
等。因为 Prometheus 功能强大、构建成本低,所以现在越来越多的公司都使用 Prometheus 作为其数据监控的
解决方案。
Prometheus 是一个开源的监控和报警系统,它将我们关心的指标值通过 PULL 的方式获取并存储为时间序列数
据。如果单从它的收集功能来讲,我们也可以通过 mysql、redis 等方式实现。然而,这些数据是在每时每刻产生
的,其庞大的规模需要我们好好的考虑其存储方式。另外,这些监控数据大多数时候是跟统计相关的,比如数据与
时间的分布情况等,这需要有专业的度量知识。而这些正是 Prometheus 的擅长所在。由于 Prometheus 的关注
重点在于指标值以及时间点这两个因素,所以外部程序对它的接入成本非常的低。这种易用性可以让我们对数据进
行多维度、多角度的观察和分析,使得监控的效果更加具体化,例如内存消耗、网络利用率、请求连接数等。
除此之外,Prometheus 还具备了操作简单、可拓展的数据收集和强大的查询语言等特性,这些特性能帮助我们在
问题出现的时候,快速告警并定位错误。所以现在很多微服务基础设施都会选择接入 Prometheus,像 k8s、云原
生等。
对于一直在一线开发的同学而言,你可能只需要把自己的需求做好、没有 bug、顺利上线,那么你的任务就完成
了。但是如果你是一个 leader,那么你是对整个业务系统负责,这个业务系统出了什么问题,都是你的责任。这
个时候,你需要时刻关注这个系统是否正常运行。
对于流量不是很大的系统来说,出现几分钟的故障可能造成不了多少损失。但是对于像淘宝、美团、字节跳动这样
的巨无霸来说,宕机 1 分钟损失的金额可能就是几百万!
所以弄清楚此时此刻系统的运行是否正常?各项业务指标是否超过阈值?这些问题是每个经验丰富的研发人员所需
要关注的事情!
那么如何监控你的系统?如何得知系统目前是正常还是异常?甚至如何预知未来一段时间系统可能出问题?
Prometheus 正是这么一套数据监控解决方案。它能让你随时掌控系统的运行状态,快速定位出现问题的位置,快
速排除故障。
只要按照 Prometheus 的方式来做,按部就班地学习和部署,我们就可以监控机器的 CPU、内存等资源的使用情
况、Java 应用的运行情况以及业务各项指标的实时数据。
当然有一些公司会自己使用 Kafaka 收集监控数据,并且存储在 Hive 中,最终通过页面聚合数据,同样能够实现
数据监控。但是这种解决方案需要开发人员掌握 Hive + Hadoop 等大数据框架,并且在前端展示上比较局限。
而通过 Prometheus 则可以直接部署使用,并且其与 Grafana 配套使用可以呈现出非常多样化的图表配置。对于
中小规模的团队来说,可以极大地减少成本,加快研发速度。
而对于个人来讲,掌握 Prometheus 可以增加你当 leader 的竞争力。毕竟如果一个研发对自己的系统运行状况
都不了解,那么他怎么做 leader,怎么带领一个团队往前冲呢?
对于工作多年的研发人员,对自己负责的系统必须了然于胸。而要做到了然于胸,单靠一味的自信是不够的,必须
借助一套功能强大的业务监控系统。Prometheus 作为这其中的翘楚,凭借其完善的功能、海量数据支持,可以让
我们较低成本地实现业务监控。
Prometheus 是任何一个高级工程师必须要掌握的技能。那么如何从零部署一套 Prometheus 监控系统呢?本篇
文章将从 Prometheus 的原理讲起,手把手带你用一个最简单的例子部署一套 Prometheus 监控系统。
Prometheus 的基本架构如下图所示:
从上图可以看到,整个 Prometheus 可以分为四大部分,分别是:
Prometheus Server 是 Prometheus 组件中的核心部分,负责实现对监控数据的获取,存储以及查询。
业务数据源通过 Pull/Push 两种方式推送数据到 Prometheus Server。
Prometheus 通过配置报警规则,如果符合报警规则,那么就将报警推送到 AlertManager,由其进行报警处理。
Prometheus 收集到数据之后,由 WebUI 界面进行可视化图标展示。目前我们可以通过自定义的 API 客户端进行
调用数据展示,也可以直接使用 Grafana 解决方案来展示。
其它组件:
为监控节点提供 Push 功能,再由 Prometheus server 到 Pushgateway 集中 Pull 数据。
针对指标数据查询的语言,类似 SQL。
简单地说,Prometheus 的实现架构也并不复杂。其实就是收集数据、处理数据、可视化展示,再进行数据分析进
行报警处理。但其珍贵之处在于提供了一整套可行的解决方案,并且形成了一整个生态,能够极大地降低我们的研
发成本。
下面我们通过一个简单的例子来实现对服务器 CPU、内存等硬件信息的监控。
Prometheus 服务端负责数据的收集,因此我们应该首先安装并运行 Prometheus Server。
从 https://prometheus.io/download/
找到最新版本的 Prometheus Sevrer 软件包:
下载 prometheus-2.34.0-rc.2.linux-amd64.tar.gz
安装包,上传到服务器:
使用 tar -xvf prometheus-2.34.0-rc.2.linux-amd64.tar.gz
解压,可以看到如下目录结构:
新建一个 data
目录,用来作为数据的存储路径,也可以通过运行时的 --storage.tsdb.path="数据存放路径"
命令另行指定路径,如果不指定默认是data目录。
prometheus.yml
是 prometheus 的配置文件,prometheus
是运行的可执行文件。
启动 prometheus 服务,其会默认加载当前路径下的 prometheus.yaml 文件,当然我们也可以手动指定配置文件
地址:
# 前台启动
$ ./prometheus --config.file=prometheus.yml
# 后台启动
$ nohup ./prometheus --config.file=prometheus.yml >> nohup.out 2>&1 &
输入 http://192.168.2.186:9090/graph
通过浏览器进行访问,如果没有开放端口需要先开放9090端口:
# 查看开放的端口号
firewall-cmd --list-all
# 设置开放的端口号
firewall-cmd --add-port=9090/tcp --permanent
# 重启防火墙
firewall-cmd --reload
可以看到如下页面,这个是 Prometheus 自带的监控管理界面:
创建service并设置自动启动:
$ vim /usr/lib/systemd/system/prometheus.service
配置如下内容:
[Unit]
Description=prometheus
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
User=root
Group=root
ExecStart=/home/zhangshixing/prometheus/prometheus-2.34.0-rc.2.linux-amd64/prometheus --config.file=/home/zhangshixing/prometheus/prometheus-2.34.0-rc.2.linux-amd64/prometheus.yml
Restart=on-failure
[Install]
WantedBy=multi-user.target
设置自动启动:
$ systemctl enable prometheus
启动服务并查看启动状态:
# 重新加载某个服务的配置文件
$ systemctl daemon-reload
# 启动prometheus
$ systemctl start prometheus
# 查看prometheus状态
$ systemctl status prometheus
[root@zsx ~]# systemctl status prometheus
● prometheus.service - prometheus
Loaded: loaded (/usr/lib/systemd/system/prometheus.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2023-03-01 10:28:26 CST; 19s ago
Docs: https://prometheus.io/
Main PID: 108411 (prometheus)
Tasks: 6
Memory: 23.2M
CGroup: /system.slice/prometheus.service
└─108411 /home/zhangshixing/prometheus/prometheus-2.34.0-rc.2.linux-amd64/promet...
Mar 01 10:28:27 zsx.com prometheus[108411]: ts=2023-03-01T02:28:27.099Z caller=head.go:53…43µs
Mar 01 10:28:27 zsx.com prometheus[108411]: ts=2023-03-01T02:28:27.099Z caller=head.go:54...e"
Mar 01 10:28:27 zsx.com prometheus[108411]: ts=2023-03-01T02:28:27.107Z caller=tls_config...se
Mar 01 10:28:27 zsx.com prometheus[108411]: ts=2023-03-01T02:28:27.107Z caller=head.go:61...=0
Mar 01 10:28:27 zsx.com prometheus[108411]: ts=2023-03-01T02:28:27.107Z caller=head.go:61…55ms
Mar 01 10:28:27 zsx.com prometheus[108411]: ts=2023-03-01T02:28:27.111Z caller=main.go:95...IC
Mar 01 10:28:27 zsx.com prometheus[108411]: ts=2023-03-01T02:28:27.111Z caller=main.go:96...d"
Mar 01 10:28:27 zsx.com prometheus[108411]: ts=2023-03-01T02:28:27.111Z caller=main.go:11...ml
Mar 01 10:28:27 zsx.com prometheus[108411]: ts=2023-03-01T02:28:27.497Z caller=main.go:1179…µs
Mar 01 10:28:27 zsx.com prometheus[108411]: ts=2023-03-01T02:28:27.498Z caller=main.go:91...."
Hint: Some lines were ellipsized, use -l to show in full.
其它的服务都类似,只需要修改相应 service 文件的一些参数。
NodeExporter 是 Prometheus 提供的一个可以采集到主机信息的应用程序,它能采集到机器的 CPU、内存、磁
盘等信息。
我们从 https://prometheus.io/download/
获取最新的 Node Exporter 版本的二进制包:
下载 node_exporter-1.3.1.linux-amd64.tar.gz
上传到服务器:
使用 tar -xvf node_exporter-1.3.1.linux-amd64.tar.gz
进行解压:
运行 Node Exporter,我们指定用 8080 端口运行:
# 前台运行
$ ./node_exporter --web.listen-address 192.168.2.186:8080
# 后台运行
$ nohup ./node_exporter --web.listen-address 192.168.2.186:8080 >> nohup.out 2>&1 &
启动成功后,可以看到以下输出:
访问 http://192.168.2.186:8080/
,如果没有开放端口需要先开放8080端口:
# 查看开放的端口号
firewall-cmd --list-all
# 设置开放的端口号
firewall-cmd --add-port=8080/tcp --permanent
# 重启防火墙
firewall-cmd --reload
可以看到以下页面:
访问 http://192.168.2.186:8080/metrics
,可以看到当前 node exporter 获取到的当前主机的所有监控数
据,如下所示:
每一个监控指标之前都会有一段类似于如下形式的信息:
# HELP node_cpu_guest_seconds_total Seconds the CPUs spent in guests (VMs) for each mode.
# TYPE node_cpu_guest_seconds_total counter
node_cpu_guest_seconds_total{cpu="0",mode="nice"} 0
node_cpu_guest_seconds_total{cpu="0",mode="user"} 0
其中 HELP
用于解释当前指标的含义,TYPE
则说明当前指标的数据类型,node_cpu_guest_seconds_total
为
监控的具体指标。
除了这些以外,在当前页面中根据物理主机系统的不同,你还可能看到其它的一些监控指标。
现在我们运行了 Prometheus 服务器,也运行了业务数据源 NodeExporter。但此时 Prometheus 还获取不到任
何数据,我们还需要配置下 prometheus.yml
文件,让其去拉取 Node Exporter 的数据。
我们配置一下 Prometheus 的配置文件,让 Prometheus 服务器定时去业务数据源拉取数据。编辑
prometheus.yml
并在 scrape_configs
节点下添加以下内容:
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# 采集node exporter监控数据
- job_name: 'node'
static_configs:
- targets: ['192.168.2.186:8080']
上面配置文件配置了两个任务。一个是名为 prometheus 的任务,其从「localhost:9090」地址读取数据。另一个
是名为 node 的任务,其从「192.168.2.186:8080」地址读取数据。
备注:每次修改配置完成,用promtool检测配置文件是否正确
$ ./promtool check config ./prometheus.yml
配置完成后,我们重新启动 Prometheus。
$ systemctl restart prometheus
重新访问浏览器:
配置完 Prometheus 读取的数据源之后,Prometheus 便可以从 Node Exporter 获取到数据了。那么接下来我们
如何查看到这些数据呢?答案是:Prometheus UI!
Prometheus UI 是 Prometheus 内置的一个可视化管理界面,我们通过 http://192.168.2.186:9090
就可以
访问到该页面。
通过 Prometheus UI 可以查询 Prometheus 收集到的数据,而 Prometheus 定义了 PromQL 语言来作为查询监
控数据的语言,其余 SQL 类似。
接下来我们访问 http://192.168.2.186:9090
,进入到 Prometheus Server。如果输入「up」并且点击执行
按钮以后,可以看到如下结果:
可以看到有几条记录,其中 instance 值为192.168.2.186:8080
的记录,value 是 1
,这代表对应应用是存活状
态。
up{instance="192.168.2.186:8080", job="node"} 1
例如查看我们所运行 NodeExporter 节点所在机器的内存使用情况,可以输入
node_memory_Active_bytes/(1024*1024*1024)
查看。
查看 NodeExporter 节点所在机器 CPU 1 分钟的负载情况,可以输入 node_load1
即可查看。
到这里,我们基本上为完成了数据的收集过程,即数据从业务侧收集到 Prometheus 侧,并且还学会了如何使用
Prometheus 自带的控制台。
这篇文章我们从 Prometheus 的原理入门,剖析了 Prometheus 实现的原理,并且用一个简单的例子从零实现了
一套业务监控系统。通过 Prometheus UI,我们可以实时获取到机器的存活信息、CPU、内存信息。