Prometheus 提供通用的 HTTP 服务发现,使其能够通过 HTTP 端点发现目标。
HTTP 服务发现是对现有支持的服务发现机制的补充,并且是基于文件的服务发现的替代方案。
下表比较了我们的两种通用服务发现实现。
项目 | 文件 SD | HTTP SD |
---|---|---|
基于事件 | 是,通过 inotify | 否 |
更新频率 | 即时,通过 inotify 实现 | 遵循 refresh_interval |
格式 | Yaml 或 JSON | JSON |
传输 | 本地文件 | HTTP/HTTPS |
安全 | 基于文件的安全 | TLS, 基本认证, Authorization header, OAuth2 |
如果您实现一个 HTTP 服务发现端点,这里有一些您应该注意的要求。
响应会按原样使用,不进行修改。在每个 refresh interval(默认:1 分钟)时,Prometheus 会向 HTTP 服务发现端点发起 GET 请求。该 GET 请求包含一个 X-Prometheus-Refresh-Interval-Seconds
HTTP 头部,其中带有 refresh interval。
SD 端点必须返回 HTTP 200 响应,并带有 HTTP 头部 Content-Type: application/json
。响应必须采用 UTF-8 格式。如果没有需要传输的目标,也必须返回 HTTP 200,并带有一个空列表 []
。目标列表是无序的。
Prometheus 会缓存目标列表。如果在抓取更新的目标列表时发生错误,Prometheus 会继续使用当前目标列表。目标列表不会在重启后保存。prometheus_sd_http_failures_total
计数器指标会记录 refresh 失败的次数。
每次抓取都必须返回整个目标列表。不支持增量更新。Prometheus 实例不会发送其主机名,SD 端点无法知道某个 SD 请求是否是重启后的第一个请求。
HTTP 服务发现的 URL 不被视为秘密。认证和任何 API 密钥应通过适当的认证机制传递。Prometheus 支持 TLS 认证、基本认证、OAuth2 和 authorization 头部。
[
{
"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"
}
}
]
本文档是开源的。请通过提交 issues 或 pull requests 来帮助改进它。