Skip to content

Commit 55f9fa2

Browse files
Merge pull request #2 from modelstudioai/fix/ts-lint
refactor(stress): simplify target definitions and enhance trace ID ha…
2 parents b0baa63 + 27494cf commit 55f9fa2

6 files changed

Lines changed: 63 additions & 26 deletions

File tree

packages/cli/tests/stress/lib/define-stress-target.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/**
22
* 压测 target 工厂函数:封装共享逻辑,每个 target 只需声明式配置。
33
*/
4-
import { mkdirSync, existsSync, readFileSync } from "node:fs";
4+
import { mkdirSync, existsSync } from "node:fs";
55
import { join } from "node:path";
66
import { execFile } from "node:child_process";
77
import { promisify } from "node:util";

packages/cli/tests/stress/lib/run-suite.mjs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,12 @@ export async function runStressSuite({ globals, forwarded }) {
9393

9494
// Phase 0: 生成共享前置资源
9595
console.error("");
96-
console.error("========== [Phase 0] 生成共享前置资源 ==========");
96+
console.error("========== [Phase 0] 生成前置资源 ==========");
9797
let sharedFixturesDir;
9898
try {
9999
sharedFixturesDir = await generateCombinedFixtures({ suiteRoot, cliPackage: undefined });
100100
} catch (err) {
101-
console.error(`[全量压测] 共享前置资源生成失败: ${err.message}`);
101+
console.error(`[全量压测] 前置资源生成失败: ${err.message}`);
102102
process.exit(1);
103103
}
104104

packages/cli/tests/stress/lib/suite-report.mjs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,16 @@ export function formatSuccessRate(rate) {
1313
return `${(rate * 100).toFixed(1)}%`;
1414
}
1515

16+
/**
17+
* 用例墙钟耗时:优先 wallClockMs,否则 finishedAt - startedAt,无效时 0。
18+
* @param {{ wallClockMs?: number, finishedAt?: number, startedAt?: number }} row
19+
*/
20+
function caseWallClockMs(row) {
21+
if (row.wallClockMs != null) return row.wallClockMs;
22+
const delta = row.finishedAt - row.startedAt;
23+
return Number.isFinite(delta) ? delta : 0;
24+
}
25+
1626
/**
1727
* @param {string} suiteRoot
1828
* @param {object[]} rows 各用例 finishStressRun 返回的摘要
@@ -55,7 +65,7 @@ function buildSuiteMarkdown(rows, meta) {
5565
lines.push("| 用例 | 执行时间 | 任务数 | 并发 | 成功 | 失败 | 成功率 | 详细报告 |");
5666
lines.push("|------|----------|--------|------|------|------|--------|--------|");
5767
for (const r of rows) {
58-
const dur = formatDuration(r.wallClockMs ?? r.finishedAt - r.startedAt ?? 0);
68+
const dur = formatDuration(caseWallClockMs(r));
5969
const sub = r.reportPath ? `\`${r.reportPath}\`` : "—";
6070
lines.push(
6171
`| ${escapeTableCell(r.displayName)} | ${dur} | ${r.count ?? "—"} | ${r.concurrency ?? "—"} | ${r.successCount ?? "—"} | ${r.failCount ?? "—"} | ${formatSuccessRate(r.successRate)} | ${sub} |`,
@@ -71,7 +81,7 @@ function buildSuiteMarkdown(rows, meta) {
7181
function buildSuiteHtml(rows, meta) {
7282
const tableRows = rows
7383
.map((r) => {
74-
const dur = formatDuration(r.wallClockMs ?? r.finishedAt - r.startedAt ?? 0);
84+
const dur = formatDuration(caseWallClockMs(r));
7585
const sub = r.reportPath
7686
? `<a href="${escapeHtml(r.reportPath)}">${escapeHtml(r.reportPath)}</a>`
7787
: "—";

packages/cli/tests/stress/lib/trace-ids.mjs

Lines changed: 46 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,33 @@
44
import { extractJsonFromStdout } from "./parsers.mjs";
55
import { fetchRequestIdByTaskId } from "./fetch-request-id.mjs";
66

7+
/**
8+
* 将 trace id 字段转为非空字符串;对象等无法可靠转换时返回 undefined。
9+
* @param {unknown} value
10+
* @returns {string | undefined}
11+
*/
12+
function toTraceString(value) {
13+
if (value == null) return undefined;
14+
if (typeof value === "string") {
15+
const trimmed = value.trim();
16+
return trimmed || undefined;
17+
}
18+
if (typeof value === "number" || typeof value === "boolean" || typeof value === "bigint") {
19+
const trimmed = String(value).trim();
20+
return trimmed || undefined;
21+
}
22+
return undefined;
23+
}
24+
25+
/**
26+
* 将日志字段转为字符串;非 string 时返回空字符串。
27+
* @param {unknown} value
28+
* @returns {string}
29+
*/
30+
function toLogText(value) {
31+
return typeof value === "string" ? value : "";
32+
}
33+
734
/**
835
* @param {unknown} data
936
*/
@@ -18,9 +45,9 @@ export function extractTraceIdsFromJson(data) {
1845
? /** @type {Record<string, unknown>} */ (obj.error)
1946
: undefined;
2047

21-
const requestIdRaw = obj.request_id ?? obj.requestId ?? err?.request_id ?? err?.requestId;
22-
const requestId =
23-
requestIdRaw != null && String(requestIdRaw).trim() ? String(requestIdRaw).trim() : undefined;
48+
const requestId = toTraceString(
49+
obj.request_id ?? obj.requestId ?? err?.request_id ?? err?.requestId,
50+
);
2451

2552
const taskId = formatTaskIdFromJson(obj);
2653
return { requestId, taskId };
@@ -30,28 +57,29 @@ export function extractTraceIdsFromJson(data) {
3057
* @param {Record<string, unknown>} data
3158
*/
3259
function formatTaskIdFromJson(data) {
33-
if (data.task_id != null && String(data.task_id).trim()) {
34-
return String(data.task_id).trim();
35-
}
60+
const single = toTraceString(data.task_id);
61+
if (single) return single;
3662
if (data.task_ids != null) {
3763
return formatTaskIdsValue(data.task_ids);
3864
}
3965
if (Array.isArray(data.videos)) {
4066
const ids = data.videos
4167
.map((v) =>
42-
v && typeof v === "object" ? /** @type {{ task_id?: unknown }} */ (v).task_id : null,
68+
v && typeof v === "object"
69+
? toTraceString(/** @type {{ task_id?: unknown }} */ (v).task_id)
70+
: undefined,
4371
)
44-
.filter((id) => id != null && String(id).trim())
45-
.map((id) => String(id).trim());
72+
.filter((id) => id != null);
4673
if (ids.length > 0) return [...new Set(ids)].join(", ");
4774
}
4875
if (Array.isArray(data.images)) {
4976
const ids = data.images
5077
.map((v) =>
51-
v && typeof v === "object" ? /** @type {{ task_id?: unknown }} */ (v).task_id : null,
78+
v && typeof v === "object"
79+
? toTraceString(/** @type {{ task_id?: unknown }} */ (v).task_id)
80+
: undefined,
5281
)
53-
.filter((id) => id != null && String(id).trim())
54-
.map((id) => String(id).trim());
82+
.filter((id) => id != null);
5583
if (ids.length > 0) return [...new Set(ids)].join(", ");
5684
}
5785
return undefined;
@@ -62,11 +90,10 @@ function formatTaskIdFromJson(data) {
6290
*/
6391
function formatTaskIdsValue(value) {
6492
if (Array.isArray(value)) {
65-
const ids = value.map((v) => String(v).trim()).filter(Boolean);
93+
const ids = value.map((v) => toTraceString(v)).filter((id) => id != null);
6694
return ids.length > 0 ? ids.join(", ") : undefined;
6795
}
68-
if (value != null && String(value).trim()) return String(value).trim();
69-
return undefined;
96+
return toTraceString(value);
7097
}
7198

7299
/**
@@ -186,9 +213,9 @@ export function extractTraceIdsFromLogs(stdout, stderr) {
186213
* @param {Record<string, unknown>} result
187214
*/
188215
export function mergeTraceIds(result) {
189-
const stdout = String(result.stdout ?? "");
190-
const stderr = String(result.stderr ?? "");
191-
const errorText = String(result.error ?? "");
216+
const stdout = toLogText(result.stdout);
217+
const stderr = toLogText(result.stderr);
218+
const errorText = toLogText(result.error);
192219
const combined = `${stdout}\n${stderr}\n${errorText}`;
193220

194221
const data = extractJsonFromStdout(stdout);
@@ -230,7 +257,7 @@ export async function enrichTraceIdsAsync(result) {
230257

231258
if (merged.requestId) return merged;
232259

233-
const taskId = merged.taskId ? String(merged.taskId).split(",")[0].trim() : "";
260+
const taskId = toTraceString(merged.taskId)?.split(",")[0]?.trim() ?? "";
234261
if (!taskId) return merged;
235262

236263
if (process.env.STRESS_FETCH_REQUEST_ID === "0") return merged;

packages/cli/tests/stress/targets/speech-recognize.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export const runStress = defineStressTarget({
3030

3131
generatePrompt: (idx) => `[ASR-${idx}-${Date.now().toString(36)}]`,
3232

33-
buildCliArgs: ({ MODEL, CLI_TIMEOUT_SEC, POLL_INTERVAL, fixtureRef, runDir, index }) => [
33+
buildCliArgs: ({ MODEL, CLI_TIMEOUT_SEC, POLL_INTERVAL, fixtureRef, runDir }) => [
3434
"speech",
3535
"recognize",
3636
"--model",

packages/cli/tests/stress/targets/video-t2v.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ export const runStress = defineStressTarget({
8888
String(POLL_INTERVAL),
8989
],
9090

91-
buildBaseRecord: ({ runDir, index, extraParams }) => ({
91+
buildBaseRecord: ({ runDir, index }) => ({
9292
downloadPath: join(runDir, `video_${String(index + 1).padStart(3, "0")}.mp4`),
9393
}),
9494

0 commit comments

Comments
 (0)