在普罗米修斯中对两个不同的指标进行分组后如何划分?

How to divide after grouping two different metrics in Prometheus?

我目前正在尝试提醒可用区内的 Kubernetes pods 堆栈。我已经设法使用两种不同的指标,以至于我可以看到一个应用程序在特定可用区上有多少 pods 运行。但是,由于缩放,我希望警报基于百分比...因此我们可以在一个 AZ 上 pods 的特定百分比为 运行 时发出警报(即超过 70%)。

我当前的查询:

sum(count(kube_pod_info{namespace="somenamespace", created_by_kind="StatefulSet"}) by (created_by_name, node) * on (node) group_left(az_info) kube_node_labels) by (created_by_name, az_info)

和一些选定的输出:

{created_by_name="some-db-1",az_info="az1"} 1
{created_by_name="some-db-1",az_info="az2"} 4
{created_by_name="some-db-2",az_info="az1"} 2
{created_by_name="some-db-2",az_info="az2"} 3

例如,在上面的输出中我们可以看到 4 个 db-1 pods 堆叠在 az2 上,而不是 1 个 pod 堆叠在 az1 上。在这种情况下,我们希望发出警报,因为 80% 的 db-1 pods 堆叠在单个 AZ 上。

由于输出包含多个pods在多个AZ上,感觉使用单个Prometheus查询可能很难获得百分比,但想知道是否有经验的人可以提供解决方案?

谢谢!

  your_expression 
/ ignoring(created_by_name) group_left
  sum without(created_by_name)(your_expression)

会给你整体的比例,然后你就可以> .8了。

默认情况下,Prometheus 在 / 运算符的左侧和右侧划分具有相同标签集的时间序列对。如果 / 左侧的时间序列包含两个标签,例如 created_by_namezone,而 / 右侧的时间序列仅包含一个标签,例如created_by_name,Prometheus 会 return 一个空结果,因为它不会找到具有相同划分标签集的时间序列对。这可以通过使用 on()group_left() 修饰符来解决 - on() 修饰符限制标签集,在搜索时间序列对时会考虑这些标签集。 group_left() 修饰符允许将多个时间序列与 / 左侧给定的 on() 标签集与右侧具有相同 on() 标签集的单个时间序列相匹配/。查看更多详情 here.

因此,生成的查询将具有一对 (created_by_name, zone) 标签的每个时间序列除以具有匹配 created_by_name 标签的总时间序列,如下所示:

sum(q) by (created_by_name, zone)
  / on(created_by_name) group_left()
sum(q) by (created_by_name)

其中 q 必须替换为原始查询 count(kube_pod_info{namespace="somenamespace", created_by_kind="StatefulSet"}) by (created_by_name, node) * on (node) group_left(zone) kube_node_labels

可以使用WITH expressions from MetricsQL将查询简化为以下查询:

with (
  q = count(
    kube_pod_info{namespace="somenamespace", created_by_kind="StatefulSet"}
  ) by (created_by_name, node)
    * on (node) group_left(zone)
  kube_node_labels
)
sum(q) by (created_by_name, zone)
  / on(created_by_name) group_left()
sum(q) by (created_by_name)