Prometheus+Grafana构建云原生分布式监控系统(十)_prometheus的服务发现机制(一)

作者:牛奶咖啡13日期:2026/1/29

Prometheus+Grafana构建云原生分布式监控系统(九)_pushgateway的使用https://blog.csdn.net/xiaochenXIHUA/article/details/157392956

一、prometheus的服务发现机制

1.1、prometheus的服务发现机制概述

prometheus是基于拉(pull)模式抓取监控数据,首先要能够发现需要监控的目标对象target,那么prometheus如何获监控目标呢?有两种方式【静态手动配置】与【动态服务发现配置】:

《1》对于小型的系统环境来说,通过static_configs静态指定各Target便能解决问题,这就是最简单的静态手动配置。

《2》prometheus最开始设计是一个面向云原生应用程序的,云原生、容器场景下按需的资源使用方式,对于监控系统而言就意味着没有一个固定的监控目标,所有的监控对象(基础设施、应用、服务)都在动态的变化。因此,对于有较强动态性的云环境来说,静态配置显然难以适用,于是就出现了动态服务发现机制。

为了适应【静态】与【动态】发现机制,prometheus引入了一个中间代理人(服务注册中心),这个代理人掌握着当前所有监控目标的访问信息,prometheus只需要向这个代理人询问有哪些监控目标即可,这种模式被称为服务发现(service discovery)。SD模块专门负责去发现需要监控的target信息,prometheus则从SD模块订阅该信息,有target信息就会推送给prometheus,然后prometheus拿到target信息后通过pull http协议去拉取监控指标数据。如下图所示:

1.2、prometheus支持多种服务发现

prometheus支持多种服务发现

prometheus支持多种服务发现,目前已经支持20多种服务发现协议,如下是常用的5种:
序号prometheus常用的服务发现协议说明
1kubernetes_sd_configskubernetes服务发现 让prometheus动态发现kubernetes中被监控的目标
2static_configs静态服务发现 基于prometheus配置文件指定监控目标
3dns_sd_configsDNS服务发现监控目标
4consul_sd_configsConsul服务发现 基于consul服务动态发现监控目标
5file_sd_configs文件服务发现 prometheus定时读取文件若发生变化则加载新目标

1.3、静态服务发现

静态服务发现机制(是直接将监控目标写死在prometheus.yml配置文件中)虽然配置简单,但是若要新增、修改、删除监控节点时,需要每次都去修改配置文件,然后再通知prometheus重载让配置生效,这样操作就十分麻烦,且有可能会对已有的监控内容造成影响;因此就出现了动态服务发现。

【静态服务发现更适合小型的系统环境】。

二、prometheus的动态服务发现——基于文件的服务发现

通过定义一组资源“子”配置文件,yaml格式文件里面只存储需要采集的targets信息,此种方式可以被prometheus实时动态获取,而不需要重启prometheus服务。

2.1、可创建.json格式的服务发现文件

在【/usr/local/prometheus-3.5.0/targets】路径下创建一个json格式的服务发现文件【dev-server.json】

1#创建一个json格式的服务发现文件
2mkdir -p /usr/local/prometheus-3.5.0/targets
3cd /usr/local/prometheus-3.5.0/targets
4vi dev-server.json
5
6#【dev-server.json】文件的完整内容如下:
7[
8 {
9  "targets": ["192.168.1.9:9100","192.168.1.37:9100","192.168.1.39:9100"],
10  "labels": {
11    "env": "test"
12    "app": "dev-server"
13  }
14 }
15]

2.2、或可创建.yml格式的服务发现文件

或者可以在【/usr/local/prometheus-3.5.0/targets】路径下创建一个yaml格式的服务发现文件【dev-server.yml】(注意:若内容相同,则.json与.yml格式的文件只需创建任意一种格式的文件即可,不用两个都创建)。

1#创建一个yaml格式的服务发现文件
2mkdir -p /usr/local/prometheus-3.5.0/targets
3cd /usr/local/prometheus-3.5.0/targets
4vi dev-server.yml
5
6#【dev-server.yml】文件的完整内容:
7- targets:
8  - "192.168.1.9:9100"
9  - "192.168.1.37:9100"
10  - "192.168.1.39:9100"
11  labels:
12    env: test
13    app: "dev-server" 

说明:

《1》.yaml 和 .yml 是 YAML 文件的两种扩展名,语法、功能完全一致,仅为命名习惯差异。

《2》.yaml 是官方推荐格式,.yml 是简写形式(兼容老式文件系统),在 Prometheus 中均可正常使用。

《3》实际项目中建议统一扩展名,优先选择 .yml(简洁且符合行业通用习惯)。

2.3、prometheus配置文件新增基于文件服务发现的配置

在prometheus.yml配置文件中新增文件的服务发现配置

1#在prometheus.yml配置文件中新增文件的服务发现配置
2
3#1-进入prometheus.yml文件路径并编辑
4cd /usr/local/prometheus-3.5.0/
5vi prometheus.yml
6
7#2-【prometheus.yml】文件末尾的【scrape_configs:】下新增基于文件发现的配置
8  - job_name: "node_service_discovery"
9    file_sd_configs:
10    - files:
11      - targets/*.json
12      refresh_interval: 60s
13    - files:
14      - targets/*.yml
15      refresh_interval: 60s
16
17#3-#验证修改后的prometheus.yml文件的语法是否正确(结果显示SUCCESS则表示正确)
18./promtool check config prometheus.yml
19 
20#验证prometheus.yml文件中的语法正确后热重载让配置生效
21curl -XPOST localhost:9090/-/reload
22

说明:

《1》【file_sd_configs】是指定prometheus基于文件的服务发现配置;

《2》【files】是自定义的和prometheus程序同级目录的targets目录,要被自动加载的所有.json与.yml格式文件;也可以单独指定某一个json格式文件。

《3》【refresh_interval】是自定义刷新间隔,这里指定为60秒。

**注意:**在编写.json或.yml文件后,我们到prometheus的web界面【ip:9090】的status-->Target health查看若等待配置的时间间隔后还是没有显示,则需要查看日志【tailf -f /var/log/messages】即可确定错误消息;像这种情况一般都是由于配置的格式不对导致的

三、prometheus中的标签重写

3.1、prometheus中标签的概念

在prometheus所有的Target监控实例中,都包含一些默认的Metadata标签信息。可以通过prometheus的Web UI界面中的status-->Target health界面中查看到这些实例的元数据标签内容,默认情况下,当prometheus加载Target实例完成后,这些Target都会包含一些默认的标签:

《1》【__address__】当前Target实例的访问地址<host>:<port>

《2》【__scheme__】采集目标服务访问地址的HTTP Scheme,HTTP或HTTPS;

《3》【__metrics_path__】采集目标服务访问地址的访问路径;

《4》【__param_<name>__】采集任务目标服务中包含的请求参数。

一般来说,Target以两个下划线开头与结尾(__)的标签是在系统内部使用的,因此这些标签不会被写入到样本数据中。不过这里有一些例外,比如:指标上的instance标签的默认值就来自于_address__标签的值。这里实际上是发生了一次标签的重写处理。

这种发生在采集样本数据之前,对Target实例的标签进行重写的机制在Prometheus被称为Relabeling。Prometheus允许用户在采集任务中设置通过relabel_configs来添加自定义的Relabeling过程。

如下图所示:

3.2、relabel_configs的使用

relabel_configs的常用参数

序号relabel_configs常用参数说明
1source_labels源标签,没有经过relabel处理之前的名字
2target_labels通过action处理之后的新标签名字
3regex正则表达式,匹配源标签
4replacement通过分组替换后标签(target_label)对应的值
5action执行的动作 支持replace、drop、keep、labelmap、labeldrop、labelkeep、hashmod

action中每个relabel_action参数的含义

序号relabel_action参数说明
1replace根据 regex 的配置,匹配 source_labels 标签的值,并且将匹配到的值写入到 target_label 当中,如果有多个匹配组,则可以使用 ${1}, ${2} 确定写入的内容。如果没匹配到任何内容,则不对 target_label 进行重新, 默认为 replace。
2keep丢弃 source_labels 的值中没有匹配到 regex 正则表达式内容的 Target 实例
3drop丢弃 source_labels 的值中匹配到 regex 正则表达式内容的 Target 实例
4hashmod将 target_label 设置为关联的 source_label 的哈希模块
5labelmap根据 regex 去匹配 Target 实例所有标签的名称(注意是名称),并且将捕获到的内容作为新的标签名称,regex 匹配到标签的的值,作为新标签的值
6labeldrop对 Target 标签进行过滤,会移除匹配过滤条件的所有标签
7labelkeep对 Target 标签进行过滤,会移除不匹配过滤条件的所有标签

3.2.1、示例一:给target增加标签

如:给job_name为prometheus新增标签【env】【__hostname__】内容:

1#给target增加标签
2
3cd /usr/local/prometheus-3.5.0/
4vi prometheus.yml
5
6#示例:给job_name为prometheus新增标签【env】【__hostname__】内容:
7scrape_configs:
8  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
9  - job_name: "prometheus"
10
11    # metrics_path defaults to '/metrics'
12    # scheme defaults to 'http'.
13
14    static_configs:
15      - targets: ["localhost:9090",'192.168.1.39:9100','192.168.1.36:9100','192.168.1.37:9100',"192.168.1.25:9100"]
16       # The label name is added as a label `label_name=<label_value>` to any timeseries scraped from this config.
17        labels:
18          app: "prometheus"
19          env: "cktest"
20          __hostname__: "cklocalhost"
21
22
23#验证修改后的prometheus.yml文件的语法是否正确(结果显示SUCCESS则表示正确)
24./promtool check config prometheus.yml
25 
26#验证prometheus.yml文件中的语法正确后热重载让配置生效
27curl -XPOST localhost:9090/-/reload

**注意:**内部标签默认是不显示的,只有把鼠标点击下标箭头展开才会显示。同时,要注意双下划线(__)开头与结尾的标签是不会写到metrics指标里面的,因为这属于系统内置标签。env这种没有__作为前缀的,是可以写到metrics指标中的。

3.2.2、示例二:将target的初始标签里面的值替换到新的标签中

1#将target的初始标签里面的值替换到新标签中
2
3cd /usr/local/prometheus-3.5.0/
4vi prometheus.yml
5
6#示例二:将初始的【__address__】值替换到新标签addr中;初始的【__metrics_path__】的值替换到新标签metrics_path中
7scrape_configs:
8  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
9  - job_name: "prometheus"
10
11    # metrics_path defaults to '/metrics'
12    # scheme defaults to 'http'.
13
14    static_configs:
15      - targets: ["localhost:9090",'192.168.1.39:9100','192.168.1.36:9100','192.168.1.37:9100',"192.168.1.25:9100"]
16       # The label name is added as a label `label_name=<label_value>` to any timeseries scraped from this config.
17        labels:
18          app: "prometheus"
19    relabel_configs:
20      - source_labels: ["__address__"]
21        target_label: "addr"
22      - source_labels: ["__metrics_path__"]
23        target_label: "metrics_path"
24
25
26#验证修改后的prometheus.yml文件的语法是否正确(结果显示SUCCESS则表示正确)
27./promtool check config prometheus.yml
28 
29#验证prometheus.yml文件中的语法正确后热重载让配置生效
30curl -XPOST localhost:9090/-/reload

1#将target的初始标签里面的值替换到新标签中
2
3cd /usr/local/prometheus-3.5.0/
4vi prometheus.yml
5
6#示例二:将初始的【__address__】值替换到新标签addr中,且通过正则以冒号分割为两个部分,将addr的值修改为只取正则分割后的第一个部分;初始的【__metrics_path__】的值替换到新标签
7
8scrape_configs:
9  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
10  - job_name: "prometheus"
11
12    # metrics_path defaults to '/metrics'
13    # scheme defaults to 'http'.
14
15    static_configs:
16      - targets: ["localhost:9090",'192.168.1.39:9100','192.168.1.36:9100','192.168.1.37:9100',"192.168.1.25:9100"]
17       # The label name is added as a label `label_name=<label_value>` to any timeseries scraped from this config.
18        labels:
19          app: "prometheus"
20    relabel_configs:
21      - source_labels: ["__address__"]
22        target_label: "addr"
23        regex: "(.*):(.*)"
24        replacement: $1
25      - source_labels: ["__metrics_path__"]
26        target_label: "metrics_path"
27
28
29#验证修改后的prometheus.yml文件的语法是否正确(结果显示SUCCESS则表示正确)
30./promtool check config prometheus.yml
31 
32#验证prometheus.yml文件中的语法正确后热重载让配置生效
33curl -XPOST localhost:9090/-/reload

3.2.3、示例三:使用labelmap标签名替换

【labelmap】 根据 regex 去匹配 Target 实例所有标签的名称(注意是名称),并且将捕获到的内容作为为新的标签名称,regex 匹配到标签的的值作为新标签的值.当然这个新的标签也会加到样本数据中。

1#使用labelmap标签名替换
2
3cd /usr/local/prometheus-3.5.0/
4vi prometheus.yml
5
6#示例:首先使用正则表达式进行匹配,然后使用labelmap对正则表达式匹配到的标签名作为新的标签,新标签的值为原标签对应的值
7
8scrape_configs:
9  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
10  - job_name: "prometheus"
11
12    # metrics_path defaults to '/metrics'
13    # scheme defaults to 'http'.
14
15    static_configs:
16      - targets: ["localhost:9090",'192.168.1.39:9100','192.168.1.36:9100','192.168.1.37:9100',"192.168.1.25:9100"]
17       # The label name is added as a label `label_name=<label_value>` to any timeseries scraped from this config.
18        labels:
19          app: "prometheus"
20    relabel_configs:
21      - source_labels: ["__address__"]
22        target_label: "addr"
23        regex: "(.*):(.*)"
24        replacement: $1
25      - source_labels: ["__metrics_path__"]
26        regex: __metrics_(.+)__
27        action: labelmap
28      - regex: __scrape_(.+)__
29        action: labelmap
30
31
32#验证修改后的prometheus.yml文件的语法是否正确(结果显示SUCCESS则表示正确)
33./promtool check config prometheus.yml
34 
35#验证prometheus.yml文件中的语法正确后热重载让配置生效
36curl -XPOST localhost:9090/-/reload


Prometheus+Grafana构建云原生分布式监控系统(十)_prometheus的服务发现机制(一)》 是转载文章,点击查看原文


相关推荐


Polyfill方式解决前端兼容性问题:core-js包结构与各种配置策略
漂流瓶jz2026/1/20

简介 在之前我介绍过Babel:解锁Babel核心功能:从转义语法到插件开发,Babel是一个使用AST转义JavaScript语法,提高代码在浏览器兼容性的工具。但有些ECMAScript并不是新的语法,而是一些新对象,新方法等等,这些并不能使用AST抽象语法树来转义。因此Babel利用core-js实现这些代码的兼容性。 core-js是一个知名的前端工具库,里面包含了ECMAScript标准中提供的新对象/新方法等,而且是使用旧版本支持的语法来实现这些新的API。这样即使浏览器没有实现标准


一文搞懂机器学习中的特征降维!
aicoting2026/1/12

推荐直接网站在线阅读:aicoting AI算法面试学习在线网站 特征工程(Feature Engineering) 是机器学习流程中将原始数据转换为适合模型学习的特征的关键步骤。它直接决定了模型能否高效捕捉数据中的规律。好的特征可以显著提升模型性能,而差的特征即使模型再复杂也难以取得好效果。 特征工程的核心目标是: 提取有效信息:将原始数据中有价值的信号转化为模型可以理解的特征; 减少冗余与噪声:去掉无关或多余的特征,使模型更简洁、更泛化; 增强表达能力:通过构造、组合或降维生成新的特征,


Day 12:Git配置详解:用户信息、编辑器、颜色等配置
CNRio2026/1/4

“你有没有遇到过这样的尴尬:提交代码时,Git显示’Author: Unknown’,然后你发现是自己写的代码,却不知道是谁提交的?别担心,这就像你写了一封信,却没写署名一样!” 🌟 为什么说Git配置是"代码身份证"? 想象一下,你正在写一本小说,每章都署名"匿名作者"。读者会怎么想?他们可能会怀疑这本书是不是真的由你写的。Git配置就是你的"代码身份证",它告诉世界"这代码是我写的"。 正如《Pro Git》中所说: “Git的配置系统是分层的,有三个层次:系统级、全局级和本地级。系统


LeetCode 热题100 --- 双指针专区
谎言西西里2025/12/26

283. 移动零 - 力扣(LeetCode) 题目分析: 题目要求将数组 nums 中所有 0 移动至数组末尾,同时保持其他非零元素的相对顺序不变,并且要求在原数组上进行操作。 核心要求: 0 要移动至数组末尾 非零元素相对位置不变 在原数组上进行操作 解法一(暴力使用数组方法) 遍历数组将其中所有为 0 的数直接使用splice删除并且记录 0 的个数,最后通过push填入“移动”的 0 var moveZeroes = function(nums) { let n = 0;


【大前端】【Android】 Android 手机上导出已安装 App 的 APK
柯南二号2025/12/17

根据是否有 root / adb / 仅手机操作,常见有 4 种靠谱方式。按「实用度 + 成本」整理👇 一、最推荐:ADB 导出(无需 Root,最稳定)⭐️ 适合开发者、抓包、逆向、分析三方 APK 1️⃣ 开启 USB 调试 设置 → 关于手机 → 连续点击“版本号” → 开发者模式 开发者选项 → USB 调试 2️⃣ 找到 APK 路径 adb shell pm list packages | grep wechat 例如: package:com.tence


Agent 入门科普:从"人工智障"到"数字打工人"的进化史
无限大62025/12/9

🤖 Agent 入门科普:从"人工智障"到"数字打工人"的进化史 大家好,欢迎来到无限大的博客,这个专栏是新开的,打算讲一讲Agent,其实早就有学习的打算了 近期在逛github的时候看到一个高star项目,叫做Hello-Agents,项目地址是[github.com/datawhalech…] 我的文章也是参考了这个内容写的,这个系列更新比较慢,因为我也是边学边写的,所以会比较慢,但是我会尽量写的详细一些,用更多贴近生活的抽象案例来讲解,希望能帮助到大家 引言:当 AI 开始自己"打


为什么C语言拒绝函数重载?非要重载怎么做?
码事漫谈2025/11/29

在我们学习C++、Java或C#时,函数重载(Function Overloading)是一个再自然不过的概念:允许两个或多个函数使用相同的名字,只要它们的参数列表(参数的类型、个数或顺序)不同即可。编译器会根据调用时传入的实参,自动选择最匹配的那个函数。 然而,当我们回到C语言的世界,这条规则却失效了。如果你定义了两个同名的函数,即使参数列表不同,编译器也会毫不留情地报出一个“重定义”错误。 那么,为什么C语言的设计者,要“剥夺”这个看似非常实用的特性呢? 答案并非“不能”,而是“不为”。这背


Git常用操作指令
stu_kk2026/2/7

最近给公司小伙伴安排了一下git培训,写了个常用指令,记录一下 一、配置与初始化(首次使用/新建仓库) 指令 功能说明 git config --global user.name "你的姓名" 配置全局用户名(会显示在提交记录中) git config --global user.email "你的公司邮箱" 配置全局用户邮箱 `git config --list 查看配置


【C++】模拟实现 红黑树(RBTree)
yuuki2332332026/2/16

前言: 在掌握 AVL 树的严格平衡机制后,我们发现其虽能将树高严格控制在 O(logN),但「高度差≤1」的强约束也带来了明显代价:插入 / 删除操作中频繁的旋转(最多两次双旋)大幅增加了写操作的开销,且每个节点需额外存储平衡因子和父指针,空间利用率较低。 为解决这一问题,红黑树(Red-Black Tree)作为一种近似平衡的二叉搜索树应运而生 —— 它放弃了 AVL 树 “严格平衡” 的要求,转而通过「节点颜色标记 + 5 条核心规则」实现 “黑高一致” 的弱平衡,将任意根到叶子的路径


React Native 开发环境准备
zh_xuan2026/2/24

一、环境准备 我的环境: 二、建立独立RN工程 1、初始化创建工程 npx react-native init RNApp --version 0.73.4 --skip-install 这个命令提示: ��️ The `init` command is deprecated. E:\android\projects\RNDemo4>cd RNApp - Switch to npx @react-native-community/cli init f

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客