资讯动态

Prometheus 管理 API 完全指南:健康检查、就绪探针与配置热重载/优雅关停

发布时间:2026/9/7 3:13:20 来源:尧图企业网站定制
Prometheus 管理 API 完全指南健康检查、就绪探针与配置热重载/优雅关停【免费下载链接】prometheusThe Prometheus monitoring system and time series database.项目地址: https://gitcode.com/GitHub_Trending/pr/prometheus本篇技术指南以 Prometheus 官方文档 管理 API 说明 为主体系统讲解/-/healthy、/-/ready、/-/reload、/-/quit四类管理端点的用法、默认行为与启用条件并结合 web/web.go 与 cmd/prometheus/main.go 的源码实现说明其底层原理。读完后你将能够正确配置 Kubernetes/负载均衡器的存活与就绪探针通过--web.enable-lifecycle开启远程重载与关停能力并在自动化脚本中可靠地验证操作结果。管理 API 总览与生命周期开关Prometheus 提供了一组管理 API用于自动化运维和集成对接。官方文档docs/management_api.md归纳出的端点如下端点允许的 HTTP 方法默认状态用途/-/healthyGET、HEAD始终可用健康检查恒返回 200/-/readyGET、HEAD始终可用就绪检查可响应流量时返回 200/-/reloadPUT、POST禁用需--web.enable-lifecycle重新加载配置文件与规则文件/-/quitPUT、POST禁用需--web.enable-lifecycle触发优雅关停其中/-/reload和/-/quit这两个生命周期 API默认是关闭的。启动参数--web.enable-lifecycle的定义见 main.go 第 470 行--web.enable-lifecycle: Enable shutdown and reload via HTTP request. (default false)从源码结构看web/web.go 第 581–595 行 清晰地展示了这一开关的路由注册逻辑当o.EnableLifecycle为 true 时/-/quit与/-/reload的 POST/PUT 请求被绑定到真实的处理函数h.quit/h.reload否则这四个方法全部注册到一个统一返回403 Forbidden的处理器响应体为Lifecycle API is not enabled.也就是说即使不启用生命周期 API调用这两个端点也不会得到 404而是明确的 403 提示——这在排查为什么远程重载不生效时很有价值如果收到的是 403 而不是 405 或成功响应说明部署时漏加了--web.enable-lifecycle启动参数参数默认值说明见 命令行参考。另外两个细节也来自同一路由注册代码对/-/quit和/-/reload使用GET方法会收到405 Method Not Allowed响应体为Only POST or PUT requests allowedweb/web.go 第 596–603 行。因此健康巡检脚本不应使用 GET 探测这两个端点健康/就绪端点则无此限制GET 与 HEAD 均已显式注册web/web.go 第 608–621 行。健康检查GET /-/healthyGET /-/healthy HEAD /-/healthy按文档说明该端点始终返回 200用于检查 Prometheus 进程是否存活。源码实现印证了这一点web/web.go 第 608–614 行GET 请求返回 200 和Prometheus is Healthy.文本HEAD 请求仅返回 200 状态码二者都不依赖任何内部组件状态router.Get(/-/healthy, func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusOK) fmt.Fprintf(w, %s is Healthy.\n, o.AppName) }) router.Head(/-/healthy, func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusOK) })这意味着/ready失败而/healthy成功说明进程活着但尚未准备好服务例如启动初期 TSDB 加载阶段/healthy失败则说明进程或监听端口本身出了问题。这一区分正是 Kubernetes 中 liveness 与 readiness 探针分离设计的典型落地场景。就绪检查GET /-/readyGET /-/ready HEAD /-/ready该端点在 Prometheus 已准备好接收流量即可正常响应查询时返回 200。与/healthy的无条件 200不同/-/ready的响应被一层就绪状态包装器readyf即Handler.testReady拦截实现见 web/web.go 第 681–698 行func (h *Handler) testReady(f http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { switch ReadyStatus(h.ready.Load()) { case Ready: f(w, r) case NotReady: w.Header().Set(X-Prometheus-Stopping, false) w.WriteHeader(http.StatusServiceUnavailable) fmt.Fprint(w, Service Unavailable) case Stopping: w.Header().Set(X-Prometheus-Stopping, true) w.WriteHeader(http.StatusServiceUnavailable) fmt.Fprint(w, Service Unavailable) default: w.WriteHeader(http.StatusInternalServerError) ...由此可以得到三个可验证的实现事实状态由原子变量h.ready保存通过SetReady切换web/web.go 第 663–673 行同时联动ready指标暴露未就绪NotReady或正在停止Stopping时均返回503 Service Unavailable并通过响应头X-Prometheus-Stopping区分二者false/true。探针或客户端可以用这个头判断实例是还没起来还是正在退出同样的包装器还应用在/federate、/consoles/*等路由上web/web.go 第 504–508 行即未就绪时联邦抓取同样会被拒。此外Prometheus 自带的 Web UI 也把/-/ready当作前端门禁新版前端组件 ReadinessWrapper.tsx 和旧版 useFetch.ts 在渲染页面前都会先请求/-/ready未就绪时不展示查询界面。行为验证可参考 web/web_test.go 第 359–389 行 的测试用例它构造了 Ready 与 503 交替出现的场景并断言/ready端点在各状态下返回的状态码计数正确第 713–734 行附近还覆盖了 RoutePrefix 前缀下/healthy、/ready的可达性。配置热重载PUT /-/reload 与 POST /-/reloadPUT /-/reload POST /-/reload该端点触发 Prometheus配置与规则文件的重新加载。文档明确指出它默认禁用需通过--web.enable-lifecycle开启。请求处理与同步应答处理函数Handler.reload的实现见 web/web.go 第 962–968 行func (h *Handler) reload(w http.ResponseWriter, _ *http.Request) { rc : make(chan error) h.reloadCh - rc if err : -rc; err ! nil { http.Error(w, fmt.Sprintf(failed to reload config: %s, err), http.StatusInternalServerError) } }可以注意到这是一个同步等待的设计HTTP handler 把一次性结果通道rc投递到全局的reloadCh然后阻塞等待结果失败时返回500并在响应体中携带错误信息。也就是说curl -X POST成功返回本身就等价于本次重载已成功可以直接在 CI/CD 或配置下发脚本里作为成功判据。底层重载循环HTTP 与 SIGHUP 共用同一条链路真正执行重载的是主进程中的重载 goroutine见 main.go 第 1376–1429 行。它的核心是一个select循环同时监听三类事件for { select { case -hup: // 1. SIGHUP 信号 if err : reloadConfig(...); err ! nil { logger.Error(Error reloading config, err, err) } case rc : -webHandler.Reload(): // 2. HTTP /-/reload 请求 if err : reloadConfig(...); err ! nil { logger.Error(Error reloading config, err, err) rc - err } else { rc - nil } case -time.Tick(time.Duration(cfg.autoReloadInterval)): // 3. 周期自动重载 ...这段代码揭示了三个要点SIGHUP 与 HTTP 重载是等价入口signal.Notify(hup, syscall.SIGHUP)main.go 第 1381–1382 行注册的信号通道与webHandler.Reload()通道汇聚到同一个reloadConfig(...)调用二者行为一致只是错误传播路径不同HTTP 入口会同步把错误回传给客户端存在周期自动重载机制当启用了自动重载源码中cfg.enableAutoReload、cfg.autoReloadInterval控制时循环还会按固定间隔比对配置文件校验和config.GenerateChecksum并触发重载此时可以完全不依赖信号或 HTTP 端点重载成败有指标可观测web/web.go 第 920–922 行 的/metrics查询映射中列出了prometheus_config_last_reload_successfulgauge最近一次重载是否成功与prometheus_config_last_reload_success_timestamp_seconds最近一次成功重载的时间戳。即使不关注 HTTP 响应码也可以用这两个指标做告警例如配置重载长期不成功。端到端行为有专门的测试覆盖cmd/prometheus/reload_test.go 验证了配置修改后触发重载、以及重载失败时的回滚与报错web/web_test.go 第 508 行附近 则对/-/quit//-/reload在生命周期 API 禁用时返回 403 的场景做了断言。典型调用示例# 通过 HTTP 触发重载需 --web.enable-lifecycle curl -X POST http://localhost:9090/-/reload -w %{http_code} # 等价方式发送 SIGHUP不需要 enable-lifecycle但需进程管理权限 kill -HUP $(pidof prometheus)优雅关停PUT /-/quit 与 POST /-/quitPUT /-/quit POST /-/quit该端点触发 Prometheus 的优雅关停同样默认禁用需--web.enable-lifecycle开启。处理函数Handler.quit见 web/web.go 第 950–960 行func (h *Handler) quit(w http.ResponseWriter, _ *http.Request) { var closed bool h.quitOnce.Do(func() { closed true close(h.quitCh) fmt.Fprint(w, Requesting termination... Goodbye!) }) if !closed { fmt.Fprint(w, Termination already in progress.) } }两个值得注意的实现细节幂等设计quitOncesync.Once保证quitCh只被 close 一次。首个请求会得到Requesting termination... Goodbye!并发的重复请求会得到Termination already in progress.的提示而不会造成二次关停副作用关停是异步开始的HTTP 响应返回表示关停请求已被接受而非进程已退出。客户端若以该请求完成作为下线判据应配合/-/ready返回 503且X-Prometheus-Stopping: true见上文Stopping状态来确认实例已进入停止流程。主进程侧通过Handler.Quit()暴露的只读通道web/web.go 第 701–704 行接收该信号并执行资源清理。信号方式不启用 HTTP 生命周期 API 时的替代方案文档对两个生命周期端点各给出了一条替代路径——直接向进程发信号操作HTTP 端点需 enable-lifecycle信号方式始终可用重载配置PUT/POST /-/reloadkill -HUP pid优雅关停PUT/POST /-/quitkill -TERM pid信号处理均在主进程初始化阶段注册SIGHUP的重载监听见 main.go 第 1381–1382 行SIGTERM含os.Interrupt即CtrlC的SIGINT的关停监听见 main.go 第 1271 行signal.Notify(term, os.Interrupt, syscall.SIGTERM)从源码结构看信号通道的关闭被包在sync.Once中以便在多个执行阶段SIGTERM 或配置加载完成时都能安全关闭同一条通道这与 HTTP 入口的幂等关停设计相呼应。两种方式的选型建议容器化/编排环境Kubernetes、Docker优先用/-/ready做就绪/存活探测配置下发流水线用/-/reload热更新避免重启实例关停交给编排器发 SIGTERM/-/quit作为补充手段裸机/systemd 环境如果无法保证进程管理工具支持信号转发或希望在 HTTP 层统一运维入口则启用--web.enable-lifecycle安全考虑/-/quit是一个能终止服务的能力端点若 Prometheus 的 Web 端口直接暴露给不可信网络务必通过--web.enable-lifecyclefalse默认值关闭它并依靠反向代理/网络策略限制管理面访问。小结Prometheus 的管理 API 由四个端点构成/-/healthy提供无条件 200 的存活探测/-/ready依据内部就绪状态返回 200/503并用X-Prometheus-Stopping头区分未就绪与停止中/-/reload与/-/quit在--web.enable-lifecycle开启后提供与SIGHUP/SIGTERM等价的远程热重载与优雅关停能力且重载端点会同步返回失败原因、失败重载可通过prometheus_config_last_reload_successful指标持续观测。相关实现集中于 web/web.go路由注册与处理器与 cmd/prometheus/main.go启动参数与信号/重载循环行为验证可参考 web/web_test.go 与 cmd/prometheus/reload_test.go。【免费下载链接】prometheusThe Prometheus monitoring system and time series database.项目地址: https://gitcode.com/GitHub_Trending/pr/prometheus创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价