Homepage 集成 Watchtower 容器更新监控 Widget:配置指南与 Prometheus 指标解析原理
【免费下载链接】homepageA highly customizable homepage (or startpage / application dashboard) with Docker and service API integrations.项目地址: https://gitcode.com/GitHub_Trending/ho/homepage
导读
本文讲解如何在 Homepage 应用仪表盘中集成 Watchtower 为骨架,结合仓库中src/widgets/watchtower/目录下的源码与测试,深入剖析该 Widget 如何通过带 Bearer Token 的 HTTP 代理请求 Watchtower 的 Prometheus 指标端点,并把纯文本指标转换为看板数据块的全过程。读完你将能独立完成 Watchtower Widget 的配置、排错,并理解其底层实现机制。
前置条件:为 Watchtower 开启 Metrics API
Watchtower 的默认安装并不会暴露指标接口,因此在配置 Homepage Widget 之前,需要先启用 Watchtower 的 metrics 功能。官方要求 Widget 正常工作,Watchtower 必须配置为启用 metrics API(对应--metrics启动参数或WATCHTOWER_METRICS=true环境变量)。
启用后,Watchtower 会额外监听一个 HTTP 端口(默认8080),并暴露/v1/metrics端点,以 Prometheus 文本格式输出运行时指标——这正是 Homepage Widget 的数据来源。
Widget 基础配置
在 Homepage 的services.yaml中,为对应的 Watchtower 服务添加如下 Widget 配置块:
widget: type: watchtower url: http://your-ip-address:8080 key: demotoken三个核心字段的含义如下:
| 字段 | 必填 | 说明 |
|---|---|---|
type | 是 | 固定为watchtower,用于在 src/widgets/widgets.js 的组件注册表中查找对应实现 |
url | 是 | Watchtower Metrics API 的访问地址,协议 + IP/域名 + 端口,如http://192.168.1.10:8080 |
key | 否 | 访问 Metrics API 所需的访问令牌,对应 Watchtower 的--metrics-token启动参数或WATCHTOWER_METRICS_TOKEN环境变量 |
说明:
key是可选的——如果 Watchtower 未设置 token,Homepage 仍会发送Authorization: Bearer <key>请求头,但此时 key 为空即可;若 Watchtower 配置了 token,则必须在此处填写相同值,否则请求会被 Watchtower 拒绝。
数据字段:三个核心指标
该 Widget 支持三个数据字段(由文档明确限定,与前端组件一一对应):
containers_scanned:本次扫描检查的容器总数(对应指标watchtower_containers_scanned)containers_updated:本次扫描中实际完成更新的容器数量(对应指标watchtower_containers_updated)containers_failed:本次扫描中更新失败的容器数量(对应指标watchtower_containers_failed)
这三个指标在 public/locales/en/common.json 中定义了显示标签(Scanned / Updated / Failed),前端组件据此渲染三个数据块。
源码级原理:从 Metrics 端点到看板数据块
配置之外的实现细节,全部可以在src/widgets/watchtower/目录下找到。整个数据链路分为三层。
1. Widget 定义与端点映射
widget.js 定义了 API 模板与端点映射:
const widget = { api: "{url}/{endpoint}", proxyHandler: watchtowerProxyHandler, mappings: { watchtower: { endpoint: "v1/metrics", }, }, };api: "{url}/{endpoint}"是通用 API 地址模板,{url}会被替换为配置里的url,{endpoint}被替换为v1/metrics,最终拼接出完整地址http://your-ip-address:8080/v1/metrics。模板替换逻辑位于 src/utils/proxy/api-helpers.js 的formatApiCall,该函数还会自动去掉url末尾的多余斜杠。mappings.watchtower.endpoint指明本 Widget 唯一使用的端点是v1/metrics,即 Watchtower 官方文档中的 Prometheus 指标路径。
2. 代理处理器:请求鉴权与指标解析
proxy.js 是核心实现,其工作流程如下:
- 从请求参数中取出
group、service、index,并通过getServiceWidget(来自 src/utils/config/service-helpers.js)加载该服务对应的 Widget 配置;若服务不存在,直接返回400。 - 用
formatApiCall拼接完整指标 URL。 - 通过
httpProxy(来自 src/utils/proxy/http.js)发起GET请求,请求头携带Authorization: Bearer ${widget.key}——这就是文档中key字段的底层用途。 - 状态码非
200或无数据时,记录日志并返回对应 HTTP 错误。 - 文本解析:Watchtower 的
/v1/metrics返回的是 Prometheus 纯文本格式。代理处理器将响应体按换行拆分,仅保留以watchtower开头的行,再按空格切分,组装为{ 指标名: 值 }的 JSON 对象返回前端。
这一解析逻辑在 proxy.test.js 中有完整的单测覆盖:测试构造了包含watchtower_running 1、foo 2、watchtower_status 3三行的模拟响应,断言最终只保留watchtower_running与watchtower_status两个键,并验证请求 URL 为http://watch/metrics、鉴权头为Bearer k。
3. 前端组件:渲染三个数据块
component.jsx 通过useWidgetAPI(来自 src/utils/proxy/use-widget-api.js,底层基于 SWR)请求watchtower端点数据:
- 加载中:渲染三个仅含标签(Scanned / Updated / Failed)的占位块;
- 加载成功:分别读取
watchData.watchtower_containers_scanned、watchData.watchtower_containers_updated、watchData.watchtower_containers_failed,并用common.number国际化格式化数值后填入三个 Block; - 请求出错:显示错误容器。
component.test.jsx 验证了加载占位与数据渲染两种状态,确保三个数据块与指标键严格对应。
完整配置示例
结合以上分析,一个可运行的完整services.yaml配置片段如下:
- Watchtower: icon: sh-watchtower href: http://your-ip-address:8080 description: Container auto-update monitor widget: type: watchtower url: http://your-ip-address:8080 key: demotoken若 Watchtower 未启用 token 鉴权,key字段可省略。
常见问题排查
- 显示 HTTP Error 401/403:
key与 Watchtower 的WATCHTOWER_METRICS_TOKEN不一致,或该字段为空但 Watchtower 启用了 token 校验。 - 显示 HTTP Error 404:Watchtower 未启用 metrics API(缺少
--metrics/WATCHTOWER_METRICS=true),或url端口填写错误(metrics 端口默认8080,与 Watchtower 主控制端口不同)。 - 数据一直为占位符:确认
url中的 IP/端口在 Homepage 服务端可达;Homepage 的代理请求由服务端发起,而非浏览器。 - 指标值全部为 0:属正常现象——Watchtower 的指标记录的是最近一次扫描结果,若尚未到扫描周期或扫描刚完成、无失败/更新发生,
updated与failed自然为 0。
小结
Watchtower Widget 是 Homepage 服务仪表盘中典型的「Metrics 端点 + 服务端代理 + 纯文本解析」类 Widget 代表:文档负责给出配置入口,widget.js负责端点映射,proxy.js负责 Bearer 鉴权与 Prometheus 文本解析,component.jsx负责三块指标展示,测试文件则固化了整条链路的正确性。配置时只需确保 Watchtower 开启 metrics、端口与 token 一致,即可在首页实时掌握容器自动更新的健康状态。相关实现与测试可继续查阅 src/widgets/watchtower/ 目录。
【免费下载链接】homepageA highly customizable homepage (or startpage / application dashboard) with Docker and service API integrations.项目地址: https://gitcode.com/GitHub_Trending/ho/homepage
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考