如何解决只有在一个时间窗口中存在多个值时,我才能对值进行分组吗?
我正在使用一个每分钟轮询一次的轮询器,我按小时从它查询汇总数据。 1 分钟的数据看起来像这样
my_metric{system="sys1",subsystem="ss1",group="A"} 1
my_metric{system="sys1",subsystem="ss2",subsystem="ss3",group="B"} 1
my_metric{system="sys2",subsystem="ss4",group="A"} 1
my_metric{system="sys2",subsystem="ss5",group="B"} 1
my_metric{system="sys2",subsystem="ss6",group="A"} 1
我想计算每个组中每小时的系统数量。但是,有些系统会在 1 小时窗口内经历从 A 到 B 的更改,并且使用 count by (system,group)
或类似查询会将这些系统计数两次。那么有没有办法使用 label_replace 或 group 或 count distinct 来做类似的事情 - 如果 A 和 B 都存在于 1 小时窗口内,那么 label_replace 与“已更新”?
解决方法
如果无法测试查询,就很难猜测它们是否会按预期工作,尤其是对于这些非平凡的查询。
我们需要的第一个运算符是 unless
运算符。它的工作原理类似于 XOR
metricA unless metricB
当 metricB
不存在时返回 metricA,当 metricB
不存在时返回 metricA
。结合 avg_over_time
,我们可以执行以下操作:
avg_over_time(my_metric{group="A"}[1h])
unless
avg_over_time(my_metric{group="B"}[1h])
为我们提供过去一小时内仅存在于一个组中的所有指标。
现在我们需要处理系统切换组的情况。在这种情况下,您需要决定是否要为 A 或 B 计数。在那里我们可以使用 and
运算符,
metricA and metricB
返回指标 A 的值,其中还存在指标 B。
avg_over_time(my_metric{group="A"}[1h])
and
avg_over_time(my_metric{group="B"}[1h])
返回 A 组的指标(如果它们同时存在)。 (如果反过来需要,只需切换 A 和 B)
下一个运算符是 or
:
metricA or metricB
只要它存在就只返回 metricA,而当度量 A 不存在时它返回 metricB。
(
avg_over_time(my_metric{group="A"}[1h])
unless
avg_over_time(my_metric{group="B"}[1h])
)
or
(
avg_over_time(my_metric{group="A"}[1h])
and
avg_over_time(my_metric{group="B"}[1h])
)
现在应该返回仅存在于一个组中的指标,或者如果仅存在于两个组中,则返回 B 组的指标。您唯一需要做的就是在它周围放置一个 count by (group)
,它应该会为您带来预期的结果。
(一般来说,逐步构建重要查询并每次对其进行测试是一种很好的做法,这样您就知道计算了哪些指标,以及它们是否正是您要查找的指标)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。