PromQL 如何查询返回标签的值?
PromQL 查询返回的是指标值而非标签值;想拿到某个标签的取值,可以用按该标签分组的聚合(sum by)、Grafana 的 label_values 变量,或 group_left 把标签"搬运"到结果里。本文给出三种做法。
PromQL 查询的"值"永远是数值,标签只是维度——想让标签值出现在结果里,正确姿势是按它分组(by)或在 Grafana 里用 label_values() 取标签值列表。
场景一:按标签过滤指标
http_requests_total{method="GET", status="200"}
这是最基础的用法:花括号里写标签匹配条件,返回满足条件的序列及其数值。支持 =、!=、=~(正则)、!~。
场景二:让标签值成为结果的一部分
sum(http_requests_total) by (method)
结果中每个 method 取值一行——表格视图下你就得到了所有 method 值及对应数值。
场景三:Grafana 变量取标签值列表
做仪表盘下拉框时用模板函数:
label_values(http_requests_total, method)
返回 method 标签的全部唯一取值,供用户选择后过滤面板。
场景四:把 A 指标的标签搬到 B 指标上
app_version_info * on(instance) group_left(version) up
group_left 把 info 类指标里的 version 标签合并进主查询结果——这是"查询返回标签值"最贴近的 PromQL 实现。
观测云对照
观测云的标签体系是一等公民:指标查看器里标签即筛选项,DQL 查询结果天然带全部标签列,不需要 group_left 这类技巧就能按任意标签拆分查看。
常见问题(FAQ)
Q:能直接查询"返回 method 这个标签的值"吗? PromQL 没有这种语义——它查询的是数值序列;要枚举标签值请用 API /api/v1/label/method/values 或 Grafana 的 label_values。
Q:group_left 和 group_right 区别? 取决于哪一侧是多对一的"多"方;向量匹配中标签少的一侧用 group_left 接收额外标签。