dodjdnh opened a new pull request, #1591:
URL: https://github.com/apache/dubbo-admin/pull/1591
## 概述
适配 Dubbo Admin 现有共享 Metric Dashboard,使其可以使用 dubbo-go 已有的 RPC 指标,同时为不携带原生 IP
标签的 Java RPC 序列保留查询路径。改动包括将 consumer 指标纳入服务和方法发现、使用裸 IP 选择实例、修正 processing
指标名,以及移除针对测试样例方法的应用 Histogram 过滤条件。
这是 Admin 侧的指标兼容工作,不是新增 SDK exporter、指标采集链路或 Trace → Metric 功能。
## 动机
现有 Instance Metric 流程会构造推测的 `IP:QoSPort`,并据此过滤 Prometheus 抓取实例。当 exporter
使用不同端口,或 Java 和 Go 序列暴露不同标签时,这种方式无法可靠识别应用实例。仅使用 provider 指标发现变量,也会遗漏
consumer-only 的 RPC 接口和方法。
共享 Dashboard 应使用所选应用的实际指标身份和可用标签,而不是假定某一种 SDK 或 exporter 端点。
## 改动内容
### 1. 从 RPC 两侧发现服务和方法
Service Dashboard 的接口和方法变量使用 provider 或 consumer 请求序列,并同时更新变量定义和查询对象:
```promql
label_values({__name__=~"dubbo_(provider|consumer)_requests_total"},interface)
label_values({__name__=~"dubbo_(provider|consumer)_requests_total",interface="$service"},method)
```
这使 consumer-only 接口和方法可以被选择;不会为 consumer-only 应用凭空生成 provider 数据。
### 2. 按原生 IP 隔离 Instance Metric
- 将所选实例的应用名和裸 IP 传给 Grafana,不拼接配置中的或默认的 QoS 端口。
- 继续使用现有 Admin 资源管理器查找资源;Metric 实现及其测试不依赖 Instance Trace 辅助函数或 API。
- 对携带 `ip` 的指标,直接选择请求的 IP。
- 对没有 `ip` 的指标,通过 `dubbo_application_info_total` 将所选应用/IP 关联到抓取目标,再按
`(application_name, instance)` 匹配 RPC 序列。
- 将该选择模式应用到 Instance Dashboard 的现有指标查询,并在实例变量中使用原生 `ip` 值。
请求指标查询选择器示例:
```promql
dubbo_provider_requests_total{application_name="$application",ip="$instance"}
or (
dubbo_provider_requests_total{application_name="$application"}
and on(application_name,instance)
dubbo_application_info_total{application_name="$application",ip="$instance"}
)
```
Prometheus `instance` 是内部关联键,不是产品实例身份。如果两条路径选中同一条序列,`or` 只保留一次。元数据路径要求
application-info 和 RPC 序列具有一致的应用及抓取标签。
### 3. 修正现有 Dashboard 查询
- 在 Application、Instance 和 Service Dashboard 中查询
`dubbo_provider_requests_processing_total` 和
`dubbo_consumer_requests_processing_total`。这些序列表示处理中请求数/并发量;名称后缀不会使其变成请求速率查询。
- 从 Application 现有 provider histogram 查询中移除 `method="getItem"`,避免将查询限制在示例方法。
- 不新增 Histogram 能力/状态面板、新的 bucket 指标族或 Go 专用 Histogram 实现。
### 4. 补充针对性测试和部署说明
- 新增独立的 Metric 测试文件,覆盖 QoS 端口为 `0` 和 `22222` 时的裸 IP 变量与
URL、已有查询参数保留、配置缺失、实例缺失及查找失败。
- 说明原生实例身份、两条查询路径、Go Metrics 启用与 exporter 配置,以及匹配的 Prometheus 抓取发现要求。
- 解释现有 QoS ServiceMonitor 为什么不会自动发现位于 `9090/metrics` 的 Go exporter。
- 区分可选指标族、兼容目标、历史运行证据与完整产品验收。
## 验证
当前独立提交序列的单元测试、静态检查及本地可复现的上游 CI 检查均为 PASS。运行时验证、Go 全链路浏览器验收及 Java
回归由提交者人工验收通过,未使用浏览器自动化。本地检查不替代提交 PR 后的 GitHub Actions 结果。
| 范围 | 检查 | 结果 |
| --- | --- | --- |
| 单元测试 | 有/无 QoS 端口时的裸 IP 变量与 URL;配置和查找错误处理 | PASS;在独立提交序列上通过 |
| 单元测试 / 包回归 | 在五个独立提交检查点分别运行 `go test ./pkg/console/service
./pkg/console/handler -count=1` | PASS;五个检查点全部通过 |
| 本地 CI / 许可证 | 使用 License Eye 和仓库 `.licenserc.yaml` 检查许可证头 | PASS |
| 本地 CI / 前端 | Node 18.20.8、Yarn 1.22.22;按锁定依赖安装后执行 `yarn build` | PASS |
| 本地 CI / 格式 | Go 1.24.11;按 Git 中的 LF 源码检查,前端构建与 `go fmt ./...` 后无源码差异 |
PASS |
| 本地 CI / 全量测试 | Ubuntu 24.04、Go 1.24.11、GCC 13.3、CGO 开启;执行上游 `make test` |
PASS;退出码 0,生成 atomic 覆盖率文件,全仓语句覆盖率 13.9% |
| 本地 CI / RISC-V | `GOOS=linux GOARCH=riscv64 CGO_ENABLED=0 go build ./...`
| PASS;交叉编译检查,未执行 RISC-V 运行时测试 |
| 静态检查 | YAML 解析及内嵌 Dashboard JSON 解析 | PASS |
| 静态检查 | Consumer 服务/方法变量、processing 指标名、应用 Histogram 方法过滤条件 | PASS |
| 静态检查 | 全部 84 条使用 `$instance` 的 Instance 查询表达式均包含直接 IP / 元数据选择模式;实例变量使用
`ip` | PASS;仅为结构检查,未执行 PromQL |
| 静态检查 / 范围 | 独立提交序列仅包含后端 Metric 改动、Metric 测试、Dashboard 定义和兼容性文档 |
PASS;不需要未合并的 Trace / Log 改动 |
| 静态检查 / 回归 | 解析后的非 Application / Instance / Service Metric Dashboard 与
upstream 一致;upstream 原有可观测性测试文件未修改 | PASS |
| 静态检查 | `git diff --check b9ee1b7 HEAD` | PASS |
| 运行时 | 部署当前独立分支,执行真实 Java / Go 查询、直接 IP 和元数据路径、consumer-only 发现,以及双实例隔离/去重
| PASS;提交者人工验收通过 |
| 浏览器 | 已注册 Go 应用 → Admin Application / Instance / Service 页面 → Grafana;真实
RPC 数据及 A/B 隔离 | PASS;提交者人工验收通过 |
| 运行时回归 | 部署当前独立分支后的现有 Java Metric 页面 | PASS;提交者人工验收通过 |
`docs/observability-metric-compatibility.md` 中记录的早期运行时检查使用 Java 3.2.16、Go
3.3.2、Grafana 12.1.0 和 Prometheus 数据,观察到了两个 Java 实例的元数据路径,以及 Go
provider/consumer 数据的直接 IP 查询。这些是历史记录,不自动替代当前独立分支的验收;上表中当前分支的运行时和浏览器 PASS
来自提交者另行确认的人工验收结果。
本地未执行 Codecov 上传或发布流程;覆盖率文件已生成并保留。前端构建和 RISC-V 交叉编译在 Windows 临时副本中执行,全量单测在
WSL Ubuntu 中执行,均针对同一 HEAD `cdcb6c6`,未修改产品源码。
可重复执行的后端检查:
```sh
go test ./pkg/console/service -run '^TestInstanceMetricDashboard' -count=1
go test ./pkg/console/service ./pkg/console/handler -count=1
make test
git diff --check b9ee1b7 HEAD
```
## 评审重点
1. 应用名加裸 IP 是否为正确的 Instance Metric 契约,以及后端参数修改与 Dashboard 过滤条件是否需要配套部署。
2. RPC 序列缺少 `ip` 时,元数据关联能否正确隔离抓取目标,尤其是在多实例和一致重标签配置下。应检查完整指标标签集合,而不是假定
`IP:QoSPort`。
3. 合并直接 IP 和元数据路径后,是否保持隔离且不重复返回同一条序列;结构验证和提交者的运行时验收均已通过,评审仍应关注该查询语义。
4. Consumer-only 变量发现和 processing 指标名是否匹配 Java / Go 实际导出的序列,不承诺 SDK 未导出的指标族。
5. 文档是否明确区分查询兼容、exporter 启用、抓取配置、可选能力与完整产品验收。
## 兼容性与影响
- Instance Metric 变量从 `IP:QoSPort` 改为裸 IP。后端与共享 Instance Dashboard
应配套部署;假定该参数为抓取地址的自定义 Dashboard 需要适配参数契约。
- Application 和 Service 身份变量保持原有含义。复用现有请求和耗时指标族;本 PR 不统一其跨语言语义或单位。
- 运行时能力仍取决于应用实际导出且被 Prometheus 抓取的指标。删除方法过滤条件不会让 Go 自动导出 provider histogram
bucket;不承诺 Go 全面具备 Java 专有指标族。
- 文档中的兼容目标为 Java 3.2.0+ 和 Go 3.1.1+。源码检查及部分 Java 3.2.16 / Go 3.3.2
运行时验证,不等于所有版本的端到端保证。
- 必须启用并暴露 Go exporter,配置匹配的抓取目标。本 PR 不修改 ServiceMonitor、抓取配置、数据源
provisioning 或自动部署流程。
- 独立分支不修改 Trace / Log API、Collector 链路、Jaeger 数据源设置或现有 Trace
Dashboard。不能仅因这些文件未改变就断言运行时界面无回归。
- 更新已运行的 Grafana 仍需执行常规 Dashboard provisioning 重载/部署流程。
受影响范围,沿用仓库 PR 模板中的分类名称:
- [x] Docs
- [x] Installation
- [x] User Experience
- [ ] Dubboctl
- [x] Console
- [ ] Core Component
此处 Installation 的影响仅限于部署更新后的 Dashboard 和说明抓取前置条件;没有新增自动采集基础设施。
## 范围
### 包含
- 现有共享 Java / Go Metric 查询兼容、consumer 变量发现和实例选择。
- Processing / Histogram 查询修正、针对性后端测试及接入文档。
### 不包含
- SDK 或 exporter 改动、新增指标、Go 错误分类或 Histogram 支持,以及跨语言耗时/错误语义统一。
- 新增 Histogram 能力面板、全面重设计 Dashboard,或保证 Go 支持 Java 专有指标族。
- 自动注册/部署 Go 应用、配置 Prometheus 抓取或修改运行环境。
- 日志可观测性、Trace → Log、Trace → Metric、OTel 转换、Tempo 或 spanmetrics。
## 关联 Issue
Fixes #1590
Related to #1524。本 PR 仅关闭专项 Metric 兼容性 Issue,不关闭完整的 OSPP 总议题,也不关闭独立的
Instance Trace、Log 或 Trace → Metric Issue。
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]