标签的作用:

  • 可以基于已有的标签,生成一个标签
  • 也可以创建新的标签
  • 还可以过滤标签,不想采集哪些
  • 哪些标签不要了也可以将其删除

 

 

 保留或丢弃对象、哪些对象需要抓取


Relabeling 另一个常见的用例就是过滤有标签的对象,keep 或 drop 这两个动作可以来完成,使用这两个操作,可以帮助我们完成如下的一些操作:

  • 来自服务发现的哪些目标应该被抓取
  • 从目标中抓取哪些指定的序列样本,或将其发送到远程存储
  • 哪些报警要发送到 Alertmanager

一个 keep 动作的配置规则如下所示:

action: keep
source_labels: [<source label name list>]
separator: <source labels separator> # 默认为 ';'
regex: <regular expression> # 默认为 '(.*)' (匹配任何值)

keep 操作同样按顺序执行如下步骤:

  • 使用 separator 分隔符将 source_labels 中列出的标签值连接起来,多个label用分隔符分开
  • 测试 regex 中的正则表达式是否与上一步的连接字符串匹配
  • 如果不匹配,该对象将从最终输出列表中删除,如果匹配,则保留该对象

drop 动作和 keep 类似,只是它是删除一个对象而不是保留。同样接下来看一看 keep 和 drop 的示例。

只抓取具有注解的目标

在服务发现的时候,我们可能只想抓取那些具有特定元数据标签的目标,例如,下面的配置让我们只抓取 Kubernetes 中具有 example.io/should_be_scraped=true 这个 annotation 的目标。

- action: keep
  source_labels:
  [_meta_kubernetes_service_annotation_example_io_should_be_scraped]
  regex: true

kind: Service
apiVersion: v1
metadata:
  name: redis
  namespace: monitor
  annotations:
    prometheus.io/scrape: "true"
    prometheus.io/port: "9121"

--------------------------------------------------------------------------------
    - job_name: 'kubernetes-service-endpoints'
      kubernetes_sd_configs:
      - role: endpoints
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
        action: keep
        regex: true
relabel_configs:
      - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
        action: keep
        regex: default;kubernetes;https

Kubernetes 服务发现机制下面会将 labels 标签与 annotation 作为元信息输出到 Prometheus,这些元信息都包含 __meta_ 前缀,这里我们的配置就是保留具有 example.io/should_be_scraped 这个 annotation 标签,且值为 true 的目标。

只存储特定的指标

当使用 metric_relabel_configs(抓取数据之后的,也就是说要存储了,只会去存储这样的指标,relabel_configs是抓取之前) 来控制目标的抓取方式时,我们可以使用下面的规则来只存储指标名称以 api_ 或 http_ 开头的指标。

action: keep
source_labels: [__name__]
regex: "(api_|http_).*"

只抓取特定目标的Service

Keep只有匹配的才会去采集数据,不匹配的就不采集。下面意思就是pod当中有些注解中声明了prometheus_io_scrape这个字段,那么就会把你纳入监控,如果没有声明就不会纳入监控。也就是k8s当中部署了这么多pod,谁要监控,谁不要被监控,在部署service可以指定是否需要采集,如果需要采集需要在注解当中声明prometheus_io_scrape: true

在service 和pod里面声明配置注解,那么就会采集注解里面含有这个值的

annotations:
  prometheus.io/scrape: 'true'


 # Service没配置注解prometheus.io/scrape的不采集
- action: keep
  regex: true
  source_labels:
  - __meta_kubernetes_service_annotation_prometheus_io_scrape