Prometheus生命周期与标签概念

生命周期与标签概念

在每个scrape_interval期间(示例中是15秒),Prometheus都会检查执行的作业。这些作业将生成目标列表,即服务发现过程。

服务发现还会根据目标的配置来设置其他标签,这些标签带有__的前缀和后缀,包括__scheme__、__address__和__metrics_path__。这些标签包含目标的模式(http或https)、目标的地址 以及指标的具体路径。

每个标签通常都有一个默认值。例如,__metrics_path__默认为/metrics,__scheme__默认为http。 此外,如果路径中存在任何URL参数,则它们的前缀会设置为__param_*。配置标签会在抓取的生命周期中重复利用以生成其他标签。例如,指标上instance标签的默认内容 是__address__标签的内容。

 

注意:这些带__的前缀和后缀标签都在生命周期中被特殊处理和删除了,不在web上显示。

 

然后这些目标列表和标签会返回给Prometheus,其中一些标签可以在配置中被覆盖,例如,通过metrics_path参数设置的指标路径以及通过scheme参数指定的模式。

 - job_name: 'node'
    static_configs:
    - targets: ['10.4.7.11:8080']
    scheme: https
	metrics_path: /moremetrics

这里,我们将schema覆盖为https,将metrics_path覆盖为/moremetrics。

 Prometheus提供了可以重新标记目标的机会,并可能使用你的服务发现所添加的一些元数据。你还可以过滤目标,以删除或保留特定条目。然后就是真正的数据抓取,以及指标返回。当指标被抓取时,你将拥有最后一次机会在将它们保存到服务器之前重新标记并过滤。

该生命周期的简化版本

标签

更改或添加标签会创建新的时间序列。

提示:如果不在写入新数据了,对于先前存在数据的时间序列,如果抓取不再返回数据,则该系列将被标记为陈旧。这同样适用于任何被删除的目标:所有时间序列都将 标记为陈旧。图像中不会显示陈旧的数据。

标签分类

一个设定分类 标准的好办法是利用拓扑标签和模式标签。

  • 拓扑标签(topological label),每个指标都天然带有两个拓扑标签:job和instance。标签job是根据抓取配置中的作业名称设置的。我们倾向于使用job来描述正在监控的事物的类型。在之前的Node Exporter作业中,我们将其命名为node。这会为每个Node Exporter指标打上job标签node。instance标签可以标识目标,它通常 是目标的IP地址和端口,并且来自__address__标签。
  • 模式标签(schematic label)是url、error_code或user之类的东西,它们允许你将拓扑中同一级别的时间序列匹配在一起,例如创建数据间的比率。

重新标记

通过重新标记,你可以控制、管理并标准化环境中的指标。

  • 删除不必要的指标
  • 从指标中删除敏感或不需要的标签
  • 添加、编辑或修改指标的标签值或标签格式

请记住,我们有两个阶段可以重新标记。第一个阶段是对来自服务发现的目标进行重新标记,这对于将来自服务发现的元数据标签中的信息应用于指标上的标签来说非常有用。这是在作业内的 relabel_configs块中完成的
第二个阶段是在抓取之后且指标被保存于存储系统之前。这样,我们就可以确定哪些指标需要保存、哪些需要丢弃以及这些指标的样式。这是在我们作业内的metric_relabel_configs块中完成的。

提示:记住这两个阶段的最简单方法是:在抓取之前使用relabel_configs,在抓取之后使用 metric_relabel_configs。

删除指标

首先来看看第一种操作。我们使用source_labels参数选择要操作的指标,并且还需要一组标签名 称。在示例中我们使用__name__标签,__name__标签是表示指标名称的预留标签。因此,docker作业 的源标签是所有从cAdvisor抓取的指标的连接名称。

多个标签通过分隔符连接在一起,默认分隔符为“;”,也可以使用separator参数覆盖分隔符配置。

  - job_name: 'docker'
    static_configs:
    - targets: ['10.4.7.11:8080']
    metric_relabel_configs:
      - source_labels: [__name__] # __name__标签是表示指标名称的预留标签,docker作业 的源标签是所有从cAdvisor抓取的指标的连接名称
	regex: '(container_tasks_state|container_memory_failures_total)' # 它将匹配并捕获两个指标
	action: drop # 删除操作

 这里__name__标签值将使用“,”进行分隔。例如:

[__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]

以下将匹配两个指标

(container_tasks_state|container_memory_failures_total)

如果指定了多个源标签,那么我们将使用分隔符隔开每个正则表达式,例如:

regex: default;kubernetes;https

然后执行action参数中指定的操作。我们使用了drop操作,这将在数据存储之前删除指标。其他操作(如keep)则会保留与正则表达式匹配的指标,并删除所有其他指标。

替换标签值

许多cAdvisor指标都有一个id标签,其中包含正在运行的进 程的名称。如果该进程是一个容器,那么我们会看到类似如下的信息:

id="/docker/4455f802e8c6bf14b55a8b1fa2a46b1f986d94fc08db96f2850bab697a72cf89"

从中获取ID并保存到container_id中:

metric_relabel_configs:
 - source_labels: [id]
   regex: '/docker/([a-z0-9]+)'
	replacement: '$1'
	target_label: container_id

我们的源标签是id。然后,指定匹配并捕获容器ID的正则表达式(regex)。replacement字段包含新标签值,在示例中使用的是匹配的结果$1。然后,在target_label参数中指定捕获信息的目标,此处为container_id。你可能会注意到我们没有为此指定action。这是因为默认操作是replace,如果没有指定操作,那么Prometheus将假定你要执行替换操作。

Prometheus还有一个参数honor_labels,当你尝试覆盖并添加已存在的标签时,这个参数会控制冲突行为。假设你已经抓取的数据有一个名为job的标签。默认情况下honor_labels为false,Prometheus将通过在其前面添加exported_前缀来重命名现有标签。所以我们的job标签将变成exported_job。如果 honor_labels被设置为true,则Prometheus会保留标签,并忽略服务器上的任何重新标记行为。

 删除标签

示例中,我们将删除kernelVersion标签,隐藏Docker主机的内核版本。

metric_relabel_configs:
  - regex: 'kernelVersion'
    action: labeldrop

为了删除标签,我们指定一个正则表达式,然后指定删除标签的操作labeldrop。这将删除与正则 表达式匹配的所有标签。此操作还有一个对应的反向操作labelkeep,它将保留与正则表达式匹配的标签,并删除所有其他标签。

posted @ 2020-05-21 11:41  Wshile  阅读(702)  评论(0编辑  收藏  举报