查询活动和陈旧的普罗米修斯时间序列的最新值超过范围查询
Query most recent values for active & stale Prometheus timeseries over range query
我正在使用 HistogramVec within a Golang HTTP server. Every request’s duration is timed and persisted as described in the Prometheus practices 通过 Prometheus 记录和监控 Kubernetes Pods 的 SLO(服务器端请求持续时间),并按状态代码、方法和 HTTP 路径进行分区。
我正在进行 运行 自动缩放实验,因此 Pods 已创建并终止。每次实验后,我获取所有 pods 的指标(包括已删除的指标)并绘制累积分布图,例如:
为了使这些图更“准确”,我选择了许多更小的直方图桶,并在本地聚合和分析数据,不使用内置 Histogram Quantiles。 因此,理想的查询将 return 仅是指定时间范围内所有时间序列的最新值(绿色 + 红色圆圈)。
目前,我在生成所有图的脚本中使用 range query,例如:
http://localhost:9090/api/v1/query_range?query=http_request_duration_milliseconds_bucket{path="/service/login"}&start=1591803898&end=1591804801&step=5s
但是,我知道这是非常低效且成本高昂的,因为它会检索大量剩余数据,即使我只对每个时间序列的最后一个值感兴趣。另一方面,如果我使用即时查询,我只会获取指定时刻的值,因此我需要进行多次查询并首先找出某些时间序列(红色圆圈)何时被标记为陈旧 - 这不会'看起来也不错。
所以,基本上我正在寻找一种方法来解决 Prometheus basics on staleness,并停止来自 "disappearing":
的陈旧时间序列
If no sample is found (by default) 5 minutes before a sampling timestamp, no value is returned for that time series at this point in time. This effectively means that time series "disappear" from graphs at times where their latest collected sample is older than 5 minutes or after they are marked stale.
我几乎可以肯定有一种方法可以做到这一点(例如,可以选择简单地包括陈旧的时间序列),但到目前为止我还没能把它放在一起。
根据 this thread as well as increasing the lookbackDelta
QuerySpec option 中的输入找到了另一种方法来执行此操作。
现在正在拍摄诸如
之类的查询
http://localhost:9090/api/v1/query?query=max_over_time(http_request_duration_milliseconds_bucket{path="/service/login",le="101"}[2h])
return 想要的结果:
解决方法是使用last_over_time()函数。例如,以下查询 returns 每个直方图桶在过去一小时内看到的最后值:
last_over_time(http_request_duration_milliseconds_bucket{path="/service/login"}[1h])
此查询必须发送到 /api/v1/query instead of /api/v1/query_range,因为 /api/v1/query
在给定的 time
时间戳仅计算查询一次,而 /api/v1/query_range
计算查询 1+(end-start)/step
次在定时器范围 [start ... end]
的每个点上,间隔为 step
.
另请注意,大量的直方图桶乘以大量的唯一 path
标签值可能会导致时间序列过多,详细信息称为 high cardinality. See this article。
另请参阅 VictoriaMetrics historgrams,它解决了 Prometheus 直方图中的常见问题。
我正在使用 HistogramVec within a Golang HTTP server. Every request’s duration is timed and persisted as described in the Prometheus practices 通过 Prometheus 记录和监控 Kubernetes Pods 的 SLO(服务器端请求持续时间),并按状态代码、方法和 HTTP 路径进行分区。
我正在进行 运行 自动缩放实验,因此 Pods 已创建并终止。每次实验后,我获取所有 pods 的指标(包括已删除的指标)并绘制累积分布图,例如:
http://localhost:9090/api/v1/query_range?query=http_request_duration_milliseconds_bucket{path="/service/login"}&start=1591803898&end=1591804801&step=5s
但是,我知道这是非常低效且成本高昂的,因为它会检索大量剩余数据,即使我只对每个时间序列的最后一个值感兴趣。另一方面,如果我使用即时查询,我只会获取指定时刻的值,因此我需要进行多次查询并首先找出某些时间序列(红色圆圈)何时被标记为陈旧 - 这不会'看起来也不错。
所以,基本上我正在寻找一种方法来解决 Prometheus basics on staleness,并停止来自 "disappearing":
的陈旧时间序列If no sample is found (by default) 5 minutes before a sampling timestamp, no value is returned for that time series at this point in time. This effectively means that time series "disappear" from graphs at times where their latest collected sample is older than 5 minutes or after they are marked stale.
我几乎可以肯定有一种方法可以做到这一点(例如,可以选择简单地包括陈旧的时间序列),但到目前为止我还没能把它放在一起。
根据 this thread as well as increasing the lookbackDelta
QuerySpec option 中的输入找到了另一种方法来执行此操作。
现在正在拍摄诸如
之类的查询http://localhost:9090/api/v1/query?query=max_over_time(http_request_duration_milliseconds_bucket{path="/service/login",le="101"}[2h])
return 想要的结果:
解决方法是使用last_over_time()函数。例如,以下查询 returns 每个直方图桶在过去一小时内看到的最后值:
last_over_time(http_request_duration_milliseconds_bucket{path="/service/login"}[1h])
此查询必须发送到 /api/v1/query instead of /api/v1/query_range,因为 /api/v1/query
在给定的 time
时间戳仅计算查询一次,而 /api/v1/query_range
计算查询 1+(end-start)/step
次在定时器范围 [start ... end]
的每个点上,间隔为 step
.
另请注意,大量的直方图桶乘以大量的唯一 path
标签值可能会导致时间序列过多,详细信息称为 high cardinality. See this article。
另请参阅 VictoriaMetrics historgrams,它解决了 Prometheus 直方图中的常见问题。