我在 Grafana 中有一个 PromQL 查询,它返回 Kubernetes 集群中所有命名空间的 CPU 使用情况,由名为
risk
的命名空间标签聚合:
sort_desc(
sum(
max(kube_namespace_labels{label_risk="$risk_query"}) by (label_risk, namespace)
*
on(namespace) group_right(label_risk)
sum by (namespace)
(avg_over_time(namespace:container_cpu_usage:sum{}[$__range]))) BY (label_risk))
如您所见,查询是通过 Grafana 查询变量
risk_query
进行过滤的,其定义如下:
label_values(kube_namespace_labels, label_risk)
在某种程度上,此查询按预期运行:仪表板的用户可以在下拉菜单中选择任何现有的
risk
命名空间标签值,他们将看到 risk
标签设置为的所有命名空间的 CPU 使用率该特定值。
问题是用户还必须为此变量提供一个可用的“全部”选项,以便查询返回所有命名空间的 CPU 使用情况,甚至是那些没有定义
risk
标签的命名空间。不幸的是,无论我们使用 risk_query
还是 <blank>
的自定义所有值,对 ""
变量使用“包含全部选项”都会返回“无数据”。我能弄清楚如何包含所有命名空间的 CPU 使用情况的唯一方法是从查询中完全删除 {label_risk="$risk_query"}
,但这使得过滤变得不可能。
总之,如何保留过滤此查询的功能,同时允许用户在需要时查看所有命名空间的 CPU 使用情况?
感谢@valyala为我指明了解决这个问题的正确方向。
首先,在 Grafana 中定义
risk_query
查询变量时,使用 .*
作为“自定义所有值”。
其次,像这样定义查询:
sort_desc(
sum(
max(kube_namespace_labels{label_risk=~"$risk_query"}) by (label_risk, namespace)
*
on(namespace) group_right(label_risk)
sum by (namespace)
(avg_over_time(namespace:container_cpu_usage:sum{}[$__range]))) BY (label_risk))
当用户为查询变量
risk
选择“全部”选项时,这将允许查询返回所有命名空间(甚至是那些未定义 risk_query
标签的命名空间)的 CPU 使用情况。