Prometheus-如何重用已过滤的序列以加快查询时间?

时间:2020-02-19 08:25:33

标签: prometheus

现在,我使用 Prometheus 作为时间序列数据库。我想重复使用过滤后的系列来优化查询时间。

现在我有一个时间序列command_stat{id="x",host="x.x.x.x"},例如:

command_stat{id="0",host="10.x.x.1",stat="requests"}
command_stat{id="0",host="10.x.x.2",stat="requests"}
command_stat{id="1",host="10.x.x.1",stat="requests"}
command_stat{id="1",host="10.x.x.2",stat="requests"}
command_stat{id="2",host="10.x.x.1",stat="requests"}
command_stat{id="2",host="10.x.x.2",stat="requests"}
...

我大约有 10000个命令和大约 500个命令ID

我将计算每个命令ID的总费率,即:

sum(rate(command_stat{stat="requests"}[5m])) by (id)

我应该比较该值和最近15天中的值。例如,我将计算:

sum(rate(command_stat{stat="requests"}[5m] offset 1d)) by (id)
sum(rate(command_stat{stat="requests"}[5m] offset 2d)) by (id)
sum(rate(command_stat{stat="requests"}[5m] offset 3d)) by (id)
...
sum(rate(command_stat{stat="requests"}[5m] offset 15d)) by (id)

我还应该根据15个值计算平均值标准偏差。 使用平均值,我可以使用avg(...) by (id),对于标准偏差,我可以使用stddev(...) by (id)

标准偏差的示例,应为:

stddev (
  label_replace(sum(rate(command_stat{stat_name="requests"}[5m] offset 1d)) by (id), "time", "1d", "", ".*") or
  label_replace(sum(rate(command_stat{stat_name="requests"}[5m] offset 2d)) by (id), "time", "2d", "", ".*") or
  ...
  label_replace(sum(rate(command_stat{stat_name="requests"}[5m] offset 15d)) by (id), "time", "15d", "", ".*")
) by (id)

查询时间太慢,我想通过只检查以下条件的命令ID来加快速度:

sum(rate(command_stat{stat="requests"}[5m])) by (id) > 1000

在这种情况下,应检查的命令数仅约为 40 。我只想在〜 40 命令上计算平均值标准偏差

您能帮我优化这个问题吗?我认为我们可以按上述条件过滤后再使用command_stat系列。

1 个答案:

答案 0 :(得分:0)

我错过了普罗米修斯的recording rules。我想我可以使用此功能来预先计算系列:

sum(rate(command_stat{stat="requests"}[5m])) by (id)

然后我可以计算平均值标准偏差

如果您有更好的解决方案,请告诉我进行改进。

谢谢!