ARGUS 系统级端到端测试Sys E2E

本目录包含将 log、metric 与 agent 三线验证合并后的系统级端到端测试。依赖 bind/master/es/kibana/metric(ftp+prometheus+grafana+alertmanager)/web-proxy/web-frontend + 两个“计算节点”(每个节点容器内同时运行 Fluent Bit 与 argus-agent


一、如何运行

  • 前置条件

    • 已构建镜像:

      • 基座:argus-elasticsearch:latestargus-kibana:latestargus-bind9:latestargus-master:latest
      • 节点:argus-sys-node:latest
      • 指标:argus-metric-ftp:latestargus-metric-prometheus:latestargus-metric-grafana:latestargus-alertmanager:latest
      • 前端与代理:argus-web-frontend:latestargus-web-proxy:latest
      • 可用根目录命令构建:./build/build_images.sh [--intranet]
    • 主机具备 Docker 与 Docker Compose。

    • UID/GID 配置(用于容器内文件属主与挂载卷写入权限)

      • 默认值:UID=2133GID=2015

      • 方式 A推荐在仓库根目录创建 configs/build_user.local.conf

        UID=<你的宿主用户UID> GID=<你的宿主用户GID>

        例如:

        UID=1000 GID=1000

      • 方式 B通过环境变量覆盖优先级最高

        export ARGUS_BUILD_UID=1000 export ARGUS_BUILD_GID=1000

      • 说明:scripts/common/build_user.sh 会按顺序读取 configs/build_user.local.confconfigs/build_user.conf → 环境变量,最终值会用于镜像构建参数与测试脚本,并在 01_bootstrap.sh 中对 src/sys/tests/private/argus/* 进行 chown 以匹配容器内运行用户。

  • 一键执行

    • cd src/sys/tests
    • ./scripts/00_e2e_test.shCPU-only./scripts/00_e2e_test.sh --enable-gpu(启用 GPU 流程)
    • 可选:--no-clean 跳过清理,便于失败后现场排查
  • 分步执行(推荐用于排查)

    • ./scripts/01_bootstrap.sh 生成目录/拷贝 update-dns.sh/构建 agent 二进制/写 .env
    • ./scripts/02_up.sh 启动 Compose 栈(工程名 argus-sys
    • ./scripts/03_wait_ready.sh 等待 ES/Kibana/Master/FluentBit/Bind/Prometheus/Grafana/Alertmanager/WebProxy 就绪Kibana 必须 200 且 overall.level=availableWebProxy 8084/8085 要有 CORS 头)
    • ./scripts/04_verify_dns_routing.sh 校验 bind 解析与节点内域名解析
    • ./scripts/05_agent_register.sh 获取两个节点的 node_id 与初始 IP检查本地 node.json
    • ./scripts/06_write_health_and_assert.sh 写健康文件并断言 nodes.json 仅包含 2 个在线节点
    • ./scripts/07_logs_send_and_assert.sh 向两个节点写日志,断言 ES train-*/infer-* 计数增长
    • ./scripts/08_restart_agent_reregister.sh node-b 改为固定 IP 172.31.0.200,验证保持同一节点 ID 且 IP/时间戳更新
    • ./scripts/10_metric_publish.sh 发布 metric 客户端包到 FTP
    • ./scripts/11_metric_node_install.sh 在 CPU 节点安装并验证端点
    • ./scripts/12_metric_gpu_install.sh 在 GPU 节点安装并等待 9100/9400 就绪(仅启用 GPU 时)
    • ./scripts/13_metric_verify.sh 对 master/Prometheus/数据面/Grafana 做综合校验(含 GPU 时校验 dcgm 指标)
    • ./scripts/15_alert_verify.sh 对alertmanager进行校验
    • ./scripts/16_web_verify.sh 对web页面进行校验综合校验。
    • ./scripts/14_metric_cleanup.sh 清理 FTP 产物
    • ./scripts/09_down.sh 回收容器、网络并清理 private*/tmp/
  • 重置环境

    • 任何阶段失败可执行 ./scripts/09_down.sh 后重跑 01→…

二、测试部署架构docker-compose

  • 网络

    • 自定义 bridgesysnetCompose 工程名为 argus-sys 时实际为 argus-sys_sysnet),子网 172.31.0.0/16
    • 固定地址bind=172.31.0.2master=172.31.0.10
  • 服务与端口(宿主机映射端口由 01_bootstrap.sh 自动分配并写入 .env

    • 关键变量:MASTER_PORTES_HTTP_PORTKIBANA_PORTNODE_A_PORTNODE_B_PORTPROMETHEUS_PORTGRAFANA_PORTALERTMANAGER_PORTWEB_PROXY_PORT_8080..8085FTP_PORTFTP_DATA_PORTFTP_PASSIVE_HOST_RANGE
    • bindargus-bind9:latest):监听 53/tcp+udp负责同步 *.argus.com 记录
    • masterargus-master:latest):对外 ${MASTER_PORT}→3000API http://localhost:${MASTER_PORT}
    • esargus-elasticsearch:latest${ES_HTTP_PORT}→9200;单节点,无安全
    • kibanaargus-kibana:latest${KIBANA_PORT}→5601
    • node-aargus-sys-node:latest):同时运行 Fluent Bit + argus-agenthostname=dev-yyrshare-nbnyx10-cp2f-pod-0${NODE_A_PORT}→2020
    • node-bargus-sys-node:latest):同时运行 Fluent Bit + argus-agenthostname=dev-yyrshare-uuuu10-ep2f-pod-0${NODE_B_PORT}→2020
    • ftpargus-metric-ftp:latest${FTP_PORT}→21/${FTP_DATA_PORT}→20/${FTP_PASSIVE_HOST_RANGE} 被动端口
    • prometheusargus-metric-prometheus:latest${PROMETHEUS_PORT}→9090
    • grafanaargus-metric-grafana:latest${GRAFANA_PORT}→3000
    • alertmanagerargus-alertmanager:latest${ALERTMANAGER_PORT}→9093
    • web-frontendargus-web-frontend:latest):内部访问页面,使用 web-proxy 暴露的对外端口渲染超链
    • web-proxyargus-web-proxy:latest):多端口转发 8080..8085首页、Grafana、Prometheus、Kibana、Alertmanager、Master API
  • 卷与目录

    • 核心服务bind/master/es/kibana共享宿主 ./private 挂载到容器 /private
    • 两个节点使用独立数据卷,互不与核心服务混用:
      • node-a./private-nodea/argus/agent/<HOST> → /private/argus/agent/<HOST>
      • node-b./private-nodeb/argus/agent/<HOST> → /private/argus/agent/<HOST>
    • 节点容器的 Fluent Bit/agent 资产以只读方式挂载到 /assets//usr/local/bin/argus-agent
  • DNS 配置

    • 节点容器通过 compose 配置 dns: [172.31.0.2] 指向 bind不挂载 /etc/resolv.conf,也不依赖 update-dns.sh
    • master/es/kibana 仍共享 ./privatemaster 启动会写 /private/argus/etc/master.argus.com 供 bind 同步 A 记录
  • 节点入口

    • scripts/node_entrypoint.sh
      • 离线优先:将 /assets/fluent-bit/packagesetc 拷贝到 /private,执行 /private/start-fluent-bit.sh 安装/拉起 Fluent Bit监听 2020
      • 以运行用户(映射 UID/GID前台启动 argus-agent
    • 节点环境变量:MASTER_ENDPOINT=http://master.argus.com:3000REPORT_INTERVAL_SECONDS=2ES_HOST=esES_PORT=9200CLUSTER=localRACK=dev

三、脚本与验证目标

  • 01_bootstrap.sh

    • 目的:准备目录结构、修正 ES/Kibana 数据目录属主、分发 update-dns.sh(仅核心服务使用)、构建 agent 二进制、写 .env
    • 失败排查:若 ES 无法写入数据,重跑本步骤确保目录属主为指定 UID/GID
  • 02_up.sh

    • 目的:以工程名 argus-sys 启动全栈;自动清理旧栈/网络
  • 03_wait_ready.sh

    • 目的:等待关键端口/健康接口可用
    • 判定:
      • ES /_cluster/health?wait_for_status=yellow 成功
      • Kibana GET /api/status 返回 200 且 overall.level=available
      • Master /readyz 成功
      • Fluent Bit 指标接口 :2020/:2021 可访问
      • bind named-checkconf 通过
      • Prometheus /-/ready 可用
      • Grafana GET /api/health 返回 200 且 database=ok
      • Alertmanager GET /api/v2/status 成功
      • WebProxy8080 首页 2008083 首页 200/3028084/8085 对来自 8080 的请求需返回 Access-Control-Allow-OriginCORS
  • 04_verify_dns_routing.sh

    • 目的:验证从 bind → 节点容器的解析链路
    • 判定:
      • private/argus/etc/master.argus.com 存在且为 master IP
      • 在 node-a/node-b 内 getent hosts master.argus.com 成功解析到 master IP
      • 在 metric CPU/GPU 节点内可解析 master.argus.comprom.metric.argus.com
  • 05_agent_register.sh

    • 目的:确认两个节点注册到 master 并持久化 node.json
    • 输出:tmp/node_id_a|btmp/initial_ip_a|btmp/detail_*.json
  • 06_write_health_and_assert.sh

    • 目的:模拟节点健康上报并在 master 侧可见;nodes.json 仅保留在线节点
    • 操作:写 log-fluentbit.jsonmetric-node-exporter.json 至两个节点的 health 目录
  • 07_logs_send_and_assert.sh

    • 目的:通过 Fluent Bit 将两类日志注入 ES计数应较基线增长且达到阈值≥4
    • 同时校验 ES 健康 green|yellow
  • 08_restart_agent_reregister.sh

    • 目的:验证节点重启与 IP 变更时保持相同 id 并更新 meta_data.iplast_updated
    • 操作:以固定 IP 172.29.0.200 重建 nodeb 后轮询校验
  • 09_down.sh

    • 目的:栈销毁与环境清理;必要时使用临时容器修正属主再删除 private* 目录
  • 15_alert_verify.sh

    • 目的验证alertmanager的可用性、Prometheus到alertmanager的连通性。
    • 操作在Prometheus中增加一个恒为真的告警规则查看alertmanager是否收到该告警
  • 16_web_verify.sh

    • 目的验证web页面是否可用。
    • 使用playwright分别验证各个模块的页面是否可用以及符合预期。

常见问题与排查

  • Kibana 长时间 503机器较慢时初始化较久脚本最长等待 ~15 分钟;先确认 ES 已就绪。
  • Fluent Bit 指标未就绪:检查节点容器日志与环境变量 CLUSTER/RACK 是否设置;确认入口脚本已经复制资产到 /private
  • ES 无法启动:多为宿主目录权限问题;重跑 01_bootstrap.sh,或手动 chown -R <UID:GID> src/sys/tests/private/argus/log/*

注意事项20251029 更新)

  • 宿主 inotify 限制导致 03 卡住Fluent Bit in_tail EMFILE

    • 现象:03_wait_ready.sh 一直等待 :2020/:2021 /api/v2/metrics;节点日志出现 tail_fs_inotify.c errno=24 Too many open filesFluent Bit 启动失败。
    • 根因:宿主 fs.inotify.max_user_instances 上限过低(常见默认 128被其他进程占满并非容器内 ulimit -n 过低。
    • 处理:在宿主执行(临时):
      • sudo sysctl -w fs.inotify.max_user_instances=1024 fs.inotify.max_user_watches=1048576
      • 建议永久:写入 /etc/sysctl.d/99-argus-inotify.confsudo sysctl --system
    • 提示:节点入口里对 sysctl 的写操作不影响宿主;需在宿主调整。
  • Metric 安装制品包含 Git LFS 指针导致 nodeexporter 启动失败

    • 现象:第 11 步在线安装后,日志显示 Node Exporter 服务启动失败;容器内 /usr/local/bin/node-exporter 头部是文本:version https://git-lfs.github.com/spec/v1
    • 根因:发布到 FTP 的安装包在打包前未执行 git lfs fetch/checkout,将指针文件打入制品。
    • 处理:在仓库根目录执行 git lfs fetch --all && git lfs checkout 后,重跑 src/metric/tests/scripts/02_publish_artifact.sh 再重试 11_metric_node_install.sh
    • 防呆:已在 all-in-one-full/scripts/package_artifact.sh 与组件 plugins/*/package.sh 增加 LFS 指针校验,发现即失败并提示修复。

建议:

  • 运行前检查宿主 inotify 值≥1024/≥1048576与宿主端口占用8080..8085、9200/5601/9090/9093/2020/2021/32300 等)。
  • 如需排查失败,使用 --no-clean 保留现场,配合 docker logscurltmp/*.json 进行定位。

如需更严格的断言(例如 Kibana 载入具体插件、ES 文档字段校验),可在 07_*.sh 中追加查询与校验逻辑。


可选GPU 流程说明

  • 前置条件:宿主安装 NVIDIA 驱动与 nvidia-container-toolkitnvidia-smi 在宿主可用。
  • 启用方式:
    • 一键:./scripts/00_e2e_test.sh --enable-gpu
    • 分步:设置 ARGUS_SYS_ENABLE_GPU=true 后执行 01_bootstrap.sh02_up.sh;或直接在 .env 中将 ENABLE_GPU=true 后单独运行 02_up.sh
  • 01_bootstrap.sh 会写入:
    • METRIC_TEST_HOSTNAME_GPU=test-metric-gpu-node-001
    • METRIC_TEST_INSTANCE_GPU=172.31.0.51:9100
    • METRIC_TEST_DCGM_GPU=172.31.0.51:9400
  • 验证点:04_verify_dns_routing.sh 增加对 metric 节点的域名解析;12_metric_gpu_install.sh 等待 9100/940013_metric_verify_* 校验 dcgm 指标与 Grafana 面板。