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)
这里相加的是累计 Counter 当前值,不是某时段请求数。结果中每个 method 取值一行——表格视图下你就得到了所有 method 值及对应数值。
场景三:Grafana 变量取标签值列表
做仪表盘下拉框时用模板函数:
label_values(http_requests_total, method)
这是 Grafana 的变量语法,不是 PromQL 函数。返回范围取决于数据源查询与时间设置;元数据 API 可能含当前已无活跃样本的标签值,供用户选择后过滤面板。
场景四:把 A 指标的标签搬到 B 指标上
up * on(job, instance) group_left(version) app_version_info
右侧 app_version_info 在每个匹配键上必须唯一,示例假设其值为 1;group_left 把右侧 info 的 version 标签合并进左侧 up 结果——这是"查询返回标签值"最贴近的 PromQL 实现。
常见问题(FAQ)
Q:能直接查询"返回 method 这个标签的值"吗? PromQL 没有这种语义——它查询的是数值序列;要枚举标签值请用 API /api/v1/label/method/values 或 Grafana 的 label_values。
Q:group_left 和 group_right 区别? 取决于哪一侧是多对一的"多"方;group_left 表示左侧是“多”方,并从右侧唯一匹配序列复制指定标签;group_right 相反,不按标签数量判断。