refactor: 移除 success 字段,简化为 matched 单层判定模型
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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}`,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}>;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user