我能否仅在一个时间 window 内存在多个值时对值进行分组?

Can I group values only when multiple values exist within a time window?

我正在使用每分钟轮询一次的轮询器,我按小时从中查询汇总数据。 1 分钟的数据看起来像这样

my_metric{system="sys1", subsystem="ss1", group="A"} 1
my_metric{system="sys1", subsystem="ss2", group="A"} 1
my_metric{system="sys1", 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 小时 window 内经历了从 A 到 B 的更改,并且使用 count by (system, group) 或类似查询会将这些系统计数两次。那么有没有一种方法可以使用 label_replace 或 group 或 count distinct 来做类似的事情 - 如果 A 和 B 都存在于 1 小时内 window,那么 label_replace 和“已更新”?

在无法测试查询的情况下,很难猜测它们是否会按预期工作,尤其是对于这些重要的查询。

我们需要的第一个运算符是 unless 运算符。它像 XOR

一样工作
metricA unless metricB

returns metricA 当 metricB 不存在时和 metricBmetricA 不存在时。结合 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 

return为您提供指标 A 的值,其中也存在指标 B。

avg_over_time(my_metric{group="A"}[1h])
and
avg_over_time(my_metric{group="B"}[1h])

return你是 A 组的指标,如果它们同时存在的话。 (如果你需要反过来,只需切换A和B)

下一个运算符是or:

metricA or metricB

只要 metricA 存在就简单,而当 metric A 不存在时它 returns 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])
)

你现在应该 return 当它只存在于一个组中时,你应该使用它,或者如果它只存在于两个组中,你应该使用组 B 的度量。您唯一需要做的就是在它周围放一个 count by (group),它应该会为您带来预期的结果。

(一般来说,逐步构建重要查询并每次都对其进行测试是一种很好的做法,这样您就知道计算了哪些指标以及它们是否正是您要查找的指标)