1

注:图片来源百度,侵删

参考官方文档:https://prometheus.io/docs/prometheus/latest/querying/functions

1. 理解rate函数

rate函数是用于计算时间序列数据的速率(rate)的函数之一。
rate函数的公式为:

rate(metric[range-vector])

其中metric是一个指标名称,range-vector是一个时间段范围,例如[5m]表示5分钟的时间范围。该函数返回的是在指定时间范围内,每秒钟平均值的变化率。

例如,假设我们有一个名为http_requests_total的指标,表示每秒钟HTTP请求的数量。如果我们想要计算过去5分钟中的HTTP请求速率,则可以使用以下查询:

rate(http_requests_total[5m])

这将返回过去5分钟内HTTP请求的平均速率,单位为每秒。
在实际应用中,rate函数通常与其他函数结合使用,例如sum或avg,以便计算多个时间序列的速率或平均速率。例如,如果我们想要计算所有Web服务器的HTTP请求速率,则可以使用以下查询:

sum(rate(http_requests_total[5m])) by (instance)

这将返回每个Web服务器的HTTP请求速率总和,单位为每秒。
图片

图片

2. 理解sum函数

sum函数是用于计算时间序列数据总和的函数之一。
sum函数的公式为:

sum(metric[by-label-list])

其中metric是一个指标名称,by-label-list是一个可选的标签列表,用于指定要对哪些标签进行求和。如果未指定标签,则将对所有标签进行求和。

例如,假设我们有一个名为http_requests_total的指标,表示每个Web服务器上的HTTP请求总数。如果我们想要计算所有Web服务器上的HTTP请求总数,则可以使用以下查询:

sum(http_requests_total)

如果我们想按实例(instance)标签对HTTP请求总数进行求和,则可以使用以下查询:

sum(http_requests_total) by (instance)

在实际应用中,sum函数通常与其他函数结合使用,例如rateavg,以便计算多个时间序列的总和或平均值。例如,如果我们想要计算所有Web服务器的HTTP请求速率总和,则可以使用以下查询:

sum(rate(http_requests_total[5m])) by (instance)

这将返回每个Web服务器的HTTP请求速率总和,单位为每秒。

3. 理解histogram_quantile函数

histogram_quantile函数是用于计算分位数(quantile)的函数之一。分位数是指将一组数据按升序排序后,第p分位数是这组数据中最小的元素到第p×100%的元素的范围。histogram_quantile函数的公式为:

histogram_quantile(φ, bucket_selector(metric_name[by_label_list], ≤ bucket))

其中,φ是分位数,metric_name是一个指标名称,bucket是一个桶的边界值,by_label_list是可选的标签列表。

该函数返回指定分位数的值,可以用于分析指标分布的特征。

例如,假设我们有一个名为http_request_duration_seconds的指标,表示HTTP请求的响应时间。我们可以使用histogram类型来收集数据,并将其分为不同的桶,每个桶表示不同范围的响应时间。

如果我们想要计算95%的HTTP请求的响应时间,则可以使用以下查询:

histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))

该查询将计算过去5分钟内HTTP请求响应时间在95%分位数处的值。
其中,http_request_duration_seconds_bucket是用于存储分段数据的指标名称,le是用于标识桶边界的标签。在实际应用中,可以将histogram_quantile函数与其他函数结合使用,例如sumavg,以便计算多个时间序列的分位数或平均分位数。

例如,如果我们想要计算所有Web服务器的HTTP请求响应时间的中位数,则可以使用以下查询:

histogram_quantile(0.5, sum(rate(http_request_duration_seconds_bucket[5m])) by (le, instance))

这将返回每个Web服务器的HTTP请求响应时间中位数,单位为秒。
在此查询中,我们按instance标签对HTTP请求响应时间进行分组,以便计算每个Web服务器的中位数。

4. 理解irate函数

irate函数用于计算时间序列数据的瞬时变化率。与rate函数不同,irate函数会考虑数据的最近两个时间点之间的差异,并将其视为瞬时速率。
irate函数的公式为:

irate(metric[range-vector])

其中metric是一个指标名称,range-vector是一个时间段范围,例如[5m]表示5分钟的时间范围。该函数返回的是在指定时间范围内,最近两个数据点之间的变化率。

当使用irate函数时,Prometheus会根据最近两个数据点之间的时间间隔计算变化率,而不考虑时间范围内的其他数据点。这使得irate函数更适用于测量瞬时速率,特别是在数据采集间隔较大或数据点不均匀分布的情况下。

例如,假设我们有一个名为http_requests_total的指标,表示每秒的HTTP请求数量。如果我们想要计算过去5分钟内的HTTP请求数量的瞬时变化率,则可以使用以下查询:

irate(http_requests_total[5m])

这将返回过去5分钟内HTTP请求数量的瞬时变化率,单位为每秒。
在实际应用中,irate函数通常与其他函数结合使用,例如sumavg,以计算多个时间序列的瞬时变化率或平均瞬时变化率。

例如,如果我们想要计算所有Web服务器的HTTP请求数量的瞬时变化率总和,则可以使用以下查询:

sum(irate(http_requests_total[5m])) by (instance)

这将返回每个Web服务器的HTTP请求数量的瞬时变化率总和,单位为每秒。
图片

5. 理解round函数

round函数用于将时间序列数据的值舍入到指定的精度。它可以用于对数据进行舍入,以便更好地适应可视化或聚合需求。
round函数的公式为:

round(metric, precision)

其中metric是一个指标名称或表达式,precision是要舍入到的小数位数。该函数返回的结果是将指定的指标或表达式中的值舍入到指定精度后的结果。

例如,假设我们有一个名为cpu_usage的指标,表示CPU使用率。如果我们希望将CPU使用率的值舍入到小数点后两位,则可以使用以下查询:

round(cpu_usage, 0.01)

这将返回将cpu_usage指标的值舍入到小数点后两位的结果。
在实际应用中,round函数通常与其他函数或表达式结合使用,以便进行更复杂的计算或数据处理。

例如,如果我们希望计算所有Web服务器的平均CPU使用率,并将结果舍入到小数点后两位,则可以使用以下查询:

round(avg(cpu_usage) by (instance), 0.01)

这将返回将每个Web服务器的CPU使用率取平均后的结果,并将其舍入到小数点后两位。在此查询中,我们使用avg函数计算每个实例的平均CPU使用率,然后使用round函数将结果舍入到指定精度。

6. 理解metric type

在Prometheus指标采集中,有几种常见的指标类型,包括Counter(计数器)、Gauge(仪表盘)、Histogram(直方图)和Summary(摘要)。这些类型用于表示不同类型的数据和度量标准,提供了在监控和分析系统性能时需要的不同维度和粒度。

以下是对这些指标类型的解释:

  1. Counter(计数器):

    Counter是一个递增的整数指标,用于表示累计事件的数量,如请求数、错误数等。它只能增加或归零,适用于单调递增的计数场景。例如,记录一个HTTP请求的计数。
  2. Gauge(仪表盘):

    Gauge是一个表示瞬时值的指标,可以增加或减少,也可以保持不变。它用于表示度量标准的当前状态,如CPU使用率、内存使用量等。例如,记录当前活动用户数。
  3. Histogram(直方图):

    Histogram是一个用于度量分布情况的指标类型。它将观测值分桶,并计算在每个桶内的观测值数量。Histogram还提供了分位数估计值,用于衡量给定阈值以下的观测值的百分比。例如,记录请求延迟时间的直方图。
  4. Summary(摘要):

    Summary是类似于直方图的指标类型,但它计算的是观测值的总数和总和,并允许计算分位数。与直方图不同的是,Summary会在客户端(Exporter)上对数据进行采样和汇总,然后将摘要数据发送到Prometheus。摘要适用于对长期观测值进行摘要统计,例如请求持续时间的摘要。

通过选择适当的指标类型,可以更好地描述所要度量的数据和指标,并提供有关系统性能和行为的详细信息。这些指标类型在Prometheus中具有不同的聚合和查询方法,可以通过PromQL进行处理和分析。

7. 举例:CPU使用量与使用率使用量

container_cpu_usage_seconds_total

Cumulative cpu time consumed in seconds
统计容器内所有核的cpu使用时间,是随着时间累加的数值。

比如我们想统计pod: node-isolation-agent-b2tg7的cpu使用量,那么其表达式如下

container_cpu_usage_seconds_total{pod="node-isolation-agent-b2tg7"}

pod中有两个container: POD、node-agent,再加上整个pod的使用率,所以总共3个。

  • container="POD": 本质是pause容器,对应第一条
  • container="node-agent": 对应第二条
  • Pod的CPU总使用量: 对应第三条

如果pod中有多个container,那么会列出每个container的Cpu使用量,最终再统计一条总的使用量。在统计指标时,我们只统计总使用量即可, 即6078.867601753。
图片

使用率

container_cpu_usage_rate

假设我们想统计pod: node-isolation-agent-b2tg7的cpu使用率,那么其表达式应如下

sum by(pod, namespace, container) 
(rate(container_cpu_usage_seconds_total{pod="node-isolation-agent-b2tg7"}[3m])) * 1000
  • sum by(pod, namespace, container) 代表对变化率进行求和并按照pod, namespace, container的维度统计。
  • rate(container_cpu_usage_seconds_total{pod="node-isolation-agent-b2tg7"}[3m])代表,每3m时间段,其cpu使用量的变化率的平均值。

蓝色瞳仁
33 声望2 粉丝

IT咸鱼,愿不忘初心