编写 HTTP 服务发现

Prometheus 提供了一个通用的 HTTP 服务发现,使其能够通过 HTTP 端点发现目标。

HTTP 服务发现是对支持的服务发现机制的补充,并且是 基于文件的服务发现 的替代方案。

基于文件的服务发现 (File-Based SD) 和 HTTP 服务发现 (HTTP SD) 之间的比较

下表比较了我们的两个通用服务发现实现。

项目 文件服务发现 HTTP 服务发现
基于事件 是,通过 inotify
更新频率 瞬时,感谢 inotify 遵循 refresh_interval
格式 Yaml 或 JSON JSON
传输 本地文件 HTTP/HTTPS
安全 基于文件的安全 TLS, 基本身份验证, Authorization header, OAuth2

HTTP 服务发现 (HTTP SD) 端点的要求

如果您实现了 HTTP 服务发现 (HTTP SD) 端点,以下是您应该注意的一些要求。

响应按原样使用,不进行修改。在每个刷新间隔(默认:1 分钟),Prometheus 将对 HTTP 服务发现 (HTTP SD) 端点执行 GET 请求。GET 请求包含一个带有刷新间隔的 X-Prometheus-Refresh-Interval-Seconds HTTP 标头。

服务发现 (SD) 端点必须以 HTTP 200 响应进行答复,并带有 HTTP 标头 Content-Type: application/json。答案必须是 UTF-8 格式。如果无需传输目标,也必须发出 HTTP 200,并带有一个空列表 []。目标列表是无序的。

Prometheus 缓存目标列表。如果在获取更新的目标列表时发生错误,Prometheus 将继续使用当前目标列表。目标列表不会跨重启保存。prometheus_sd_http_failures_total 计数器指标跟踪刷新失败的次数。

每次抓取都必须返回整个目标列表。不支持增量更新。Prometheus 实例不发送其主机名,服务发现 (SD) 端点无法知道服务发现 (SD) 请求是否是重启后的第一个请求。

HTTP 服务发现 (HTTP SD) 的 URL 不被认为是秘密的。身份验证和任何 API 密钥应通过适当的身份验证机制传递。Prometheus 支持 TLS 身份验证、基本身份验证、OAuth2 和授权标头。

HTTP_SD 格式

[
  {
    "targets": [ "<host>", ... ],
    "labels": {
      "<labelname>": "<labelvalue>", ...
    }
  },
  ...
]

示例

[
    {
        "targets": ["10.0.10.2:9100", "10.0.10.3:9100", "10.0.10.4:9100", "10.0.10.5:9100"],
        "labels": {
            "__meta_datacenter": "london",
            "__meta_prometheus_job": "node"
        }
    },
    {
        "targets": ["10.0.40.2:9100", "10.0.40.3:9100"],
        "labels": {
            "__meta_datacenter": "london",
            "__meta_prometheus_job": "alertmanager"
        }
    },
    {
        "targets": ["10.0.40.2:9093", "10.0.40.3:9093"],
        "labels": {
            "__meta_datacenter": "newyork",
            "__meta_prometheus_job": "alertmanager"
        }
    }
]

本文档是 开源的。请通过提交问题或拉取请求来帮助改进它。