1
0

refactor: 移除 success 字段,简化为 matched 单层判定模型

This commit is contained in:
2026-05-11 13:12:55 +08:00
parent 548b44d28e
commit 35ba56888b
93 changed files with 3893 additions and 103 deletions

View File

@@ -205,7 +205,7 @@ function createTargetsResponse(store: ProbeStore): TargetStatus[] {
recentSamples: recentSamples.map((s) => ({
timestamp: s.timestamp,
durationMs: s.duration_ms,
up: s.success === 1 && s.matched === 1,
up: s.matched === 1,
})),
stats: {
totalChecks: stats.totalChecks,
@@ -223,7 +223,6 @@ function mapCheckResult(row: StoredCheckResult): CheckResult {
return {
timestamp: row.timestamp,
success: row.success === 1,
matched: row.matched === 1,
durationMs: row.duration_ms,
statusDetail: row.status_detail,

View File

@@ -61,6 +61,7 @@ export async function runCommandCheck(target: ResolvedCommandTarget): Promise<Ch
proc = Bun.spawn([target.command.exec, ...target.command.args], {
cwd: target.command.cwd,
env: target.command.env,
stdin: "ignore",
stdout: "pipe",
stderr: "pipe",
});
@@ -69,7 +70,6 @@ export async function runCommandCheck(target: ResolvedCommandTarget): Promise<Ch
return {
targetName: target.name,
timestamp,
success: false,
matched: false,
durationMs,
statusDetail: null,
@@ -102,7 +102,6 @@ export async function runCommandCheck(target: ResolvedCommandTarget): Promise<Ch
return {
targetName: target.name,
timestamp,
success: false,
matched: false,
durationMs,
statusDetail: null,
@@ -120,7 +119,6 @@ export async function runCommandCheck(target: ResolvedCommandTarget): Promise<Ch
return {
targetName: target.name,
timestamp,
success: false,
matched: false,
durationMs,
statusDetail: `exitCode=${exitCode}`,
@@ -132,7 +130,6 @@ export async function runCommandCheck(target: ResolvedCommandTarget): Promise<Ch
return {
targetName: target.name,
timestamp,
success: false,
matched: false,
durationMs,
statusDetail: null,
@@ -146,7 +143,6 @@ export async function runCommandCheck(target: ResolvedCommandTarget): Promise<Ch
return {
targetName: target.name,
timestamp,
success: expectResult.matched,
matched: expectResult.matched,
durationMs,
statusDetail: `exitCode=${exitCode}`,

View File

@@ -106,7 +106,6 @@ export class ProbeEngine {
this.store.insertCheckResult({
targetId,
timestamp: result.timestamp,
success: result.success,
matched: result.matched,
durationMs: result.durationMs,
statusDetail: result.statusDetail,

View File

@@ -43,7 +43,6 @@ export async function runHttpCheck(target: ResolvedHttpTarget): Promise<CheckRes
return {
targetName: target.name,
timestamp,
success: preBodyResult.matched,
matched: preBodyResult.matched,
durationMs,
statusDetail: `HTTP ${statusCode}`,
@@ -58,7 +57,6 @@ export async function runHttpCheck(target: ResolvedHttpTarget): Promise<CheckRes
return {
targetName: target.name,
timestamp,
success: false,
matched: false,
durationMs,
statusDetail: `HTTP ${statusCode}`,
@@ -77,7 +75,6 @@ export async function runHttpCheck(target: ResolvedHttpTarget): Promise<CheckRes
return {
targetName: target.name,
timestamp,
success: fullResult.matched,
matched: fullResult.matched,
durationMs,
statusDetail: `HTTP ${statusCode}`,
@@ -90,7 +87,6 @@ export async function runHttpCheck(target: ResolvedHttpTarget): Promise<CheckRes
return {
targetName: target.name,
timestamp,
success: false,
matched: false,
durationMs: null,
statusDetail: null,

View File

@@ -22,7 +22,6 @@ CREATE TABLE IF NOT EXISTS check_results (
id INTEGER PRIMARY KEY AUTOINCREMENT,
target_id INTEGER NOT NULL,
timestamp TEXT NOT NULL,
success INTEGER NOT NULL,
matched INTEGER NOT NULL,
duration_ms REAL,
status_detail TEXT,
@@ -93,7 +92,7 @@ export class ProbeStore {
getTargets(): StoredTarget[] {
if (this.closed) return [];
return this.db
.query("SELECT * FROM targets ORDER BY CASE WHEN grp='default' THEN 0 ELSE 1 END, grp, id")
.query("SELECT * FROM targets ORDER BY CASE WHEN grp='default' THEN 0 ELSE 1 END, id")
.all() as StoredTarget[];
}
@@ -105,7 +104,6 @@ export class ProbeStore {
insertCheckResult(result: {
targetId: number;
timestamp: string;
success: boolean;
matched: boolean;
durationMs: number | null;
statusDetail: string | null;
@@ -114,12 +112,11 @@ export class ProbeStore {
if (this.closed) return;
this.db
.prepare(
"INSERT INTO check_results (target_id, timestamp, success, matched, duration_ms, status_detail, failure) VALUES (?, ?, ?, ?, ?, ?, ?)",
"INSERT INTO check_results (target_id, timestamp, matched, duration_ms, status_detail, failure) VALUES (?, ?, ?, ?, ?, ?)",
)
.run(
result.targetId,
result.timestamp,
result.success ? 1 : 0,
result.matched ? 1 : 0,
result.durationMs,
result.statusDetail,
@@ -191,7 +188,7 @@ export class ProbeStore {
.prepare(
`SELECT
strftime('%Y-%m-%dT%H:00:00', timestamp) as hour,
AVG(CASE WHEN success = 1 THEN duration_ms END) as avgDurationMs,
AVG(CASE WHEN matched = 1 THEN duration_ms END) as avgDurationMs,
CASE WHEN COUNT(*) > 0 THEN (SUM(CASE WHEN matched = 1 THEN 1 ELSE 0 END) * 100.0 / COUNT(*)) ELSE 0 END as availability,
COUNT(*) as totalChecks
FROM check_results
@@ -222,7 +219,7 @@ export class ProbeStore {
const latest = this.getLatestCheck(target.id);
if (latest) {
if (latest.success && latest.matched) {
if (latest.matched) {
up++;
} else {
down++;
@@ -247,15 +244,14 @@ export class ProbeStore {
getRecentSamples(
targetId: number,
limit: number,
): Array<{ timestamp: string; duration_ms: number | null; success: number; matched: number }> {
): Array<{ timestamp: string; duration_ms: number | null; matched: number }> {
return this.db
.prepare(
"SELECT timestamp, duration_ms, success, matched FROM check_results WHERE target_id = ? ORDER BY timestamp DESC LIMIT ?",
"SELECT timestamp, duration_ms, matched FROM check_results WHERE target_id = ? ORDER BY timestamp DESC LIMIT ?",
)
.all(targetId, limit) as Array<{
timestamp: string;
duration_ms: number | null;
success: number;
matched: number;
}>;
}

View File

@@ -159,7 +159,6 @@ export interface CheckFailure {
export interface CheckResult {
targetName: string;
timestamp: string;
success: boolean;
matched: boolean;
durationMs: number | null;
statusDetail: string | null;
@@ -182,7 +181,6 @@ export interface StoredCheckResult {
id: number;
target_id: number;
timestamp: string;
success: number;
matched: number;
duration_ms: number | null;
status_detail: string | null;