秘密武器:Prometheus监控神器-服务发现篇(二)
优采云 发布时间: 2022-09-29 01:12秘密武器:Prometheus监控神器-服务发现篇(二)
本章解释了服务发现和重新标记的机制和示例。
通过服务发现,我们可以在不重启 Prometheus 服务的情况下,动态发现需要监控的 Target 实例信息。
如上图所示,对于线上环境,我们可以将其划分为不同的集群:dev、stage、prod。每个集群运行多个主机节点,每个服务器节点运行一个 Node Exporter 实例。Node Exporter实例自动注册到Consul中,Prometheus根据Consul返回的Node Exporter实例信息动态维护Target列表,从而轮询这些Targets进行监控数据。
但是,如果我们可能还需要:
面对上述场景的需求,我们其实是希望Prometheus Server能够根据一定的规则(比如标签),从服务发现注册中心返回的Target实例中选择性地采集一些Exporter实例。监测数据。
接下来,我们实验如何通过 Prometheus 强大的 Relabel 机制来实现这些具体目标。
Prometheus 的重标记机制
Prometheus 中的所有 Target 实例都收录一些默认的 Metadata 标签信息。这些实例的 Metadata 标签内容可以在 Prometheus UI 的 Targets 页面查看:
默认情况下,当 Prometheus 加载 Target 实例时,这些 Target 会收录一些默认标签:
上面的这些标签会告诉 Prometheus 如何从这个 Target 实例中获取监控数据。除了这些默认标签外,我们还可以为 Target 添加自定义标签。例如,在“基于文件的服务发现”部分的示例中,我们通过 JSON 配置文件为 Target 实例添加了自定义标签 env,该标签也最终保存到来自该实例的示例数据 采集@ > 如下:
node_cpu{cpu="cpu0",env="prod",instance="localhost:9100",job="node",mode="idle"}
一般来说,Target的以__开头的标签是系统内部使用的,所以这些标签不会被写入样本数据中。但是,这里有一些例外。例如,我们会发现所有通过 Prometheus采集 的样本数据都会收录一个名为 instance 的标签,而这个标签的内容对应的是 Target 实例的 __address__。这里实际上是一个标签重写过程。
这种在 采集 样本数据之前重写 Target 实例的标签的机制在 Prometheus 中称为 Relabeling。
Prometheus 允许用户通过 采集 任务设置中的 relabel_configs 添加自定义重新标记过程。
使用替换/标签映射重写标签
Relabeling 最基本的应用场景是根据 Target 实例中收录的元数据标签动态添加或覆盖标签。例如,通过 Consul 动态发现的服务实例也收录以下 Metadata 标签信息:
默认情况下,来自 Node Exporter 实例 采集 的示例数据如下所示:
node_cpu{cpu="cpu0",instance="localhost:9100",job="node",mode="idle"} 93970.8203125
我们希望有一个额外的标签 dc 来指示样本属于哪个数据中心:
node_cpu{cpu="cpu0",instance="localhost:9100",job="node",mode="idle", dc="dc1"} 93970.8203125
多个 relabel_config 配置可以添加到每个 采集 任务的配置中。最简单的relabel配置如下:
scrape_configs:
- job_name: node_exporter
consul_sd_configs:
- server: localhost:8500
services:
- node_exporter
relabel_configs:
- source_labels: ["__meta_consul_dc"]
target_label: "dc"
采集任务通过Consul作为监控采集目标动态发现Node Exporter实例信息。在上一节中,我们知道 Consul 动态发现的监控目标会收录一些额外的 Metadata 标签,比如标签 __meta_consul_dc 表示当前实例所在的 Consul 数据中心,所以我们希望 采集 从这些实例也可以在监控样本中收录这样的标签,例如:
node_cpu{cpu="cpu0",dc="dc1",instance="172.21.0.6:9100",job="consul_sd",mode="guest"}
这样可以方便的根据不同的数据中心,根据dc标签的值对各自的数据进行汇总分析。
在此示例中,通过从 Target 实例中获取 __meta_consul_dc 的值,并覆盖从该实例中获取的所有样本。
完整的 relabel_config 配置如下所示:
# The source labels select values from existing labels. Their content is concatenated
# using the configured separator and matched against the configured regular expression
# for the replace, keep, and drop actions.
[ source_labels: '[' [, ...] ']' ]
# Separator placed between concatenated source label values.
[ separator: | default = ; ]
# Label to which the resulting value is written in a replace action.
# It is mandatory for replace actions. Regex capture groups are available.
[ target_label: ]
# Regular expression against which the extracted value is matched.
[ regex: | default = (.*) ]
# Modulus to take of the hash of the source label values.
[ modulus: ]
# Replacement value against which a regex replace is performed if the
# regular expression matches. Regex capture groups are available.
[ replacement: | default = $1 ]
# Action to perform based on regex matching.
[ action: | default = replace ]
action 定义了当前 relabel_config 如何处理 Metadata 标签,默认的 action 行为是 replace。替换行为会根据regex配置匹配source_labels标签的值(多个source_label值会根据分隔符拼接),并将匹配的值写入target_label。如果有多个匹配组,可以使用${1},${2}决定写什么。如果没有匹配项,则不会重新创建 target_label。
repalce 操作允许用户根据 Target 的 Metadata 标签重写或编写新的标签键值对。在多环境场景下,可以帮助用户添加环境相关的特征维度,从而更好的聚合数据。
除了使用replace之外,还可以将action的配置定义为labelmap。与replace不同的是,labelmap根据正则表达式的定义匹配Target实例的所有标签的名称,并将匹配的内容作为新的标签名称,其值作为新标签的值。
例如,在监控 Kubernetes 下的所有主机节点时,为了将这些节点上定义的标签写入样本,可以使用以下 relabel_config 配置:
- job_name: 'kubernetes-nodes'
kubernetes_sd_configs:
- role: node
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
使用 labelkeep 或 labeldrop 可以过滤 Target 标签,只保留满足过滤条件的标签,例如:
relabel_configs:
- regex: label_should_drop_(.+)
action: labeldrop
此配置使用 regex 匹配当前 Target 实例的所有标签,并从 Target 实例中删除与 regex 规则匹配的标签。labelkeep 则相反,删除所有与正则表达式定义不匹配的标签。
使用 keep/drop 过滤 Target 实例
上一部分介绍了Prometheus的Relabeling机制,使用replace/labelmap/labelkeep/labeldrop来管理标签。本节开头也提到了第二个问题。当使用集中式服务发现注册表时,所有环境的 Exporter 实例都将注册到服务发现注册表中。但是,不同职能(开发、测试、运维)的人员可能只关心部分监控数据,他们可能会部署自己的 Prometheus Server 来监控他们关心的指标数据。如果这些 Prometheus Servers 采集 所有环境下的所有 Exporter 数据,显然会造成巨大的资源浪费。如何让这些不同的 Prometheus Server采集 各自关心?答案是重新标记。除了默认替换之外,relabel_config 的操作还支持保留/删除行为。例如,如果我们只想要 采集 数据中心 dc1 中的 Node Exporter 实例的样本数据,我们可以使用以下配置:
scrape_configs:
- job_name: node_exporter
consul_sd_configs:
- server: localhost:8500
services:
- node_exporter
relabel_configs:
- source_labels: ["__meta_consul_dc"]
regex: "dc1"
action: keep
当action设置为keep时,Prometheus会丢弃source_labels值与regex正则表达式内容不匹配的Target实例,当action设置为drop时,Prometheus将丢弃source_labels值与regex正则表达式内容匹配的Target实例。可以简单理解为keep用于选择,drop用于排除。
使用 hashmod 计算 source_labels 的哈希值
当 relabel_config 设置为 hashmod 时,Prometheus 会根据模数的值作为系数计算 source_labels 值的哈希值。例如:
scrape_configs
- job_name: 'file_ds'
relabel_configs:
- source_labels: [__address__]
modulus: 4
target_label: tmp_hash
action: hashmod
file_sd_configs:
- files:
- targets.json
根据当前Target实例的__address__的值,以4为系数,这样每个Target实例都会收录一个新的标签tmp_hash,取值范围在1到4之间。查看Target的标签信息实例,可以看到如下结果,每个 Target 实例都收录一个新的 tmp_hash 值:
使用 Hashmod 的能力在 Target 实例级别实现 采集 任务的功能分区:
scrape_configs:
- job_name: some_job
relabel_configs:
- source_labels: [__address__]
modulus: 4
target_label: __tmp_hash
action: hashmod
- source_labels: [__tmp_hash]
regex: ^1$
action: keep
这里需要注意的是,如果relabel的操作只是生成一个临时变量作为下一次relabel操作的输入,那么我们可以使用__tmp作为标签名的前缀,这个前缀定义的标签就不会写入目标或 采集 到样本的标签。
超值资料:优采云采集器教程-以及分享一款小白使用免费自动采集发布工具
优采云采集器怎么用?优采云采集器教程?相信用过优采云采集器的朋友们都知道,优采云采集器是需要一定的编程能力,不然很难用好优采云采集器,这里为了照顾更多不懂的小白朋友分享一款免费的采集器。只需要输入域名,点选你需要采集的内容,就轻松地完成了数据采集,详细参考图片。本期教程为优采云采集器更多的是介绍优采云采集器的教程。
如果自动识别效果不符合您的要求,您可以通过“手动点选列表”和“编辑列表Xpath”两种方式来修改识别结果。
手动点选列表的操作步骤如下:
优采云采集器教程第一步:点击“手动点选列表”的选项
优采云采集器教程第二步:点击网页中列表的第一行的第一个元素
优采云采集器教程第三步:点击网页中列表的第二行的第一个元素
但是偶尔也会发生识别结果错误的情况,原因通常包括以下几种:
(1)网页加载速度过慢,软件自动识别结束之后才出现分页按钮
(2)页面中存在多个分页按钮,软件最终只会选择其中的一个
(3)在滚动加载和分页按钮同时存在的情况中,软件自动滚动多次之后分页按钮仍未出现。
(4)当前页面中的分页按钮软件暂时未兼容
优采云采集器教程适合一开始没有分页按钮,需要通过滚动网页多次后才能加载出分页按钮的网页,或者已经显示了下一页按钮,但是当前网页内容未展示完毕,需要滚动网页多次后才能显示当前网页的全部内容。
这种分页类型比较难识别,尽管软件在自动识别时会尝试自动滚动,但是这个滚动的次数和当前网页所需的滚动次数可能不一致,所以这种类型的分页通常需要加入一些人工操作。
主要分为以下几种情况:
第一种:识别出滚动加载,但是未识别出分页按钮
优采云采集器教程合并字段有两种办法,一种是点击一条需要合并的字段,右击选择“合并字段”,然后在页面中选择需要合并的字段,这种方式适合两个字段的合并。在合并字段中,用户可以设置两个字段内容之间的分隔符,如果不需要分隔符,在分隔符部分直接设置为空白就好。如果要修改字段中提取的内容,或者在添加新字段时进行提取对象的设置,可以点击“在页面中选择”或者字段上的瞄准器图标,然后在网页中点击需要的数据
Xpath一种路径查询语言,简单的说就是利用一个路径表达式找到我们需要的数据在网页中的位置。有编程基础的用户可以使用此功能进行采集对象的定位。
不同的数据需要设置不同的取值属性,在设置新字段的时候,字段的取值默认的是文本字段,一般情况下,在您选取新数据时,优采云采集器会自动帮你判断好字段属性,您不需要另外设置,但如果出现判断失误的情况下,您可以自己设置字段的取值属性。
优采云采集器教程提取文本:适合普通的文本数据
优采云采集器教程提取内部HTML:适合提取不包括内容自身的HTML
优采云采集器教程提取外部HTML:适合提取包括内容自身的HTML
优采云采集器教程提取链接地址:适合提取链接的数据
优采云采集器教程提取图片等媒体地址:适合提取图片等媒体资源
优采云采集器教程提取输入框内容:适合提取输入框的文字,多用于关键词采集时使用
优采云采集器教程在数据采集过程中,如果需要采集一些特殊字段,如采集时的时间、当前网页标题、当前网页URL等,这些字段无法直接在网页中提取,那么可以使用“改为特殊字段”功能进行字段设置,通常我们会新建字段,然后把字段改为特殊字段,我们也可以直接把其他字段改为特殊字段。
在设置采集任务的过程中,有时候我们会遇到一些不需要采集的数据,如某些数值为空的数据或者收录某些字符的数据,优采云采集器教程从而在一定程度上影响了采集速度和效果,针对这种情况我们可以使用数据筛选功能,避免采集到无效数据。
优采云采集器教程流程图模式中,“数据筛选”功能在提取数据组件菜单栏的右上角,,点击之后会打开筛选条件设置窗口,如下图所示。(如果流程图中有多个提取数据组件,数据筛选是共享的,在任意一个提取数据组件中打开设置都可以)