我能否仅在一个时间 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
不存在时和 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
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)
,它应该会为您带来预期的结果。
(一般来说,逐步构建重要查询并每次都对其进行测试是一种很好的做法,这样您就知道计算了哪些指标以及它们是否正是您要查找的指标)
我正在使用每分钟轮询一次的轮询器,我按小时从中查询汇总数据。 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
不存在时和 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
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)
,它应该会为您带来预期的结果。
(一般来说,逐步构建重要查询并每次都对其进行测试是一种很好的做法,这样您就知道计算了哪些指标以及它们是否正是您要查找的指标)