From d279d8a6a881cea0d4a7818b3d7968cfced2e8e5 Mon Sep 17 00:00:00 2001 From: "sundapeng.sdp" Date: Mon, 13 Oct 2025 18:12:29 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96argus-metric?= =?UTF-8?q?=E6=A8=A1=E5=9D=97e2e=E6=B5=8B=E8=AF=95=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refs #20 --- src/metric/tests/.gitignore | 2 +- src/metric/tests/docker-compose.yml | 51 ++++++---- src/metric/tests/scripts/00_e2e_test.sh | 18 ++++ src/metric/tests/scripts/01_start_services.sh | 19 ++++ .../tests/scripts/02_publish_artifact.sh | 60 ++++++++++++ .../tests/scripts/03_test_node_install.sh | 30 ++++++ src/metric/tests/scripts/04_verify_install.sh | 96 +++++++++++++++++++ src/metric/tests/scripts/05_cleanup.sh | 11 +++ .../tests/{ => scripts/common}/check-paths.sh | 9 +- .../{ => scripts/common}/init-directories.sh | 5 +- .../{ => scripts/common}/init-environment.sh | 0 .../{ => scripts/common}/manage-images.sh | 5 +- .../tests/{ => scripts/common}/start-all.sh | 23 ++++- .../tests/{ => scripts/common}/stop-all.sh | 5 +- 14 files changed, 302 insertions(+), 32 deletions(-) create mode 100755 src/metric/tests/scripts/00_e2e_test.sh create mode 100755 src/metric/tests/scripts/01_start_services.sh create mode 100755 src/metric/tests/scripts/02_publish_artifact.sh create mode 100755 src/metric/tests/scripts/03_test_node_install.sh create mode 100755 src/metric/tests/scripts/04_verify_install.sh create mode 100755 src/metric/tests/scripts/05_cleanup.sh rename src/metric/tests/{ => scripts/common}/check-paths.sh (92%) rename src/metric/tests/{ => scripts/common}/init-directories.sh (96%) rename src/metric/tests/{ => scripts/common}/init-environment.sh (100%) rename src/metric/tests/{ => scripts/common}/manage-images.sh (98%) rename src/metric/tests/{ => scripts/common}/start-all.sh (91%) rename src/metric/tests/{ => scripts/common}/stop-all.sh (92%) diff --git a/src/metric/tests/.gitignore b/src/metric/tests/.gitignore index b73f619..62f84ef 100644 --- a/src/metric/tests/.gitignore +++ b/src/metric/tests/.gitignore @@ -1,7 +1,7 @@ .env data/ images-cache/ +private-test-node/ *.tar *.log .DS_Store - diff --git a/src/metric/tests/docker-compose.yml b/src/metric/tests/docker-compose.yml index 45ea0ac..9cae344 100644 --- a/src/metric/tests/docker-compose.yml +++ b/src/metric/tests/docker-compose.yml @@ -1,3 +1,8 @@ +networks: + default: + name: argus-debug-net + external: true + services: ftp: build: @@ -23,7 +28,8 @@ services: - ${DATA_ROOT:-./data}/ftp:/private/argus/ftp - ${DATA_ROOT:-./data}/etc:/private/argus/etc networks: - - argus-network + default: + ipv4_address: 172.30.0.40 logging: driver: "json-file" options: @@ -51,7 +57,8 @@ services: - ${DATA_ROOT:-./data}/prometheus:/private/argus/metric/prometheus - ${DATA_ROOT:-./data}/etc:/private/argus/etc networks: - - argus-network + default: + ipv4_address: 172.30.0.41 logging: driver: "json-file" options: @@ -81,7 +88,8 @@ services: - ${DATA_ROOT:-./data}/grafana:/private/argus/metric/grafana - ${DATA_ROOT:-./data}/etc:/private/argus/etc networks: - - argus-network + default: + ipv4_address: 172.30.0.42 depends_on: - prometheus logging: @@ -90,16 +98,27 @@ services: max-size: "10m" max-file: "3" -networks: - argus-network: - driver: bridge - name: argus-network - -volumes: - ftp_data: - driver: local - prometheus_data: - driver: local - grafana_data: - driver: local - + test-node: + image: ubuntu:22.04 + container_name: argus-metric-test-node + hostname: test-metric-node-001 + restart: unless-stopped + depends_on: + - ftp + - prometheus + environment: + - FTP_SERVER=${FTP_SERVER:-172.30.0.40} + - FTP_USER=${FTP_USER:-ftpuser} + - FTP_PASSWORD=${FTP_PASSWORD:-ZGClab1234!} + - FTP_PORT=${FTP_PORT:-21} + volumes: + - ${DATA_ROOT:-./data}/agent:/private/argus/agent + command: sleep infinity + networks: + default: + ipv4_address: 172.30.0.50 + logging: + driver: "json-file" + options: + max-size: "10m" + max-file: "3" diff --git a/src/metric/tests/scripts/00_e2e_test.sh b/src/metric/tests/scripts/00_e2e_test.sh new file mode 100755 index 0000000..78f30de --- /dev/null +++ b/src/metric/tests/scripts/00_e2e_test.sh @@ -0,0 +1,18 @@ +#!/bin/bash +set -e + +SCRIPT_DIR="$(dirname "$0")" + +echo "==========================================" +echo "Argus Metric E2E Test" +echo "==========================================" + +bash "$SCRIPT_DIR/01_start_services.sh" +bash "$SCRIPT_DIR/02_publish_artifact.sh" +bash "$SCRIPT_DIR/03_test_node_install.sh" +bash "$SCRIPT_DIR/04_verify_install.sh" + +echo "==========================================" +echo "E2E 测试完成" +echo "==========================================" + diff --git a/src/metric/tests/scripts/01_start_services.sh b/src/metric/tests/scripts/01_start_services.sh new file mode 100755 index 0000000..3cd54b6 --- /dev/null +++ b/src/metric/tests/scripts/01_start_services.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" + +echo "[01] 启动所有服务..." +bash "$SCRIPT_DIR/common/start-all.sh" + +echo "[01] 等待服务就绪..." +sleep 5 + +echo "[01] 检查服务状态..." +docker ps | grep argus-ftp +docker ps | grep argus-prometheus +docker ps | grep argus-grafana +docker ps | grep argus-metric-test-node + +echo "[01] 所有服务已启动" + diff --git a/src/metric/tests/scripts/02_publish_artifact.sh b/src/metric/tests/scripts/02_publish_artifact.sh new file mode 100755 index 0000000..15dcf72 --- /dev/null +++ b/src/metric/tests/scripts/02_publish_artifact.sh @@ -0,0 +1,60 @@ +#!/bin/bash +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +TEST_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" +PLUGIN_DIR="$(cd "$SCRIPT_DIR/../../client-plugins/all-in-one-full" && pwd)" + +# 加载 .env +if [ -f "$TEST_DIR/.env" ]; then + source "$TEST_DIR/.env" +fi + +# 检测容器挂载目录 +if docker ps --format '{{.Names}}' | grep -q '^argus-ftp$'; then + FTP_MOUNT=$(docker inspect argus-ftp --format '{{range .Mounts}}{{if eq .Destination "/private/argus/ftp"}}{{.Source}}{{end}}{{end}}') + OUTPUT_DIR="${FTP_MOUNT}/share" + echo "[02] 容器挂载: $OUTPUT_DIR" +else + OUTPUT_DIR="${DATA_ROOT:-$TEST_DIR/data}/ftp/share" + echo "[02] 默认路径: $OUTPUT_DIR" +fi + +OWNER="${FTP_UID:-2133}:${FTP_GID:-2015}" + +cd "$PLUGIN_DIR" + +echo "[02] 递增版本号..." +bash scripts/version-manager.sh bump minor + +VERSION_FILE="config/VERSION" +if [ ! -f "$VERSION_FILE" ]; then + echo "[02] 错误: 未找到 $VERSION_FILE" + exit 1 +fi + +VERSION=$(cat "$VERSION_FILE" | tr -d '[:space:]') +echo "[02] 新版本: $VERSION" + +echo "[02] 构建安装包..." +bash scripts/package_artifact.sh --force + +echo "[02] 发布到 FTP: $OUTPUT_DIR" +sudo bash scripts/publish_artifact.sh "$VERSION" --output-dir "$OUTPUT_DIR" --owner "$OWNER" + +echo "[02] 设置文件权限..." +# 设置所有者 +sudo chown -R "$OWNER" "$OUTPUT_DIR" +# 设置目录权限为 755 (rwxr-xr-x) +sudo find "$OUTPUT_DIR" -type d -exec chmod 755 {} \; +# 设置文件权限为 644 (rw-r--r--) +sudo find "$OUTPUT_DIR" -type f -exec chmod 644 {} \; +# 特别处理 .sh 文件,给予执行权限 755 +sudo find "$OUTPUT_DIR" -type f -name "*.sh" -exec chmod 755 {} \; +echo "[02] 权限设置完成 (UID:GID=$OWNER, dirs=755, files=644, scripts=755)" + +echo "[02] 发布完成,验证文件..." +ls -lh "$OUTPUT_DIR" + +echo "[02] 完成" + diff --git a/src/metric/tests/scripts/03_test_node_install.sh b/src/metric/tests/scripts/03_test_node_install.sh new file mode 100755 index 0000000..cfe5116 --- /dev/null +++ b/src/metric/tests/scripts/03_test_node_install.sh @@ -0,0 +1,30 @@ +#!/bin/bash +set -e + +FTP_SERVER="${FTP_SERVER:-172.30.0.40}" +FTP_USER="${FTP_USER:-ftpuser}" +FTP_PASSWORD="${FTP_PASSWORD:-ZGClab1234!}" +FTP_PORT="${FTP_PORT:-21}" + +echo "[03] 进入测试节点执行安装..." + +docker exec argus-metric-test-node bash -c " +set -e + +if ! command -v curl &>/dev/null; then + echo '[03] curl 未安装,正在安装...' + apt-get update && apt-get install -y curl +fi + +cd /tmp +echo '[03] 下载 setup.sh...' +curl -u ${FTP_USER}:${FTP_PASSWORD} ftp://${FTP_SERVER}:${FTP_PORT}/setup.sh -o setup.sh + +echo '[03] 执行安装...' +chmod +x setup.sh +bash setup.sh --server ${FTP_SERVER} --user ${FTP_USER} --password '${FTP_PASSWORD}' --port ${FTP_PORT} + +echo '[03] 安装完成' +" + +echo "[03] 完成" diff --git a/src/metric/tests/scripts/04_verify_install.sh b/src/metric/tests/scripts/04_verify_install.sh new file mode 100755 index 0000000..5a33a05 --- /dev/null +++ b/src/metric/tests/scripts/04_verify_install.sh @@ -0,0 +1,96 @@ +#!/bin/bash +set -e + +echo "[04] 验证安装结果 - 检查监控端口..." +echo "==========================================" + +# 检查容器是否运行 +if ! docker ps --format '{{.Names}}' | grep -q '^argus-metric-test-node$'; then + echo "错误: 容器 argus-metric-test-node 未运行" + exit 1 +fi + +ERRORS=0 + +# ==================== 检查监听端口 ==================== +echo "" +echo "[1] 检查监听端口..." +echo "----------------------------------------" +CHECK_RESULT=$(docker exec argus-metric-test-node bash -c ' +if command -v netstat >/dev/null 2>&1; then + echo "使用 netstat 检查端口:" + if netstat -tlnp 2>/dev/null | grep -E ":(9100|9400|2020)"; then + echo "✓ 找到监控端口" + exit 0 + else + echo "✗ 未找到监控端口 (9100/9400/2020)" + exit 1 + fi +elif command -v ss >/dev/null 2>&1; then + echo "使用 ss 检查端口:" + if ss -tlnp 2>/dev/null | grep -E ":(9100|9400|2020)"; then + echo "✓ 找到监控端口" + exit 0 + else + echo "✗ 未找到监控端口 (9100/9400/2020)" + exit 1 + fi +elif command -v lsof >/dev/null 2>&1; then + echo "使用 lsof 检查端口:" + if lsof -i :9100 -i :9400 -i :2020 2>/dev/null | grep LISTEN; then + echo "✓ 找到监控端口" + exit 0 + else + echo "✗ 未找到监控端口 (9100/9400/2020)" + exit 1 + fi +else + echo "? 没有可用的端口检查工具 (netstat/ss/lsof),跳过此检查" + exit 0 +fi +') +echo "$CHECK_RESULT" +# 只有在明确失败时才计入错误(exit 1),没有工具(exit 0)不算错误 +if echo "$CHECK_RESULT" | grep -q "✗ 未找到监控端口"; then + ERRORS=$((ERRORS + 1)) +fi + +# ==================== 测试端口连通性 ==================== +echo "" +echo "[2] 测试端口连通性..." +echo "----------------------------------------" +docker exec argus-metric-test-node bash -c ' +if command -v curl >/dev/null 2>&1; then + FAILED=0 + for port in 9100 9400 2020; do + echo -n "端口 $port: " + if curl -s --connect-timeout 2 "http://localhost:$port/metrics" > /dev/null 2>&1; then + echo "✓ 可访问 (/metrics)" + elif curl -s --connect-timeout 2 "http://localhost:$port/" > /dev/null 2>&1; then + echo "✓ 可访问 (根路径)" + else + echo "✗ 不可访问" + FAILED=$((FAILED + 1)) + fi + done + exit $FAILED +else + echo "? curl 不可用,跳过连通性测试" + exit 0 +fi +' || ERRORS=$((ERRORS + 1)) + +echo "" +echo "==========================================" +if [ $ERRORS -eq 0 ]; then + echo "✓ [04] 验证完成 - 所有端口检查通过" +else + echo "✗ [04] 验证失败 - 发现 $ERRORS 个问题" + echo "" + echo "调试建议:" + echo " 1. 进入容器检查: docker exec -it argus-metric-test-node bash" + echo " 2. 查看进程: docker exec argus-metric-test-node ps aux" + echo " 3. 查看日志: docker exec argus-metric-test-node cat /tmp/argus_install.log" + exit 1 +fi +echo "==========================================" diff --git a/src/metric/tests/scripts/05_cleanup.sh b/src/metric/tests/scripts/05_cleanup.sh new file mode 100755 index 0000000..c7c93d3 --- /dev/null +++ b/src/metric/tests/scripts/05_cleanup.sh @@ -0,0 +1,11 @@ +#!/bin/bash +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" + +echo "[05] 清理环境..." + +bash "$SCRIPT_DIR/common/stop-all.sh" || true + +echo "[05] 清理完成" + diff --git a/src/metric/tests/check-paths.sh b/src/metric/tests/scripts/common/check-paths.sh similarity index 92% rename from src/metric/tests/check-paths.sh rename to src/metric/tests/scripts/common/check-paths.sh index bc93897..71ec5c1 100755 --- a/src/metric/tests/check-paths.sh +++ b/src/metric/tests/scripts/common/check-paths.sh @@ -6,7 +6,8 @@ set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -cd "$SCRIPT_DIR" +TEST_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)" +cd "$TEST_DIR" echo "==========================================" echo " 路径检查脚本" @@ -18,15 +19,15 @@ echo "" # 检查配置文件 echo "检查配置文件..." -if [ -f "$SCRIPT_DIR/docker-compose.yml" ]; then +if [ -f "$TEST_DIR/docker-compose.yml" ]; then echo " ✓ docker-compose.yml 存在" else echo " ✗ docker-compose.yml 不存在" fi -if [ -f "$SCRIPT_DIR/.env" ]; then +if [ -f "$TEST_DIR/.env" ]; then echo " ✓ .env 存在" -elif [ -f "$SCRIPT_DIR/env.example" ]; then +elif [ -f "$TEST_DIR/env.example" ]; then echo " ⚠ .env 不存在,但 env.example 存在" else echo " ✗ .env 和 env.example 都不存在" diff --git a/src/metric/tests/init-directories.sh b/src/metric/tests/scripts/common/init-directories.sh similarity index 96% rename from src/metric/tests/init-directories.sh rename to src/metric/tests/scripts/common/init-directories.sh index df5d719..6a31acf 100755 --- a/src/metric/tests/init-directories.sh +++ b/src/metric/tests/scripts/common/init-directories.sh @@ -6,7 +6,8 @@ set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -cd "$SCRIPT_DIR" +TEST_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)" +cd "$TEST_DIR" # 加载 .env 文件(如果存在) if [ -f .env ]; then @@ -21,7 +22,7 @@ PROMETHEUS_UID=${PROMETHEUS_UID:-2133} PROMETHEUS_GID=${PROMETHEUS_GID:-2015} GRAFANA_UID=${GRAFANA_UID:-2133} GRAFANA_GID=${GRAFANA_GID:-2015} -DATA_ROOT=${DATA_ROOT:-./data} +DATA_ROOT=${DATA_ROOT:-$TEST_DIR/data} echo "开始初始化目录结构..." echo "数据目录: ${DATA_ROOT}" diff --git a/src/metric/tests/init-environment.sh b/src/metric/tests/scripts/common/init-environment.sh similarity index 100% rename from src/metric/tests/init-environment.sh rename to src/metric/tests/scripts/common/init-environment.sh diff --git a/src/metric/tests/manage-images.sh b/src/metric/tests/scripts/common/manage-images.sh similarity index 98% rename from src/metric/tests/manage-images.sh rename to src/metric/tests/scripts/common/manage-images.sh index b47150b..8524a5d 100755 --- a/src/metric/tests/manage-images.sh +++ b/src/metric/tests/scripts/common/manage-images.sh @@ -6,7 +6,8 @@ set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -cd "$SCRIPT_DIR" +TEST_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)" +cd "$TEST_DIR" # 检测 docker-compose 命令 if command -v docker-compose &> /dev/null; then @@ -19,7 +20,7 @@ else fi # 镜像缓存目录 -IMAGE_CACHE_DIR="./images-cache" +IMAGE_CACHE_DIR="$TEST_DIR/images-cache" mkdir -p "$IMAGE_CACHE_DIR" # 定义镜像列表 diff --git a/src/metric/tests/start-all.sh b/src/metric/tests/scripts/common/start-all.sh similarity index 91% rename from src/metric/tests/start-all.sh rename to src/metric/tests/scripts/common/start-all.sh index b0ceb72..fd51472 100755 --- a/src/metric/tests/start-all.sh +++ b/src/metric/tests/scripts/common/start-all.sh @@ -6,13 +6,14 @@ set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -cd "$SCRIPT_DIR" +TEST_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)" +cd "$TEST_DIR" echo "==========================================" echo " Argus Metrics 一键启动脚本" echo "==========================================" echo "" -echo "当前工作目录: $SCRIPT_DIR" +echo "当前工作目录: $TEST_DIR" echo "" # 检查 Docker 和 Docker Compose @@ -22,7 +23,7 @@ if ! command -v docker &> /dev/null; then fi # 检测 docker-compose 命令(兼容新旧版本) -COMPOSE_FILE="$SCRIPT_DIR/docker-compose.yml" +COMPOSE_FILE="$TEST_DIR/docker-compose.yml" if command -v docker-compose &> /dev/null; then DOCKER_COMPOSE="docker-compose -f $COMPOSE_FILE" echo "使用: docker-compose" @@ -65,6 +66,18 @@ fi # 加载环境变量 source .env +# 检查并创建 Docker 网络 +echo "检查 Docker 网络..." +NETWORK_NAME="argus-debug-net" +if docker network inspect "$NETWORK_NAME" >/dev/null 2>&1; then + echo "网络 $NETWORK_NAME 已存在" +else + echo "创建网络 $NETWORK_NAME..." + docker network create --driver bridge --subnet 172.30.0.0/16 "$NETWORK_NAME" + echo "网络创建成功" +fi +echo "" + echo "1. 初始化目录结构..." bash "$SCRIPT_DIR/init-directories.sh" @@ -72,7 +85,7 @@ echo "" echo "2. 准备 Docker 镜像..." # 检查镜像是否存在 -IMAGE_CACHE_DIR="./images-cache" +IMAGE_CACHE_DIR="$TEST_DIR/images-cache" IMAGES=("argus-metric-ftp:latest" "argus-metric-prometheus:latest" "argus-metric-grafana:latest") all_images_exist=true @@ -128,7 +141,7 @@ else echo "" echo "部分镜像缺失,开始构建..." echo "工作目录: $(pwd)" - cd "$SCRIPT_DIR" + cd "$TEST_DIR" $DOCKER_COMPOSE build # 询问是否保存镜像 diff --git a/src/metric/tests/stop-all.sh b/src/metric/tests/scripts/common/stop-all.sh similarity index 92% rename from src/metric/tests/stop-all.sh rename to src/metric/tests/scripts/common/stop-all.sh index 6886160..1ede6d6 100755 --- a/src/metric/tests/stop-all.sh +++ b/src/metric/tests/scripts/common/stop-all.sh @@ -5,10 +5,11 @@ set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -cd "$SCRIPT_DIR" +TEST_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)" +cd "$TEST_DIR" # 检测 docker-compose 命令(兼容新旧版本) -COMPOSE_FILE="$SCRIPT_DIR/docker-compose.yml" +COMPOSE_FILE="$TEST_DIR/docker-compose.yml" if command -v docker-compose &> /dev/null; then DOCKER_COMPOSE="docker-compose -f $COMPOSE_FILE" elif docker compose version &> /dev/null 2>&1; then