Bug Report
Please answer these questions before submitting your issue. Thanks!
What did you do?
What did you expect to see?
What did you see instead?
When deploying a standalone TiDB Dashboard with TiUP to a cluster that has multiple PD nodes, TiUP generates a --pd argument containing all PD URLs:
--pd="http://127.0.0.1:23791,http://127.0.0.1:23792,http://127.0.0.1:23793"
However, TiDB Dashboard treats the whole value as one PD endpoint. It passes the complete comma-separated string to the etcd client instead of splitting it into multiple endpoints.
As a result, Dashboard cannot connect to PD.
Dashboard logs show:
dial tcp: address 127.0.0.1:23791,http:: too many colons in address
It also repeatedly logs:
Failed to load dynamic config from etcd
error="context deadline exceeded"
Dashboard is shown as Up by tiup cluster display because its HTTP port is listening, but PD-dependent APIs fail.
What version of TiDB Dashboard are you using (./tidb-dashboard --version)?
[2026/08/19 14:24:37.760 +08:00] [INFO] [version.go:33] ["TiDB Dashboard started"] [internal-version=v8.5.1] [standalone=Yes] [pd-version=N/A] [build-time="2025-01-10 06:50:53"] [build-git-hash=5d1f7280d5d8a7f97b5791b31c7ee300ff31229b]
**Root Cause
TiUP collects all PD client URLs and joins them with commas before generating the Dashboard startup script:
PD: strings.Join(pds, ","),
Dashboard accepts --pd as a single string and creates the etcd client with:
Endpoints: []string{config.PDEndPoint},
Dashboard does not split the comma-separated value into separate endpoints.
Bug Report
Please answer these questions before submitting your issue. Thanks!
What did you do?
What did you expect to see?
What did you see instead?
When deploying a standalone TiDB Dashboard with TiUP to a cluster that has multiple PD nodes, TiUP generates a
--pdargument containing all PD URLs:--pd="http://127.0.0.1:23791,http://127.0.0.1:23792,http://127.0.0.1:23793"However, TiDB Dashboard treats the whole value as one PD endpoint. It passes the complete comma-separated string to the etcd client instead of splitting it into multiple endpoints.
As a result, Dashboard cannot connect to PD.
Dashboard logs show:
It also repeatedly logs:
Dashboard is shown as Up by tiup cluster display because its HTTP port is listening, but PD-dependent APIs fail.
What version of TiDB Dashboard are you using (
./tidb-dashboard --version)?[2026/08/19 14:24:37.760 +08:00] [INFO] [version.go:33] ["TiDB Dashboard started"] [internal-version=v8.5.1] [standalone=Yes] [pd-version=N/A] [build-time="2025-01-10 06:50:53"] [build-git-hash=5d1f7280d5d8a7f97b5791b31c7ee300ff31229b]
**Root Cause
TiUP collects all PD client URLs and joins them with commas before generating the Dashboard startup script:
Dashboard accepts --pd as a single string and creates the etcd client with:
Dashboard does not split the comma-separated value into separate endpoints.