Files
Checkmate/server/scripts/generate-checks.js
T
Alex Holliday 0b30e23783 globalPing
2026-03-04 17:50:27 +00:00

175 lines
4.6 KiB
JavaScript

import mongoose from "mongoose";
import { MonitorModel } from "../dist/db/models/Monitor.js";
import { CheckModel } from "../dist/db/models/Check.js";
const DEFAULT_MONITOR_ID = "000000000000000000000001";
const DEFAULT_MONITOR_TYPE = "http";
const DEFAULT_TOTAL = 1_000_000;
const DEFAULT_BATCH_SIZE = 5_000;
const parseObjectId = (value, fallback) => {
try {
return new mongoose.Types.ObjectId(value || fallback);
} catch {
console.warn(`Invalid ObjectId '${value}', falling back to '${fallback}'.`);
return new mongoose.Types.ObjectId(fallback);
}
};
async function ensureMonitor({ monitorId, teamId, userId, type }) {
const existing = await MonitorModel.findById(monitorId);
if (existing) {
return existing;
}
console.log(`Monitor ${monitorId.toString()} not found, creating it.`);
const monitor = new MonitorModel({
_id: monitorId,
userId,
teamId,
name: `Seed Monitor ${monitorId.toString()}`,
description: "Synthetic monitor for performance testing",
statusWindow: [],
statusWindowSize: 5,
statusWindowThreshold: 60,
type,
ignoreTlsErrors: false,
url: "https://example.com",
isActive: true,
interval: 60000,
alertThreshold: 5,
cpuAlertThreshold: 5,
memoryAlertThreshold: 5,
diskAlertThreshold: 5,
tempAlertThreshold: 5,
selectedDisks: [],
});
await monitor.save();
return monitor;
}
async function run() {
const mongoUri = process.env.MONGO_URI ?? "mongodb://localhost:27017/uptime_db";
const monitorId = parseObjectId(process.env.MONITOR_ID ?? DEFAULT_MONITOR_ID, DEFAULT_MONITOR_ID);
const teamId = parseObjectId("6971546de1b2bc3de6498e6e");
const userId = parseObjectId("6971546de1b2bc3de6498e70");
const monitorType = process.env.MONITOR_TYPE ?? DEFAULT_MONITOR_TYPE;
const total = Number(process.env.CHECK_TOTAL ?? DEFAULT_TOTAL);
const batchSize = Number(process.env.CHECK_BATCH_SIZE ?? DEFAULT_BATCH_SIZE);
console.log(`Connecting to MongoDB at ${mongoUri}`);
await mongoose.connect(mongoUri);
await ensureMonitor({ monitorId, teamId, userId, type: monitorType });
console.log(`Seeding ${total} checks for monitor ${monitorId.toString()} (team ${teamId.toString()}) in batches of ${batchSize}.`);
const docs = [];
const startTime = Date.now();
for (let i = 0; i < total; i += 1) {
const baseTime = Date.now() - (total - i) * 1000;
const createdAt = new Date(baseTime);
docs.push({
metadata: {
monitorId,
teamId,
type: monitorType,
},
status: i % 50 !== 0,
statusCode: i % 50 !== 0 ? 200 : 500,
responseTime: Math.floor(Math.random() * 1000),
message: i % 50 !== 0 ? "OK" : "Error",
expiry: createdAt,
createdAt,
updatedAt: createdAt,
timings: {
start: baseTime,
socket: baseTime,
lookup: baseTime,
connect: baseTime,
secureConnect: baseTime,
upload: baseTime,
response: baseTime + 40,
end: baseTime + 45,
phases: {
wait: 0,
dns: 1,
tcp: 2,
tls: 4,
request: 0,
firstByte: 30,
download: 5,
total: 45,
},
},
cpu: {
physical_core: 8,
logical_core: 16,
frequency: 3600,
temperature: [50 + Math.random() * 10],
free_percent: 40,
usage_percent: Math.random() * 100,
},
memory: {
total_bytes: 32 * 1024 ** 3,
available_bytes: 16 * 1024 ** 3,
used_bytes: 16 * 1024 ** 3,
usage_percent: Math.random() * 100,
},
disk: [
{
device: "/dev/sda1",
mountpoint: "/",
read_speed_bytes: Math.random() * 10_000_000,
write_speed_bytes: Math.random() * 10_000_000,
total_bytes: 512 * 1024 ** 3,
free_bytes: 128 * 1024 ** 3,
usage_percent: Math.random() * 100,
},
],
host: {
os: "linux",
platform: "ubuntu",
kernel_version: "5.15.0",
},
net: [
{
name: "eth0",
bytes_sent: Math.random() * 10_000_000,
bytes_recv: Math.random() * 10_000_000,
packets_sent: Math.random() * 1_000_000,
packets_recv: Math.random() * 1_000_000,
err_in: 0,
err_out: 0,
drop_in: 0,
drop_out: 0,
fifo_in: 0,
fifo_out: 0,
},
],
errors: i % 50 === 0 ? [{ metric: ["uptime"], err: "500" }] : [],
});
if (docs.length === batchSize) {
await CheckModel.insertMany(docs, { ordered: false });
console.log(`Inserted ${i + 1} / ${total}`);
docs.length = 0;
}
}
if (docs.length > 0) {
await CheckModel.insertMany(docs, { ordered: false });
}
await mongoose.disconnect();
const duration = ((Date.now() - startTime) / 1000).toFixed(2);
console.log(`Finished inserting ${total} checks in ${duration}s`);
}
run().catch((error) => {
console.error("Failed to seed checks", error);
process.exit(1);
});