在普罗米修斯中对两个不同的指标进行分组后如何划分?
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_name
和 zone
,而 /
右侧的时间序列仅包含一个标签,例如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)
我目前正在尝试提醒可用区内的 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_name
和 zone
,而 /
右侧的时间序列仅包含一个标签,例如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)