用户指出的三个问题,逐条核实后的结论: 1) 「采集日志路径」对 DaemonSet 确实是多余的 —— 确认后端模板里写死了 `replacement: /var/log/pods/*$1/*.log`(按 pod UID 精确匹配容器标准输出), 表单里填的 logPath 对 DaemonSet 完全不参与渲染。 → 选择 DaemonSet 时隐藏该字段,提交时强制置空。 2) 「可以指定采集多个命名空间」—— 后端**早就支持**: models.Collector.TargetNamespaces + promtailNamespaceFilter(), 空数组 = 全集群。只是**前端新建弹框没暴露**(编辑弹框里有)。 → 新建弹框补上多选 chips(全集群 / 各命名空间可点选),并补齐前后端透传: dto.CreateCollectorRequest.TargetNamespaces controller → services.CreateCollectorRequest.TargetNamespaces models.Collector.TargetNamespaces 之前前端即使传了也会被 Go 静默丢弃(无该字段)。 3) 「命名空间」字段语义已在上一提交补了分类型说明: - DaemonSet:采集器自身部署在哪个命名空间(不影响采什么) - Sidecar:目标应用 Deployment 所在命名空间 新增 TestDaemonsetTargetNamespacesFilter: nil → 不生成 namespaces 白名单(全集群) ["astralx"] → 生成且包含 astralx ["astralx","default"] → 两个都在 === 实测(d45dfa18ecc5)=== 前端文案「只采集这些命名空间」「不选 = 采集整个集群…」均已进包 渲染测试 3 种输入全部符合预期 注:本次 docker push latest 遇到 Docker Hub 502,v0.1 成功而 latest 仍指向旧镜像, 导致首次滚动后 Pod 仍是旧代码;重推 latest + 强制重建 Pod 后确认 Pod digest = d45dfa18ecc5 —— 记录这个坑:push 失败必须核对三方 digest。
=== 一、两个线上 bug(172.19.16.8 真机取证)=== 1) host 标签是字面量 ${HOSTNAME} Promtail 不做环境变量展开(除非 -config.expand-env + systemd Environment), 实测 21,825 条日志的 host 全是 "${HOSTNAME}",无法按主机过滤。 → 安装时 `hostname -s` 探测真实主机名并渲染进配置,结果存 Collector.ResolvedHostname, 让「预览配置」与线上一致。 2) 系统日志时间戳解析失效 TencentOS 4 的 /var/log/messages 是 ISO8601(2026-07-17T15:38:24.923784+08:00), 旧正则按传统 syslog(Oct 28 18:11:06)写死 → timestamp 阶段匹配不上,用的是采集时间, 回填历史日志时间全错。 → 安装时探测目标机格式:iso8601 → RFC3339Nano;rfc3164 → Jan _2 15:04:05 + Local; 系统日志路径同时探测(Ubuntu 没有 messages,写死会一条都采不到)。 实测:写一条 10 分钟前的 ISO8601 探针行,Loki 里 loki_ts 与该行自身时间偏差 **0 秒**; 另写一条 2 小时前的被 Loki 以 entry too far behind 拒绝 —— 恰好反证时间戳是按事件时间 解析后推送的(旧实现会用采集时间,反而被接收)。 === 二、B 档:结构化多 Job 编辑器 === 后端 - models/scrape_job.go:ScrapeJob + ValidateScrapeJobs 校验 job 名格式、绝对路径、**敏感路径拦截**(/etc/shadow、/etc/sudoers、/root/.ssh、 id_rsa、*.pem…)、正则可编译、job/host/__path__ 保留标签名、数量上限。 - services/promtail_host_config.go:多 job 渲染;多路径展开成多个 static_configs; pipeline 顺序硬约束 cri → multiline → json → timestamp → drop → limit; encoding 写在 scrape_config 级(放进 static_configs 里 promtail 直接起不来)。 - services/host_profile.go:探测 distro / init / hostname / 时区 / 架构 / journald 与真实存在的系统日志路径。 - CollectorService:renderConfig 实时渲染、PreviewConfig(只渲染不落库)、 Update 支持 scrapeJobs 并校验、安装结果(hostname/syslog 格式/配置快照)落库。 - 新增 POST /api/v1/collectors/:id/preview → {config, warnings, hostname, syslogFormat}。 - installHost:配置先写 .new + `promtail -check-syntax` 通过才替换,重启后轮询 systemctl is-active,失败把 journalctl 尾部带回前端。 前端 - 采集项结构化编辑器:名称/路径/标签常驻,多行合并 / JSON / 自定义时间戳 / 命中丢弃 / 限流折叠在「高级」里;「预览 YAML」弹窗在保存前看到将要下发的配置。 - 本地即时校验 + 旧数据(只有 logPath)自动迁移成 app + system 两个采集项。 === 三、验证(host-verify-promtail @172.19.16.8)=== - 预览:host=pre-cex-ops-jenkins(无 ${HOSTNAME}),2 job / 3 条系统日志路径 / ISO8601 正则 / 多行 + drop + 限流 全部按填写渲染。 - 部署:promtail active、NRestarts=0、-check-syntax 通过,主机侧配置与预览逐行一致。 - Loki:新数据 host 全为 pre-cex-ops-jenkins;job=system 415 条/5min、job=app 40 条/5min。 - 负向 7/7 返回指名到字段的 400:/etc/shadow、/root/.ssh/id_rsa、相对路径、坏正则、 job 名带空格、保留标签名、空路径。 镜像:lghost/lokistack:latest + v0.1 = sha256:26172f51187d
前端: - src/srv/api → src/api,按域分文件夹(auth/cluster/host/storage/deployment/collector) - 新增 http.ts 引擎(http.get/post/put/delete),域模块改用语义化调用 - index.html 增加 favicon(匹配应用 logo 的 emerald + Activity 脉冲) 后端分层增强(保留包名): - 新增 repository/:从 models 拆出 JsonDB 持久化层(InitDB/GetDB/Shutdown/RequestSave) - 新增 dto/:从 controllers 抽出各域请求契约(带 binding 校验) - 新增 pkg/crypto、pkg/jwt:从 utils 拆出安全原语(外部 jwt 别名 jwtv5 避免冲突) - models 只留领域实体 + sanitizer;utils 只留 gin/应用相关(response/errors) v2 优化移植与缺陷修复: - 移植密钥分离/SSH TOFU/并发写安全/Loki 生产级配置/Docker 加固 - 修复 deployment.go 并发丢更新、Helm values 重复键、EncryptField 哨兵、loki-gateway 端点等审计缺陷 - 实现真正的优雅关停(main.go http.Server + signal + repository.Shutdown) - 修复登录契约:后端返回 accessToken,前端 auth.ts/Login.tsx 对齐 - 补 crypto/jwt/repository 单元测试(含并发写回归) 验证: go build/vet/test 全绿;npm run build 通过;登录→鉴权→优雅关停冒烟通过 Co-Authored-By: Claude <noreply@anthropic.com>