Prometheus运维六 PromQL查询语言详解及操作

海阔凭鱼跃,天高任鸟飞

Prometheus官网:https://prometheus.io/

1.什么是PromQL?

PromQL是Prometheus的标准查询语句,**Prometheus 通过指标名称(metrics name)以及对应的一组标签(labelset)唯一定义一条时间序列。**指标名称反映了监控样本的基本标识,而 label 则在这个基本特征上为采集到的数据提供了多种特征维度。用户可以基于这些特征维度过滤,聚合,统计从而产生新的计算后的一条时间序列。

Prometheus 提供内置 PromQL 功能查询语言,提供对时间序列数据丰富的查询,聚合以及逻辑运算能力的支持。使用户可以实时选择和汇总时间序列数据。表达式的结果可以显示为图形,可以在 Prometheus 的表达式浏览器中显示为表格数据,也可以由外部系统通过 HTTP API 使用。

在 Prometheus 的表达语言中,一个表达式或子表达式可以计算为以下四种类型之一:
瞬时向量(Instant vector):它是指在同一时刻,抓取所有度量指标数据。这些度量指标数据的key都是相同的,也就是相同的时间戳.
范围向量(Range vector):它是指在任何一个时间范围内,抓取所有度量指标数据.
标量(Scalar):一个简单的数字浮点值。
字符串(String):一个未被使用的简单字符串值.
注意:根据表达式的不同,得出的图像也是有范围性的。例如仪表盘的数据只能显示瞬时向量。

2.PromQL的基本使用

2.1时间序列选择器

什么是时间序列?
通过Node Exporter暴露的HTTP服务,Prometheus可以采集到当前主机所有监控指标的样本数据。例如:

# HELP node_cpu Seconds the cpus spent in each mode.
# TYPE node_cpu counter
node_cpu{
   cpu="cpu0",mode="idle"} 362812.7890625
# HELP node_load1 1m load average.
# TYPE node_load1 gauge
node_load1 3.0703125

其中非#开头的每一行表示当前Node Exporter采集到的一个监控样本:node_cpu和node_load1表明了当前指标的名称、大括号中的标签则反映了当前样本的一些特征和维度、浮点数则是该监控样本的具体值。

样本
Prometheus会将所有采集到的样本数据以时间序列(time-series)的方式保存在内存数据库中,并且定时保存到硬盘上。
time-series是按照时间戳和值的序列顺序存放的,我们称之为向量(vector). 每条time-series通过指标名称(metrics name)和一组标签集(labelset)命名。
如下所示,可以将time-series理解为一个以时间为Y轴的数字矩阵:

  ^
  │   . . . . . . . . . . . . . . . . .   . .   node_cpu{
   cpu="cpu0",mode="idle"}. . . . . . . . . . . . . . . . . . .   node_cpu{
   cpu="cpu0",mode="system"}. . . . . . . . . .   . . . . . . . .   node_load1{
   }. . . . . . . . . . . . . . . .   . .  
  v
    <------------------ 时间 ---------------->

在time-series中的每一个点称为一个样本(sample),样本由以下三部分组成:
指标(metric):metric name和描述当前样本特征的labelsets;
时间戳(timestamp):一个精确到毫秒的时间戳;
样本值(value): 一个float64的浮点型数据表示当前样本的值。

<--------------- metric ---------------------><-timestamp -><-value->
http_request_total{
   status="200", method="GET"}@1434417560938 => 94355
http_request_total{
   status="200", method="GET"}@1434417561287 => 94334

http_request_total{
   status="404", method="GET"}@1434417560938 => 38473
http_request_total{
   status="404", method="GET"}@1434417561287 => 38544

http_request_total{
   status="200", method="POST"}@1434417560938 => 4748
http_request_total{
   status="200", method="POST"}@1434417561287 => 4785

指标(Metric)
在形式上,所有的指标(Metric)都通过如下格式标示:

<metric name>{
   <label name>=<label value>, ...}

指标的名称(metric name)可以反映被监控样本的含义(比如,http_request_total - 表示当前系统接收到的HTTP请求总量)。指标名称只能由ASCII字符、数字、下划线以及冒号组成并必须符合正则表达式[a-zA-Z_:][a-zA-Z0-9_:]*。

标签(label)反映了当前样本的特征维度,通过这些维度Prometheus可以对样本数据进行过滤,聚合等。标签的名称只能由ASCII字符、数字以及下划线组成并满足正则表达式[a-zA-Z_][a-zA-Z0-9_]*。

其中以__作为前缀的标签,是系统保留的关键字,只能在系统内部使用。标签的值则可以包含任何Unicode编码的字符。在Prometheus的底层实现中指标名称实际上是以__name__=的形式保存在数据库中的,因此以下两种方式均表示的同一条time-series:

api_http_requests_total{
   method="POST", handler="/messages"}

等同于:

{
   __name__="api_http_requests_total",method="POST", handler="/messages"}

在Prometheus源码中也可以找到指标(Metric)对应的数据结构,如下所示:

type Metric LabelSet

type LabelSet map[LabelName]LabelValue

type LabelName string

type LabelValue string

Metrics类型
在Prometheus的存储实现上所有的监控样本都是以time-series的形式保存在Prometheus内存的TSDB(时序数据库)中,而time-series所对应的监控指标(metric)也是通过labelset进行唯一命名的。

从存储上来讲所有的监控指标metric都是相同的,但是在不同的场景下这些metric又有一些细微的差异。 例如,在Node Exporter返回的样本中指标node_load1反应的是当前系统的负载状态,随着时间的变化这个指标返回的样本数据是在不断变化的。而指标node_cpu所获取到的样本数据却不同,它是一个持续增大的值,因为其反应的是CPU的累积使用时间,从理论上讲只要系统不关机,这个值是会无限变大的。

为了能够帮助用户理解和区分这些不同监控指标之间的差异,Prometheus定义了4种不同的指标类型(metric type):Counter(计数器)、Gauge(仪表盘)、Histogram(直方图)、Summary(摘要)。

在Exporter返回的样本数据中,其注释中也包含了该样本的类型。例如:

# HELP node_cpu Seconds the cpus spent in each mode.
# TYPE node_cpu counter
node_cpu{
   cpu="cpu0",mode="idle"} 362812.7890625

Counter:只增不减的计数器
Counter类型的指标其工作方式和计数器一样,只增不减(除非系统发生重置)。常见的监控指标,如http_requests_total,node_cpu都是Counter类型的监控指标。 一般在定义Counter类型指标的名称时推荐使用_total作为后缀。

Counter是一个简单但有强大的工具,例如我们可以在应用程序中记录某些事件发生的次数,通过以时序的形式存储这些数据,我们可以轻松的了解该事件产生速率的变化。 PromQL内置的聚合操作和函数可以让用户对这些数据进行进一步的分析:
例如,通过rate()函数获取HTTP请求量的增长率:

rate(http_requests_total[5m])

查询当前系统中,访问量前10的HTTP地址:

topk(10, http_requests_total)

Gauge:可增可减的仪表盘
与Counter不同,**Gauge类型的指标侧重于反应系统的当前状态。因此这类指标的样本数据可增可减。**常见指标如:node_memory_MemFree(主机当前空闲的内容大小)、node_memory_MemAvailable(可用内存大小)都是Gauge类型的监控指标。

通过Gauge指标,用户可以直接查看系统的当前状态:

node_memory_MemFree

对于Gauge类型的监控指标,通**过PromQL内置函数delta()可以获取样本在一段时间返回内的变化情况。**例如,计算CPU温度在两个小时内的差异:

delta(cpu_temp_celsius{
   host="zeus"}[2h])

还可以使用deriv()计算样本的线性回归模型,甚至是直接使用predict_linear()对数据的变化趋势进行预测。例如,预测系统磁盘空间在4个小时之后的剩余情况:

predict_linear(node_filesystem_free{
   job="node"}[1h], 4 * 3600)

使用Histogram和Summary分析数据分布情况
除了Counter和Gauge类型的监控指标以外,Prometheus还定义了Histogram和Summary的指标类型。Histogram和Summary主用用于统计和分析样本的分布情况。

在大多数情况下人们都倾向于使用某些量化指标的平均值,例如CPU的平均使用率、页面的平均响应时间。这种方式的问题很明显,以系统API调用的平均响应时间为例:如果大多数API请求都维持在100ms的响应时间范围内,而个别请求的响应时间需要5s,那么就会导致某些WEB页面的响应时间落到中位数的情况,而这种现象被称为长尾问题。

为了区分是平均的慢还是长尾的慢,最简单的方式就是按照请求延迟的范围进行分组。例如,统计延迟在0到10ms之间的请求数有多少而10~20ms之间的请求数又有多少。通过这种方式可以快速分析系统慢的原因。Histogram和Summary都是为了能够解决这样问题的存在,通过Histogram和Summary类型的监控指标,我们可以快速了解监控样本的分布情况。

例如,指标prometheus_tsdb_wal_fsync_duration_seconds的指标类型为Summary。 它记录了Prometheus Server中wal_fsync处理的处理时间,通过访问Prometheus Server的/metrics地址,可以获取到以下监控样本数据:

# HELP prometheus_tsdb_wal_fsync_duration_seconds Duration of WAL fsync.
# TYPE prometheus_tsdb_wal_fsync_duration_seconds summary
prometheus_tsdb_wal_fsync_duration_seconds{
   quantile="0.5"} 0.012352463
prometheus_tsdb_wal_fsync_duration_seconds{
   quantile="0.9"} 0.014458005
prometheus_tsdb_wal_fsync_duration_seconds{
   quantile="0.99"} 0.
  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Prometheus 是一个流行的开源监控系统,广泛应用于云原生环境中。以下是一些常用的 Prometheus 运维操作指南: 1. 安装和配置 Prometheus:下载 Prometheus 的二进制文件,创建配置文件 prometheus.yml,配置监控目标和告警规则。 2. 监控目标管理:Prometheus 可以监控多种目标,包括 HTTP、TCP、UDP 等服务。在 prometheus.yml 中添加新的目标,并通过 Prometheus 的 Web 界面查看监控指标。 3. 查询和可视化监控指标:Prometheus 提供了强大的查询语言 PromQL,可以用于查询和聚合监控指标。Grafana 是一个流行的监控可视化工具,可以与 Prometheus 集成,提供丰富的可视化功能。 4. 告警设置和管理:Prometheus 可以基于监控指标的阈值设置告警规则,并通过 Alertmanager 发送告警通知。在 prometheus.yml 中配置告警规则,并设置 Alertmanager 的通知方式。 5. 数据备份和恢复:Prometheus 的数据存储在本地硬盘上,默认情况下使用本地文件系统作为存储后端。为了防止数据丢失,需要定期备份数据文件并进行恢复测试。 6. 性能调优和容量规划:Prometheus 的性能与存储容量密切相关,需要对系统进行性能调优和容量规划。例如,可以调整采样频率、增加存储容量、使用分布式存储等方式提高系统性能和可扩展性。 以上是一些常用的 Prometheus 运维操作指南,但是还有很多细节需要注意,例如安全性、高可用性、自动化部署等方面。建议运维人员在使用 Prometheus 之前,对其进行深入学习和实践。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值