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:latest、argus-kibana:latest、argus-bind9:latest、argus-master:latest - 节点:
argus-sys-node:latest - 指标:
argus-metric-ftp:latest、argus-metric-prometheus:latest、argus-metric-grafana:latest、argus-alertmanager:latest - 前端与代理:
argus-web-frontend:latest、argus-web-proxy:latest - 可用根目录命令构建:
./build/build_images.sh [--intranet]
- 基座:
-
主机具备 Docker 与 Docker Compose。
-
UID/GID 配置(用于容器内文件属主与挂载卷写入权限)
-
默认值:
UID=2133、GID=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.conf→configs/build_user.conf→ 环境变量,最终值会用于镜像构建参数与测试脚本,并在01_bootstrap.sh中对src/sys/tests/private/argus/*进行chown以匹配容器内运行用户。
-
-
-
一键执行
cd src/sys/tests./scripts/00_e2e_test.sh(CPU-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/Fluent‑Bit/Bind/Prometheus/Grafana/Alertmanager/Web‑Proxy 就绪(Kibana 必须 200 且 overall.level=available;Web‑Proxy 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向两个节点写日志,断言 EStrain-*/infer-*计数增长./scripts/08_restart_agent_reregister.shnode-b改为固定 IP172.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)
-
网络
- 自定义 bridge:
sysnet(Compose 工程名为argus-sys时实际为argus-sys_sysnet),子网172.31.0.0/16 - 固定地址:bind=
172.31.0.2,master=172.31.0.10
- 自定义 bridge:
-
服务与端口(宿主机映射端口由
01_bootstrap.sh自动分配并写入.env)- 关键变量:
MASTER_PORT、ES_HTTP_PORT、KIBANA_PORT、NODE_A_PORT、NODE_B_PORT、PROMETHEUS_PORT、GRAFANA_PORT、ALERTMANAGER_PORT、WEB_PROXY_PORT_8080..8085、FTP_PORT、FTP_DATA_PORT、FTP_PASSIVE_HOST_RANGE bind(argus-bind9:latest):监听 53/tcp+udp;负责同步*.argus.com记录master(argus-master:latest):对外${MASTER_PORT}→3000;APIhttp://localhost:${MASTER_PORT}es(argus-elasticsearch:latest):${ES_HTTP_PORT}→9200;单节点,无安全kibana(argus-kibana:latest):${KIBANA_PORT}→5601node-a(argus-sys-node:latest):同时运行 Fluent Bit + argus-agent,hostname=dev-yyrshare-nbnyx10-cp2f-pod-0,${NODE_A_PORT}→2020node-b(argus-sys-node:latest):同时运行 Fluent Bit + argus-agent,hostname=dev-yyrshare-uuuu10-ep2f-pod-0,${NODE_B_PORT}→2020ftp(argus-metric-ftp:latest):${FTP_PORT}→21/${FTP_DATA_PORT}→20/${FTP_PASSIVE_HOST_RANGE}被动端口prometheus(argus-metric-prometheus:latest):${PROMETHEUS_PORT}→9090grafana(argus-metric-grafana:latest):${GRAFANA_PORT}→3000alertmanager(argus-alertmanager:latest):${ALERTMANAGER_PORT}→9093web-frontend(argus-web-frontend:latest):内部访问页面,使用web-proxy暴露的对外端口渲染超链web-proxy(argus-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>
- node-a:
- 节点容器的 Fluent Bit/agent 资产以只读方式挂载到
/assets//usr/local/bin/argus-agent
- 核心服务(bind/master/es/kibana)共享宿主
-
DNS 配置
- 节点容器通过 compose 配置
dns: [172.31.0.2]指向 bind,不挂载/etc/resolv.conf,也不依赖update-dns.sh - master/es/kibana 仍共享
./private,master 启动会写/private/argus/etc/master.argus.com供 bind 同步 A 记录
- 节点容器通过 compose 配置
-
节点入口
scripts/node_entrypoint.sh:- 离线优先:将
/assets/fluent-bit/packages与etc拷贝到/private,执行/private/start-fluent-bit.sh安装/拉起 Fluent Bit(监听 2020) - 以运行用户(映射 UID/GID)前台启动
argus-agent
- 离线优先:将
- 节点环境变量:
MASTER_ENDPOINT=http://master.argus.com:3000、REPORT_INTERVAL_SECONDS=2、ES_HOST=es、ES_PORT=9200、CLUSTER=local、RACK=dev
三、脚本与验证目标
-
01_bootstrap.sh- 目的:准备目录结构、修正 ES/Kibana 数据目录属主、分发
update-dns.sh(仅核心服务使用)、构建 agent 二进制、写.env - 失败排查:若 ES 无法写入数据,重跑本步骤确保目录属主为指定 UID/GID
- 目的:准备目录结构、修正 ES/Kibana 数据目录属主、分发
-
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成功 - Web‑Proxy:8080 首页 200;8083 首页 200/302;8084/8085 对来自 8080 的请求需返回
Access-Control-Allow-Origin(CORS)
- ES
-
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.com与prom.metric.argus.com
-
05_agent_register.sh- 目的:确认两个节点注册到 master 并持久化
node.json - 输出:
tmp/node_id_a|b、tmp/initial_ip_a|b、tmp/detail_*.json
- 目的:确认两个节点注册到 master 并持久化
-
06_write_health_and_assert.sh- 目的:模拟节点健康上报并在 master 侧可见;
nodes.json仅保留在线节点 - 操作:写
log-fluentbit.json、metric-node-exporter.json至两个节点的 health 目录
- 目的:模拟节点健康上报并在 master 侧可见;
-
07_logs_send_and_assert.sh- 目的:通过 Fluent Bit 将两类日志注入 ES,计数应较基线增长且达到阈值(≥4)
- 同时校验 ES 健康
green|yellow
-
08_restart_agent_reregister.sh- 目的:验证节点重启与 IP 变更时保持相同
id并更新meta_data.ip与last_updated - 操作:以固定 IP
172.29.0.200重建 node‑b 后轮询校验
- 目的:验证节点重启与 IP 变更时保持相同
-
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/*。
注意事项(2025‑10‑29 更新)
-
宿主 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 files,Fluent 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.conf后sudo sysctl --system
- 提示:节点入口里对 sysctl 的写操作不影响宿主;需在宿主调整。
- 现象:
-
Metric 安装制品包含 Git LFS 指针导致 node‑exporter 启动失败
- 现象:第 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 指针校验,发现即失败并提示修复。
- 现象:第 11 步在线安装后,日志显示
建议:
- 运行前检查宿主 inotify 值(≥1024/≥1048576)与宿主端口占用(8080..8085、9200/5601/9090/9093/2020/2021/32300 等)。
- 如需排查失败,使用
--no-clean保留现场,配合docker logs、curl与tmp/*.json进行定位。
如需更严格的断言(例如 Kibana 载入具体插件、ES 文档字段校验),可在 07_*.sh 中追加查询与校验逻辑。
可选:GPU 流程说明
- 前置条件:宿主安装 NVIDIA 驱动与
nvidia-container-toolkit,nvidia-smi在宿主可用。 - 启用方式:
- 一键:
./scripts/00_e2e_test.sh --enable-gpu - 分步:设置
ARGUS_SYS_ENABLE_GPU=true后执行01_bootstrap.sh、02_up.sh;或直接在.env中将ENABLE_GPU=true后单独运行02_up.sh。
- 一键:
01_bootstrap.sh会写入:METRIC_TEST_HOSTNAME_GPU=test-metric-gpu-node-001METRIC_TEST_INSTANCE_GPU=172.31.0.51:9100METRIC_TEST_DCGM_GPU=172.31.0.51:9400
- 验证点:
04_verify_dns_routing.sh增加对 metric 节点的域名解析;12_metric_gpu_install.sh等待 9100/9400;13_metric_verify_*校验 dcgm 指标与 Grafana 面板。