现在,我使用 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
系列。
答案 0 :(得分:0)
我错过了普罗米修斯的recording rules。我想我可以使用此功能来预先计算系列:
sum(rate(command_stat{stat="requests"}[5m])) by (id)
然后我可以计算平均值和标准偏差。
如果您有更好的解决方案,请告诉我进行改进。
谢谢!