博客
关于我
Prometheus 云原生 - 基于 file_sd、http_sd 实现 Service Discovery
阅读量:796 次
发布时间:2023-03-04

本文共 3408 字,大约阅读时间需要 11 分钟。

服务发现机制:从零到hero

为什么需要服务发现机制

在Prometheus的配置文件中,我们知道可以通过static_configs来配置静态地址获取数据。但在云环境下,尤其是在容器化环境中,抓取地址经常是动态变化的。每次地址变动都意味着我们需要手动修改prometheus.yml文件并重启Prometheus,这种操作实在是太麻烦了。

因此,我们引入了file_sdhttp_sd等服务发现机制,让Prometheus能够自动获取最新的监控目标。

File Service Discovery(file_sd)

基本概念

file_sd是基于文件的服务发现机制,用于动态更新Prometheus的数据。这种方式的工作原理是将原本在prometheus.yml中通过static_config配置的方式,统一写入一个文件中(例如,mysql集群所有实例写入一个文件,mongo集群所有实例写入另一个文件...)。文件的格式可以是ymljson,并且必须包含一个静态配置的列表。

通常更多的使用json格式,如下所示:

[  {    "targets": ["10.0.1.1:9100"],    "labels": {      "env": "master",      "job": "mysql"    }  },  {    "targets": ["10.0.0.1:9100", "10.0.0.2:9100"],    "labels": {      "env": "slave",      "job": "mysql"    }  },  // 其他目标配置...]
  • targets:是目标地址数组。
  • labels:是标签映射,用于自定义目标信息。至少需要包含jobenv标签。

配置方式

prometheus.yml中配置file_sd如下:

scrape_configs:  - job_name: 'file_sd_example'    file_sd_configs:      - files: ['/root/prometheus/targets/*.json']        refresh_interval: 10s

Prometheus会每10秒读取/root/prometheus/targets/目录下的所有.json文件,获取最新的监控目标。

使用案例

假设我们有一个prometheus.yml配置文件:

scrape_configs:  - job_name: file_sd_expoter    file_sd_configs:      - files: ['/sd/*.json']        refresh_interval: 5s

在Docker环境中部署Prometheus时,需要注意文件路径是容器内的路径。建议在启动容器时挂载好目录,以便操作。

目标JSON文件示例:

[  {    "targets": ["env-base:9100"],    "labels": {      "env": "prod",      "job": "node_exporter"    }  },  {    "targets": ["env-base:9104", "env-base:9121"],    "labels": {      "env": "prod",      "job": "mysql_and_redis_exporter"    }  }]

启动Prometheus容器后,在浏览器中输入env-base:9090进入Prometheus主页,进入Targets目录即可查看监控目标。


HTTP Service Discovery(http_sd)

基本概念

http_sd方式允许Prometheus通过HTTP请求动态获取需要监控的目标列表。

工作原理

  • 首先需要配置HTTP端点,在prometheus.yml文件中指定一个HTTP端点。
  • Prometheus会定期向该HTTP端点发送GET请求,获取最新的目标列表。
  • HTTP端点返回的目标列表必须是JSON格式的大数组。
  • HTTP端点返回的数据示例:

    [  {    "targets": ["10.0.0.1:9100", "10.0.0.2:9100"],    "labels": {      "env": "prod",      "job": "node_exporter"    }  },  {    "targets": ["10.0.1.1:9100"],    "labels": {      "env": "staging",      "job": "node_exporter"    }  }]
    • targets:目标地址数组。
    • labels:标签映射,键值对的第一个字符不能为数字。

    配置方式

    prometheus.yml中配置http_sd如下:

    scrape_configs:  - job_name: 'http_sd_example'    http_sd_configs:      - url: 'http://example.com/targets'        refresh_interval: 10s

    注意事项

    • URL格式必须为http://ip:port
    • 不支持携带cookie或header,如果需要鉴权建议通过querystring传参。

    使用案例

    在公司项目中,通常会部署一个发布系统来复杂地将程序发布到预发、生产等环境。发布系统可以提供一个HTTP接口,用于从数据库中获取所有服务器的套接字信息,并返回指定格式的JSON数据。

    例如,SpringBoot应用中的一个简单示例:

    @RestControllerclass HttpApi {    @RequestMapping("/targets")    fun targets(): List
    { // 从数据库中获取对应的套接字信息... // 组装JSON数据 val v1 = PrometheusVo( targets = listOf("env-base:9100"), labels = Labels( env = "prod", job = "node_exporter" ) ) val v2 = PrometheusVo( targets = listOf("env-base:9104", "env-base:9121"), labels = Labels( env = "prod", job = "mysql_and_redis_exporter" ) ) return listOf(v1, v2) }}data class PrometheusVo( val targets: List
    , val labels: Labels)data class Labels( val env: String, val job: String)

    访问100.94.135.96:9000/targets可以看到以下内容:

    {    "targets": ["env-base:9100"],    "labels": {        "env": "prod",        "job": "node_exporter"    }}

    总结

    通过以上两种服务发现机制,Prometheus能够更加灵活地监控动态变化的目标地址。在实际应用中,可以根据项目需求选择合适的方式。无论是基于文件的file_sd,还是基于HTTP的http_sd,都能显著提升监控系统的可维护性和扩展性。

    转载地址:http://ohxfk.baihongyu.com/

    你可能感兴趣的文章
    postman进行http接口测试
    查看>>
    Postman高阶技能:Collection集合批量运行!
    查看>>
    postMessage跨标签页共享数据
    查看>>
    QImage对一般图像的处理
    查看>>
    post为什么会发送两次请求?
    查看>>
    Post表单提交TextArea的值出现转译乱码问题 - Spring MVC处理表单提交
    查看>>
    Power BI 中的 Python 可视化需要什么设置?任何特定的 matplotlib 包版本或系统设置?
    查看>>
    Power BI:如何在 Power Query 编辑器中将 Python 与多个表一起使用?
    查看>>
    power english (3) main text -emotion mastery - focus
    查看>>
    POWER ENGLISH (6) - MODEL
    查看>>
    power english (1) —— passion
    查看>>
    Power English (1) 原文
    查看>>
    power English (3)原文
    查看>>
    POWER ENGLISH(7)- repetition
    查看>>
    SpringBoot中集成SpringBatch详细解析与实战示例(CSV文件读取十万条数据进行业务处理后写入Mysql数据库)
    查看>>
    powerbi 一张表在另外一张表中出现的数量_PowerBi之初步学习笔记
    查看>>
    QGIS怎样设置简体中文以及新建可编辑的多边形的图层
    查看>>
    PowerBuilder 使用自定义事件触发键盘Enter事件
    查看>>
    PowerCreatorCMS UploadResourcePic 任意文件上传漏洞复现
    查看>>
    PowerDesigner 使用的一些技巧(转)
    查看>>