fix(e2e): heartbeat resource-sampled docker lanes

This commit is contained in:
Vincent Koc
2026-05-31 15:02:44 +02:00
parent f24a138790
commit fbde572491
5 changed files with 61 additions and 21 deletions

View File

@@ -64,12 +64,13 @@ DOCKER_COMMAND_TIMEOUT="$DOCKER_RUN_TIMEOUT" docker_e2e_docker_run_cmd run --nam
>"$RUN_LOG" 2>&1 &
docker_pid="$!"
while kill -0 "$docker_pid" 2>/dev/null; do
if docker_e2e_docker_cmd inspect "$CONTAINER_NAME" >/dev/null 2>&1; then
docker_e2e_docker_cmd stats --no-stream --format '{{json .}}' "$CONTAINER_NAME" >>"$STATS_LOG" 2>/dev/null || true
fi
sleep 2
done
docker_e2e_sample_stats_until_exit \
"$CONTAINER_NAME" \
"$docker_pid" \
"$STATS_LOG" \
"$RUN_LOG" \
"Kitchen-sink plugin Docker E2E" \
"${OPENCLAW_DOCKER_E2E_STATS_HEARTBEAT_SECONDS:-30}"
set +e
wait "$docker_pid"

View File

@@ -47,12 +47,13 @@ DOCKER_COMMAND_TIMEOUT="$DOCKER_RUN_TIMEOUT" docker_e2e_docker_run_cmd run --nam
node scripts/e2e/kitchen-sink-rpc-walk.mjs >"$RUN_LOG" 2>&1 &
docker_pid="$!"
while kill -0 "$docker_pid" 2>/dev/null; do
if docker_e2e_docker_cmd inspect "$CONTAINER_NAME" >/dev/null 2>&1; then
docker_e2e_docker_cmd stats --no-stream --format '{{json .}}' "$CONTAINER_NAME" >>"$STATS_LOG" 2>/dev/null || true
fi
sleep 2
done
docker_e2e_sample_stats_until_exit \
"$CONTAINER_NAME" \
"$docker_pid" \
"$STATS_LOG" \
"$RUN_LOG" \
"Kitchen-sink RPC Docker E2E" \
"${OPENCLAW_DOCKER_E2E_STATS_HEARTBEAT_SECONDS:-30}"
set +e
wait "$docker_pid"

View File

@@ -30,12 +30,13 @@ DOCKER_COMMAND_TIMEOUT="$DOCKER_RUN_TIMEOUT" docker_e2e_docker_run_cmd run --nam
"$IMAGE_NAME" bash scripts/e2e/lib/onboard/scenario.sh >"$RUN_LOG" 2>&1 &
docker_pid="$!"
while kill -0 "$docker_pid" 2>/dev/null; do
if docker_e2e_docker_cmd inspect "$CONTAINER_NAME" >/dev/null 2>&1; then
docker_e2e_docker_cmd stats --no-stream --format '{{json .}}' "$CONTAINER_NAME" >>"$STATS_LOG" 2>/dev/null || true
fi
sleep 2
done
docker_e2e_sample_stats_until_exit \
"$CONTAINER_NAME" \
"$docker_pid" \
"$STATS_LOG" \
"$RUN_LOG" \
"Onboarding Docker E2E" \
"${OPENCLAW_DOCKER_E2E_STATS_HEARTBEAT_SECONDS:-30}"
set +e
wait "$docker_pid"

View File

@@ -117,3 +117,37 @@ docker_e2e_test_state_function_b64() {
base64 |
tr -d '\n'
}
docker_e2e_sample_stats_until_exit() {
local container_name="${1:?missing container name}"
local docker_pid="${2:?missing docker pid}"
local stats_log="${3:?missing stats log}"
local run_log="${4:?missing run log}"
local label="${5:-Docker E2E}"
local heartbeat_seconds="${6:-30}"
local started_at="$SECONDS"
local last_heartbeat="$SECONDS"
if ! [[ "$heartbeat_seconds" =~ ^[0-9]+$ ]] || [ "$heartbeat_seconds" -lt 1 ]; then
heartbeat_seconds="30"
fi
while kill -0 "$docker_pid" 2>/dev/null; do
if docker_e2e_docker_cmd inspect "$container_name" >/dev/null 2>&1; then
docker_e2e_docker_cmd stats --no-stream --format '{{json .}}' "$container_name" >>"$stats_log" 2>/dev/null || true
fi
if ((SECONDS - last_heartbeat >= heartbeat_seconds)); then
local elapsed_seconds=$((SECONDS - started_at))
local log_bytes="0"
if [ -f "$run_log" ]; then
log_bytes="$(wc -c <"$run_log" 2>/dev/null || echo 0)"
log_bytes="${log_bytes//[[:space:]]/}"
fi
echo "$label still running (${elapsed_seconds}s elapsed, ${log_bytes} log bytes captured)..."
last_heartbeat="$SECONDS"
fi
sleep 2
done
}

View File

@@ -1359,7 +1359,9 @@ test -f "$TMPDIR/docker-cmd-seen"
);
expect(runner).toContain('-e "OPENCLAW_E2E_COMMAND_TIMEOUT=$COMMAND_TIMEOUT"');
expect(runner).toContain('--name "$CONTAINER_NAME"');
expect(runner).toContain("docker_e2e_docker_cmd stats --no-stream");
expect(runner).toContain("docker_e2e_sample_stats_until_exit \\");
expect(runner).toContain('"$STATS_LOG" \\');
expect(runner).toContain('"$RUN_LOG" \\');
expect(runner).toContain("assert-resource-ceiling.mjs");
expect(runner).not.toContain("docker_e2e_run_with_harness -t");
});
@@ -1379,8 +1381,9 @@ test -f "$TMPDIR/docker-cmd-seen"
'DOCKER_COMMAND_TIMEOUT="$DOCKER_RUN_TIMEOUT" docker_e2e_docker_run_cmd run --name "$CONTAINER_NAME"',
);
expect(runner, path).toContain('DOCKER_RUN_TIMEOUT="${OPENCLAW_');
expect(runner, path).toContain('docker_e2e_docker_cmd inspect "$CONTAINER_NAME"');
expect(runner, path).toContain("docker_e2e_docker_cmd stats --no-stream");
expect(runner, path).toContain("docker_e2e_sample_stats_until_exit \\");
expect(runner, path).toContain('"$STATS_LOG" \\');
expect(runner, path).toContain('"$RUN_LOG" \\');
expect(runner, path).not.toMatch(/(^|\n)docker run --name "\$CONTAINER_NAME"/u);
expect(runner, path).not.toMatch(/(^|\n)docker (?:inspect|stats) /u);
expect(runner, path).toMatch(/cleanup\(\) \{[\s\S]*rm -f "\$RUN_LOG" "\$STATS_LOG"/u);