test: verify backup monitoring implementation

This commit is contained in:
2026-05-11 21:57:31 +02:00
parent 322b3d1a3b
commit a748512d22
6 changed files with 21 additions and 8 deletions
@@ -1,5 +1,6 @@
from datetime import datetime from datetime import datetime
from typing import Any from typing import Any
from pydantic import BaseModel, Field, field_validator from pydantic import BaseModel, Field, field_validator
@@ -24,7 +24,10 @@ def generate_alerts_for_run(
# 2. Anomaly size alert # 2. Anomaly size alert
bytes_transferred = run.get("bytes_transferred") bytes_transferred = run.get("bytes_transferred")
if bytes_transferred is not None and previous_runs: if bytes_transferred is not None and previous_runs:
successful_runs = [r for r in previous_runs if r["status"] == "success" and r.get("bytes_transferred") is not None] successful_runs = [
r for r in previous_runs
if r["status"] == "success" and r.get("bytes_transferred") is not None
]
if len(successful_runs) >= 3: if len(successful_runs) >= 3:
sizes = [r["bytes_transferred"] for r in successful_runs[-7:]] sizes = [r["bytes_transferred"] for r in successful_runs[-7:]]
median_size = statistics.median(sizes) median_size = statistics.median(sizes)
@@ -44,7 +47,10 @@ def generate_alerts_for_run(
"run_id": run["id"], "run_id": run["id"],
"alert_type": "anomaly_size", "alert_type": "anomaly_size",
"severity": "warning", "severity": "warning",
"message": f"Backup job '{job_name}' size anomaly: {bytes_transferred} bytes (median: {median_size})", "message": (
f"Backup job '{job_name}' size anomaly: "
f"{bytes_transferred} bytes (median: {median_size})"
),
}) })
# 3. Anomaly duration alert # 3. Anomaly duration alert
@@ -60,7 +66,10 @@ def generate_alerts_for_run(
"run_id": run["id"], "run_id": run["id"],
"alert_type": "anomaly_duration", "alert_type": "anomaly_duration",
"severity": "warning", "severity": "warning",
"message": f"Backup job '{job_name}' duration anomaly: {duration_ms}ms (median: {median_duration}ms)", "message": (
f"Backup job '{job_name}' duration anomaly: "
f"{duration_ms}ms (median: {median_duration}ms)"
),
}) })
return alerts return alerts
@@ -105,7 +114,10 @@ def check_missed_schedules(
"run_id": None, "run_id": None,
"alert_type": "missed_schedule", "alert_type": "missed_schedule",
"severity": "warning", "severity": "warning",
"message": f"Backup job '{job['name']}' missed schedule: last run at {last_run_time} (expected every {interval}s)", "message": (
f"Backup job '{job['name']}' missed schedule: "
f"last run at {last_run_time} (expected every {interval}s)"
),
}) })
return alerts return alerts
+1 -1
View File
@@ -1,4 +1,4 @@
import { import type {
BackupAlert, BackupAlert,
BackupDashboardSummary, BackupDashboardSummary,
BackupJob, BackupJob,
@@ -1,5 +1,5 @@
import { Button, Chip, Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from "@mui/material"; import { Button, Chip, Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from "@mui/material";
import { BackupAlert } from "../types/backups"; import type { BackupAlert } from "../types/backups";
interface Props { interface Props {
alerts: BackupAlert[]; alerts: BackupAlert[];
+1 -1
View File
@@ -8,7 +8,7 @@ import {
TableHead, TableHead,
TableRow, TableRow,
} from "@mui/material"; } from "@mui/material";
import { BackupJob, BackupRun } from "../types/backups"; import type { BackupJob, BackupRun } from "../types/backups";
interface Props { interface Props {
jobs: BackupJob[]; jobs: BackupJob[];
+1 -1
View File
@@ -13,7 +13,7 @@ import {
TableRow, TableRow,
} from "@mui/material"; } from "@mui/material";
import { useState } from "react"; import { useState } from "react";
import { BackupRun } from "../types/backups"; import type { BackupRun } from "../types/backups";
interface Props { interface Props {
runs: BackupRun[]; runs: BackupRun[];