如何在Grafana中实现支持risk标签过滤及全Namespace的CPU用量查询?
问题:Grafana PromQL实现Risk标签过滤+全量Namespace CPU统计
现有配置
原PromQL查询
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_query变量通过label_values(kube_namespace_labels, label_risk)获取所有risk标签值;开启「Include All option」后,选择「全部」返回无数据,仅移除{label_risk="$risk_query"}才能查看全量数据,但会丢失过滤功能。
解决方案
1. 调整变量配置
- 编辑
risk_query变量,确保「Include All option」已开启 - 自定义值输入
.*,显示名称设为「全部」(该正则表达式可匹配任意risk标签值,包括空)
2. 修改PromQL查询
调整后的查询同时支持:选择具体risk标签值时过滤对应Namespace,选择「全部」时包含所有Namespace(包括无risk标签的),并将无标签的Namespace归为「未标记」组:
sort_desc( sum by (label_risk) ( # 给所有Namespace补全label_risk标签,无标签的设为"未标记" max by (namespace, label_risk) ( kube_namespace_labels or on(namespace) group_left(label_risk) kube_namespace_labels * 0 + 1 * on() group_left(label_risk) vector("未标记") ) # 根据变量值过滤risk标签(选全部时匹配所有) and on(label_risk) group_left(namespace) vector(1) unless label_risk !=~ "$risk_query" # 关联CPU用量数据 * on(namespace) group_right(label_risk) sum by (namespace) (avg_over_time(namespace:container_cpu_usage:sum{}[$__range])) ))
逻辑说明
- 补全标签:通过
or语句给没有risk标签的Namespace添加label_risk="未标记"标签,确保所有Namespace都能被统计 - 条件过滤:用
label_risk !=~ "$risk_query"实现动态过滤——选择具体标签值时仅保留对应Namespace;选择「全部」时,.*匹配所有标签(包括"未标记"),返回全量数据 - 关联聚合:最后关联CPU用量数据,按label_risk聚合并排序
内容的提问来源于stack exchange,提问作者wwillfred
相关产品推荐
相关产品推荐

