diff --git a/docs/reference/spec-v02-observability-monitoring.md b/docs/reference/spec-v02-observability-monitoring.md index 03eb2cb4..afeaef13 100644 --- a/docs/reference/spec-v02-observability-monitoring.md +++ b/docs/reference/spec-v02-observability-monitoring.md @@ -26,6 +26,10 @@ hwlab-* service 所有 HWLAB `/metrics` endpoint 必须是内部指标入口,不参与公网 FRP 暴露。第一阶段使用独立 `metrics` named Service port 暴露 sidecar 指标;公网 FRP 仍只转发业务端口,所以 `19666/19667` 上的 `/metrics` 必须继续是负向结果。`hwlab-cloud-web` 和 `hwlab-edge-proxy` 不得把 `/metrics` 代理给普通浏览器或公网 API 调用方。Prometheus 抓取路径只允许从集群内 Service 访问。 +第一阶段已采用 metrics sidecar 方式接入。sidecar 读取服务名、namespace、gitops target、业务 health URL 和超时配置,对外只监听集群内 `metrics` named port。业务容器不需要直接承担 Prometheus 文本生成逻辑,但每个被接入服务必须提供稳定的内部 health endpoint,让 sidecar 生成 `hwlab_service_health_probe_success`。 + +sidecar 脚本通过 ConfigMap 挂载时,Deployment template 必须包含脚本内容 hash annotation。任何 metrics sidecar 脚本、目标 URL、端口或模板化配置变化都应触发 pod rollout;不能只更新 ConfigMap 后等待 kubelet 投影刷新,也不能把“Prometheus 能 scrape 到旧 sidecar”当成新逻辑已生效。 + ## API 接口说明 ### `/metrics` @@ -65,6 +69,13 @@ hwlab-* service 这些高基数或敏感数据继续留在 trace/result/inspect、日志尾部或 issue 验收证据中,不进入 Prometheus label。 +sidecar 必须至少暴露以下基础指标: + +- `hwlab_service_up`:sidecar 进程自身可服务时为 `1`。 +- `hwlab_service_health_probe_success`:sidecar 对业务 health endpoint 的最近一次探测成功时为 `1`,失败时为 `0`。 + +`hwlab_service_up=1` 只能证明 metrics sidecar 存活,不能证明业务容器健康;关闭监控接入 issue 时必须同时验证 `hwlab_service_health_probe_success=1`。 + ### `ServiceMonitor` `deploy/gitops/g14/runtime-v02` 应生成或包含 v0.2 业务服务的 `ServiceMonitor`。Selector 必须同时约束: @@ -95,6 +106,14 @@ HWLAB v0.2 可声明 `PrometheusRule`,但规则只表达当前 v0.2 目标行 - Prometheus 读取 HWLAB 指标不等于拥有 HWLAB Secret、DB URL、provider key 或用户 API key 读取权限。 - `hwlab-v02` 业务 namespace 不持有 Prometheus Operator 集群管理凭证,也不部署共享 Prometheus control-plane。 +应用接入实现不得引入以下回归: + +- 让 GitOps artifact replacement 重写 `hwlab-metrics` sidecar image。 +- 让 mounted ConfigMap 脚本变化缺少 Deployment template hash,导致 pod 不滚动。 +- 用 Node `fetch` 或其他在目标运行面不稳定的全局 HTTP client 作为唯一 health probe 实现;probe client 应使用当前 runtime 中可稳定验证的 HTTP/HTTPS request 路径。 +- 只验证 `up{namespace="hwlab-v02"}`,不验证业务 health probe 指标。 +- 把 `/metrics` 透传到 `19666/19667` 公网入口。 + ## 测试规格 ## T1 @@ -113,12 +132,20 @@ HWLAB v0.2 可声明 `PrometheusRule`,但规则只表达当前 v0.2 目标行 阅读本文,然后用受控 CLI 或集群内查询测试以下内容:Prometheus 中 `up{namespace="hwlab-v02"}` 能看到已接入服务 target,基础延迟/错误率 PromQL 能返回结果,并确认公网 `http://74.48.78.17:19666/metrics` 和 `http://74.48.78.17:19667/metrics` 不暴露原始指标。 +## T5 + +阅读本文,然后用受控 CLI 或集群内查询测试以下内容:Prometheus 中 `hwlab_service_up{namespace="hwlab-v02"}` 和 `hwlab_service_health_probe_success{namespace="hwlab-v02"}` 的结果数量与已接入服务数量一致,且每个结果值均为 `1`。如果 `up=1` 但 `hwlab_service_health_probe_success=0`,应优先排查 sidecar 到业务 health endpoint 的协议、URL、超时和运行时 HTTP client,而不是判定 Prometheus 基础设施故障。 + +## T6 + +阅读本文,然后用 CLI 手动测试以下内容:检查已接入 pod 的容器状态,确认每个目标 pod 都包含 ready 的 `hwlab-metrics` sidecar 且 restartCount 没有异常增长。对 ConfigMap 承载的 sidecar 脚本或 render 模板做改动后,必须确认对应 Deployment 发生了新的 pod rollout。 + ## 规格的实现情况 | 规格项 | 状态 | 说明 | | --- | --- | --- | -| 应用侧监控接入边界 | 待实现 | 目标是 HWLAB 只负责 `/metrics`、ServiceMonitor/PrometheusRule 和 CLI 查询,不部署共享监控控制面。 | -| G14 共享监控控制面 | 待实现 | 由 UniDesk/G14 基础设施规格定义,默认位于 `devops-infra`。 | -| v0.2 服务 `/metrics` | 待实现 | 第一阶段优先 `hwlab-cloud-api`、`hwlab-cloud-web`、`hwlab-edge-proxy`、`hwlab-device-pod`、`hwlab-agent-skills`、`hwlab-deepseek-proxy`。 | -| ServiceMonitor / PrometheusRule | 待实现 | 需要进入 v0.2 GitOps desired state,但不得变成发布旧门禁。 | -| 受控查询与验收 | 待实现 | 需要通过 CLI/集群内查询证明 target discovered、query 可用和公网不暴露。 | +| 应用侧监控接入边界 | 已实现 | HWLAB 只负责 metrics sidecar、ServiceMonitor/PrometheusRule 和受控查询;共享 Prometheus control-plane 不在 `hwlab-v02`。 | +| G14 共享监控控制面 | 已实现 | 由 UniDesk/G14 基础设施规格定义,默认位于 `devops-infra`。 | +| v0.2 服务 `/metrics` | 已实现 | 第一阶段接入 `hwlab-cloud-api`、`hwlab-cloud-web`、`hwlab-edge-proxy`、`hwlab-device-pod`、`hwlab-agent-skills`、`hwlab-deepseek-proxy`。 | +| ServiceMonitor / PrometheusRule | 已实现 | 已进入 v0.2 GitOps desired state;规则用于观测,不作为发布旧门禁。 | +| 受控查询与验收 | 已实现 | 通过 UniDesk `hwlab g14 observability status|query` 和集群内边界检查验证 target discovered、health probe 可用和公网不暴露。 |