在 Prometheus 中,"分辨率" 指的是数据采集和存储的粒度。它通常与采样率和存储的时间序列数据的精度有关。Prometheus 采集的指标数据是基于时间序列的,每个时间序列数据点都包含了一个时间戳和一个值。
分辨率可以从两个方面来理解:
采集分辨率:这是指 Prometheus 从目标(例如服务或应用程序)采集指标数据的频率。默认情况下,Prometheus 每秒采集一次数据,这意味着每个指标的时间序列数据点之间的时间间隔是 1 秒。然而,可以通过配置来调整这个采集频率,以适应不同的需求。
存储分辨率:这是指 Prometheus 在存储时间序列数据时所保留的精度。默认情况下,Prometheus 会将采集到的数据以 15 秒的分辨率存储,这意味着每个数据点实际上代表的是 15 秒内的平均值。这种降采样(downsampling)是为了减少存储需求和查询负载。然而,Prometheus 也支持存储原始数据或更高分辨率的数据,这可以通过配置调整。
在查询 Prometheus 时,你可以通过指定时间范围和分辨率来获取数据。例如,你可以请求过去 30 分钟内每分钟的平均数据,或者你可以请求每 5 分钟的速率数据。Prometheus 会根据你的请求和存储的数据分辨率来返回相应的结果。
注意:分辨率的选择应该根据你的具体需求和数据特性来决定。过高的分辨率会增加存储和查询的负载,而过低的分辨率可能会丢失一些重要的细节信息。因此,在实际使用中,需要根据监控目标的特点和业务需求来平衡分辨率的选择。
返回过去 30 分钟内 http_requests_total 指标的 5 分钟速率,分辨率为 1 分钟。
rate(prometheus_http_requests_total[5m])[30m:1m]
让我们逐步分析这个查询:
prometheus_http_requests_total[5m] 这部分选择了 prometheus_http_requests_total 指标在过去 5 分钟内的数据点。[5m] 表示一个范围向量选择器,它选择了一个时间窗口内的数据点。
rate(...) 函数 rate() 计算指标的平均增长率。在这个例子中,它计算了 prometheus_http_requests_total 指标在过去 5 分钟内的平均增长率。rate() 函数会对选定的时间窗口内的数据点进行采样,并计算这些样本点之间的增长率。
rate(prometheus_http_requests_total[5m])[30m:1m] 这里的 [30m:1m] 是一个矩阵选择器。它选择了过去 30 分钟内每 1 分钟的数据点。
执行结果如下图:
这是一个嵌套子查询的示例,用于 deriv 函数的子查询使用默认分辨率:
max_over_time(deriv(rate(prometheus_http_requests_total[5s])[30s:5s])[10m:])
让我们逐步分析这个查询:
prometheus_http_requests_total[5m] 选择了 prometheus_http_requests_total 指标在过去5分钟内的数据点。
rate(prometheus_http_requests_total[5m]) 使用 rate() 函数计算了prometheus_http_requests_total 指标在过去5分钟内的平均增长率。
rate(prometheus_http_requests_total[5m])[30m:5m] 使用矩阵选择器 [30m:5m] 选择了过去30分钟内,每5分钟计算一次的平均增长率。
deriv(...) 函数 deriv() 计算了输入矩阵的导数,即增长率的变化率。在这个上下文中,它计算了每5分钟平均增长率的变化率。
deriv(rate(prometheus_http_requests_total[5m])[30m:5m])[1h:] 使用范围向量选择器 [1h:] 选择了从1小时前到现在的数据点,这些数据点是每5分钟平均增长率的变化率。
max_over_time(...) 函数 max_over_time() 从其输入的时间序列中选择每个时间点的最大值。在这个查询中,它返回了从1小时前到现在的时间段内,每5分钟平均增长率的变化率的最大值。
总结来说,这个查询的目的是找到在过去1小时内,prometheus_http_requests_total 指标每5分钟平均增长率的变化率的最大值。这可以帮助你识别出在指定时间段内,请求速率变化率的最大峰值,这可能是由于某些突发事件或系统行为引起的。
执行结果如下图: