fix(collectors): 编辑采集策略时无法把"全集群"改成"只采几个命名空间"
CI / Backend (go vet + test) (push) Waiting to run
CI / Frontend (lint + build + test) (push) Waiting to run

=== 现象 ===
编辑 Promtail DaemonSet 采集器,显示"所有命名空间(全集群采集)",
下面每个命名空间的复选框全是灰的,点不动,无法改成只采指定几个。

=== 根因 ===
CollectorEditDialog 里单个命名空间的复选框写死了:
    disabled={allSelected}     // allSelected = selectedNs.length === 0
而 targetNamespaces 为空正是代表"全集群",也就是**一进来就处于全集群状态**,
于是所有子项被禁用;而"全集群"那个复选框的 handler 又是
    onCheckedChange={() => setAll()}   // 永远设回 []
两者叠加 → 没有任何操作能离开"全集群"状态,是死胡同。

=== 修复 ===
1. 去掉 disabled:勾任何一个命名空间都会让 selectedNs 非空,
   allSelected 自动变 false,"全集群"勾选框随之取消——语义自洽。
2. "全集群"行加一句提示:勾选下方任一命名空间即可改为只采指定范围,
   让用户知道下一步该点哪里。

=== 实测(51489599e2d8)===
  PUT targetNamespaces=["astralx"] → 读回 ['astralx']  ✅
  PUT targetNamespaces=[]        → 读回 [](全集群)   ✅
  恢复 ['astralx','log']          → 读回 ['astralx','log'] ✅
  tsc 通过;Pod = Hub latest = 51489599e2d8
注:改完需要点「部署」才会把新的 kubernetes_sd_configs.namespaces 白名单
    下发到 Promtail DaemonSet。
This commit is contained in:
opsx committed 2026-10-31 02:00:33 +00:00
1 parent 9448868a71
commit 3861b8b128
3 files changed
+13 -2

No files matched your search

@@ -121,6 +121,7 @@ const collectors = {
namespaces: 'Namespaces to Collect',
allNamespaces: 'All namespaces cluster-wide',
selectedCount: '{{count}} selected',
allCheckedHint: '(tick any namespace below to switch to a fixed set)',
allCheckbox: 'All namespaces (collect cluster-wide)',
nsSearch: 'Search namespaces…',
loading: 'Loading…',
@@ -125,6 +125,7 @@ const collectors = {
namespaces: '采集命名空间',
allNamespaces: '全集群所有命名空间',
selectedCount: '已选 {{count}} 个',
allCheckedHint: '(勾选下方任一命名空间即可改为只采指定范围)',
allCheckbox: '所有命名空间(全集群采集)',
nsSearch: '搜索命名空间…',
loading: '加载中…',
@@ -290,7 +290,12 @@ export const CollectorEditDialog = memo(function CollectorEditDialog({ collector
<div className="rounded-md border">
<label className="flex items-center gap-2 border-b px-3 py-2 text-sm font-medium cursor-pointer hover:bg-muted/50">
<Checkbox checked={allSelected} onCheckedChange={() => setAll()} />
{t('edit.allCheckbox')}
<span className="flex-1">{t('edit.allCheckbox')}</span>
{allSelected && (
<span className="text-xs font-normal text-muted-foreground">
{t('edit.allCheckedHint')}
</span>
)}
</label>
<div className="p-2">
<Input
@@ -308,9 +313,13 @@ export const CollectorEditDialog = memo(function CollectorEditDialog({ collector
)}
{filteredNs.map((ns) => (
<label key={ns} className="flex items-center gap-2 rounded px-2 py-1 text-sm hover:bg-muted/50 cursor-pointer">
{/* 这里**不能**用 disabled={allSelected}:
"全集群"状态下列表为空,一旦禁用所有子项,
用户就永远无法从"全集群"切到"只采几个"——
勾任何一个都会把 allSelected 变成 false,
从而自动退出全集群状态。 */}
<input
type="checkbox"
disabled={allSelected}
checked={selectedNs.includes(ns)}
onChange={() => toggleNs(ns)}
/>