我有多个时间序列延迟度量,每个kubernetes吊舱都有一个。我需要计算整个服务的p99延迟度量,即每隔5分钟计算一次所有豆荚的总和。我该怎么做?
下面是时间序列数据的示例:
service_latency(app=“payments”,pod_name=“pod1”)
service_latency(app=“payments”,pod_name=“pod2”)
service_latency(app=“payments”,pod_name=“pod3”)PromQl到目前为止:
quantile_over_time(0.99, service_latency{app=“payments”}[5m])
但是,上面的PromQL为每个pod返回p99度量,而不是对整个服务返回。我也不确定它是否真的像我想的那样每5分钟计算一次p99。
这里的PromQL专家能帮忙吗?
发布于 2022-09-25 10:12:20
如果您将每个请求的延迟存储为一个单独的带有service_latency名称的示例,那么Prometheus就无法在给定的lookbehind窗口中计算从多个豆荚(也称为多个时间序列)收到的所有样本的百分位数。
我建议改用普罗米修斯直方图。直方图桶可以在多个时间序列上进行聚合,因此您可以使用以下查询来估计给定后视窗口上多个豆荚上所需的百分位数:
histogram_quantile(
0.99,
sum(increase(
service_latency_seconds_bucket[5m]
)) by (le)
)见分位数文档。
与每次将每个传入请求单独存储到Prometheus时相比,直方图通常在查询期间需要更少的磁盘空间和更少的cpu。在每秒提供数千个请求的高加载服务中,这一点尤其明显。
如果您仍然决定坚持当前模式(例如,在tsdb中存储每个传入请求一个单独的示例),那么您可以尝试使用VictoriaMetrics --这是一个类似Prometheus的监视系统。它提供了时间函数,它在给定的时间范围内计算原始样本的直方图。稍后,返回的直方图可以在多个时间序列上进行聚合,并且可以将histogarm_quantile函数应用于它们。例如,下面的查询估计了过去5分钟内service_latency{app="payments"}时间序列的所有原始样本的第99百分位数:
histogram_quantile(0.99,
sum(histogram_over_time(
service_latency{app="payments"}[5m]
)) by (vmrange)
)另见https://valyala.medium.com/improving-histogram-usability-for-prometheus-and-grafana-bc7e5df0e350
https://stackoverflow.com/questions/73809157
复制相似问题