一、先搞懂两个基础概念:Prometheus 和 PromQL

在说实时数据分析之前,得先把两个核心工具的作用掰明白,不然容易混淆。Prometheus 其实就是一个专门收集各种系统、服务运行数据的“大仓库”,比如你做的网站有没有卡顿、服务器CPU用了多少、数据库连不上的次数有多少,这些零散的运行数据都会被它定时收起来存好。而 PromQL 就是这个仓库的“专属查询工具”,它不是那种通用的SQL,是专门用来从Prometheus存的实时数据里,快速找出你要的信息、算出结果的语言。 举个最直白的例子:你家里的智能电表(相当于Prometheus)会每15分钟记一次用电量,你想知道今天每小时的用电量变化,就得用专门的电表APP(相当于PromQL)去查、去算,而不是用普通的计算器(通用查询工具)凑。

二、PromQL 实时数据分析的核心场景

PromQL 最适合做的就是“当下正在发生的事”的分析,而不是翻几个月前的旧账,下面说几个最常用的场景,都是实际开发中天天会碰到的。

2.1 实时监控服务的健康状态

比如你做的一个电商下单服务,突然下单量掉了一半,你得马上知道是不是服务本身出问题了?PromQL 就能实时查这个服务的接口调用成功率、响应时间,不用等日志慢慢导出来。

2.2 实时排查系统瓶颈

比如你的网站突然变卡,是服务器CPU占满了?还是内存不够?PromQL 能实时拉取服务器的各项指标,快速定位问题点。

2.3 实时统计业务数据

比如双11的时候,实时看每秒的订单量、支付成功率,不用等后台统计系统慢慢算,PromQL 能直接从实时数据里出结果。

三、PromQL 实时数据分析的完整示例

这里所有示例统一使用 Prometheus 自带的测试指标 + PromQL 语法,所有代码块都标注清楚,方便直接复制测试。

3.1 示例前的准备:先装个测试环境

先把Prometheus装起来,用来存测试数据,装完后就能直接用自带的测试指标来练手了,安装命令如下(Shell 命令):

# 下载最新版Prometheus(以Linux amd64版本为例)
wget https://github.com/prometheus/prometheus/releases/download/v2.47.0/prometheus-2.47.0.linux-amd64.tar.gz
# 解压文件
tar xvfz prometheus-2.47.0.linux-amd64.tar.gz
# 进入解压后的目录
cd prometheus-2.47.0.linux-amd64
# 启动Prometheus,默认端口9090
./prometheus --config.file=prometheus.yml

启动后打开浏览器访问 http://localhost:9090 就能进入Prometheus的Web界面,后面的示例都在这个界面的查询框里输入PromQL语句运行。

3.2 示例1:实时查询单个指标的当前值

比如你想知道当前服务器的CPU使用率,PromQL里有个自带的测试指标叫 process_cpu_seconds_total,这个指标记录了进程启动后总共用了多少CPU时间,要算当前的使用率,就得用 rate() 函数,这个函数专门用来算指标的变化率,最适合实时数据分析。 完整PromQL语句(注释写在语句后面):

# 计算当前进程的CPU使用率,rate()函数会算过去5分钟内的变化率
rate(process_cpu_seconds_total[5m])

运行后就能得到一个0到1之间的数,乘以100就是百分比,比如结果是0.12,就是当前CPU使用率12%。这里要注意 [5m] 是时间窗口,意思是拿过去5分钟的数据来算变化率,时间窗口不能设太小,不然数据波动太大,结果不准;也不能设太大,不然就不是“实时”了。

3.3 示例2:实时统计多个服务的接口成功率

比如你有3个服务,分别叫order、pay、user,每个服务都有接口调用总数和失败次数的指标,要实时算每个服务的成功率,就得用 sum() 函数分组统计,还要用 by 关键字按服务名分组。 完整PromQL语句:

# 先算每个服务的失败率,再用1减得到成功率,乘以100转成百分比
sum(rate(http_requests_total{status_code=~"5.."}[5m])) by (service) 
/ 
sum(rate(http_requests_total[5m])) by (service) 
* 100

这里的 status_code=~"5.." 是正则匹配,意思是所有5开头的状态码(也就是服务端错误),sum(rate(...)) by (service) 是按服务名分组统计,运行后就能得到每个服务的实时成功率,比如order服务的成功率是99.8%,pay服务是99.5%,一眼就能看出哪个服务有问题。

3.4 示例3:实时对比两个指标的差值

比如你想知道当前服务器的内存使用率,Prometheus里有 process_resident_memory_bytes(当前占用的内存大小)和 process_virtual_memory_bytes(总共能使用的内存大小)两个指标,要算使用率就得用这两个指标相除。 完整PromQL语句:

# 计算当前进程的内存使用率,乘以100转成百分比
process_resident_memory_bytes / process_virtual_memory_bytes * 100

运行后就能得到内存使用率的百分比,比如结果是45.2,就是当前内存用了45.2%。

四、PromQL 实时数据分析的优缺点

4.1 优点

第一,实时性强,Prometheus每15秒(默认)就会收集一次数据,PromQL能直接用最新的数据计算,延迟只有几秒到几十秒,完全满足实时分析的需求。 第二,语法简单,不用学复杂的SQL,只要搞懂几个常用函数(rate、sum、avg等)和关键字(by、offset等)就能上手,适合不同基础的开发者。 第三,性能好,PromQL是专门为Prometheus的存储结构设计的,查询速度非常快,就算是查几千个指标的实时数据,也能在几百毫秒内出结果。 第四,支持多维度查询,能按服务名、接口名、地域等多个维度分组统计,满足复杂的实时分析需求。

4.2 缺点

第一,只适合实时或近实时分析,不适合做历史数据分析,比如查一年前的某个指标的平均值,用PromQL就不如专门的大数据分析工具。 第二,功能有限,没有复杂的逻辑判断、循环等功能,只能做简单的统计、计算,复杂的业务分析还得结合其他工具。 第三,对新手不友好的点:指标命名不规范的话,查询语句会写得很复杂,比如同一个服务的接口调用数指标有的叫http_requests_total,有的叫api_call_total,就得写多个查询语句才能合并统计。

五、PromQL 实时数据分析的注意事项

第一,时间窗口要合理设置,比如查CPU使用率,时间窗口设1分钟的话,数据波动太大,结果不准;设1小时的话,就失去了实时性,一般设5到15分钟比较合适。 第二,指标命名要规范,最好按“业务类型_指标名_维度”的规则命名,比如order_service_success_count_by_service,这样查询的时候按维度分组很方便,不会出现混乱。 第三,避免过度查询,Prometheus的Web界面如果频繁查复杂的PromQL语句,会占用很多CPU和内存,影响Prometheus的正常运行,生产环境最好用专门的监控工具(比如Grafana)来展示实时数据,而不是直接在Prometheus的Web界面频繁查询。 第四,注意单位转换,比如有的指标是字节,有的是千字节,有的是百分比,查询的时候要统一单位,不然结果会出错,比如查内存使用率的时候,两个指标的单位都是字节,相除后就是百分比,不用额外转换,但如果一个是字节一个是千字节,就得先转成同一个单位再计算。 第五,正则匹配要准确,比如匹配状态码的时候,status_code=~"5..") 会匹配所有5开头的状态码,status_code="500" 只会匹配500状态码,要根据实际需求选择,不然会统计错数据。

六、文章总结

PromQL 是做实时数据分析的利器,尤其是针对系统、服务、业务的实时监控和排查,能快速帮开发者定位问题、统计数据。只要搞懂基础概念、常用函数和语法,再结合实际场景多练,就能很快上手。当然,它也不是万能的,复杂的历史分析、业务建模还是要结合其他工具,但对于实时数据分析这个场景来说,PromQL 足够简单、高效、好用。