编写 HTTP 服务发现
Prometheus 提供了一个通用的 HTTP 服务发现,它允许通过 HTTP 端点发现目标。
HTTP 服务发现是对支持的服务发现机制的补充,并且是 基于文件的服务发现 的替代方案。
基于文件的 SD 和 HTTP SD 的比较
下表比较了我们两个通用的服务发现实现。
| 项目 | 文件 SD | HTTP SD |
|---|---|---|
| 基于事件 | 是,通过 inotify | 否 |
| 更新频率 | 即时,得益于 inotify | 遵循 refresh_interval |
| 格式 | Yaml 或 JSON | JSON |
| 传输 | 本地文件 | HTTP/HTTPS |
| 安全 | 基于文件的安全 | TLS,基本认证,授权头,OAuth2 |
HTTP SD 端点的要求
如果您实现了 HTTP SD 端点,以下是一些您应该注意的要求。
响应将被原样使用,不做修改。在每个刷新间隔(默认为 1 分钟)时,Prometheus 将对 HTTP SD 端点执行 GET 请求。GET 请求包含一个 X-Prometheus-Refresh-Interval-Seconds HTTP 头,指定刷新间隔。
SD 端点必须响应 HTTP 200,并带有一个 Content-Type: application/json 的 HTTP 头。响应必须是 UTF-8 编码的。如果不需要传输任何目标,也必须发出 HTTP 200 响应,并带有一个空列表 []。目标列表是无序的。
Prometheus 会缓存目标列表。如果在获取更新的目标列表时发生错误,Prometheus 将继续使用当前的目标列表。目标列表不会在重启后保存。prometheus_sd_refresh_failures_total 计数器指标用于跟踪刷新失败的次数,而 prometheus_sd_refresh_duration_seconds 存储桶可用于跟踪 HTTP SD 刷新尝试或性能。
必须在每次抓取时返回整个目标列表。不支持增量更新。Prometheus 实例不会发送其主机名,SD 端点也无法得知此 SD 请求是重启后的第一次请求还是其他情况。
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"
}
}
]