Prometheus采集配置:指定指标保留子集标签的配置疑问
Prometheus标签保留配置问题解答
你的现有配置问题
你写的配置逻辑完全不符合需求,具体问题:
source_labels: [A]是读取名为"A"的标签的值,而非针对指标A(指标名对应的内置标签是__name__);如果你的指标A没有"A"这个标签,这个配置直接无效。keepequal动作是用来过滤样本的:只有当source_labels的值等于target_label的值时,才保留该样本,否则丢弃。它根本不是用来修改或保留标签的。
所以这个配置既不会仅作用于指标A,也不会保留带test1标签的指标A,完全达不到你的目的。
新增test2配置块的结果
如果新增同类型的配置块,最终会导致所有样本被丢弃:
因为relabel规则是顺序执行的,第一个块会过滤掉"A"标签值不等于test1的样本,第二个块又过滤掉"A"标签值不等于test2的样本,没有样本能同时满足这两个条件,最后全部被丢弃。
正确的配置方案
要实现「采集所有指标,仅指标A保留test1标签,其余标签丢弃,且适配新增标签」的需求,应该用labelkeep动作配合条件限定,只对指标A生效:
方案1(Prometheus 2.27+ 推荐)
利用if条件直接限定规则仅作用于指标A:
scrape_configs: - job_name: 'your_job_name' # 这里填写你的采集目标、端口等基础配置 relabel_configs: # 仅对指标A,保留test1标签,其余标签自动丢弃 - action: labelkeep regex: 'test1' if: '__name__ == "A"'
labelkeep会保留所有匹配regex的标签,其余标签全部丢弃,正好符合你「定义保留标签而非删除」的要求,新增标签会被自动过滤,不用修改配置。if条件确保这个规则只作用于指标A,其他指标不受影响,保留全部标签。
方案2(低版本Prometheus兼容)
如果你的Prometheus版本低于2.27,不支持if条件,可以用临时标签标记后处理:
scrape_configs: - job_name: 'your_job_name' # 基础采集配置... relabel_configs: # 给指标A打临时标记 - source_labels: [__name__] regex: 'A' target_label: __temp_mark__ replacement: 'process' # 仅对打了标记的指标A执行labelkeep,保留test1 - source_labels: [__temp_mark__] regex: 'process' action: labelkeep regex: 'test1' # 删除临时标记标签 - action: labeldrop regex: '__temp_mark__'
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

