bench/fix: prefix bracketed cloud bench logs with T+ timestamps
Some checks failed
CI / Test (OTP 27.2 / Elixir 1.18.2) (push) Failing after 0s
CI / Test (OTP 28.4 / Elixir 1.19.4 + E2E) (push) Failing after 0s

This commit is contained in:
2026-03-20 18:03:34 +01:00
parent f7ff3a4bd7
commit 4bd8663126

View File

@@ -470,11 +470,11 @@ function formatEuro(value) {
} }
function createPhaseLogger(prepOffsetMinutes = PHASE_PREP_OFFSET_MINUTES) { function createPhaseLogger(prepOffsetMinutes = PHASE_PREP_OFFSET_MINUTES) {
let phaseZeroMs = null; let phaseZeroMs;
const prefix = () => { const prefix = () => {
if (phaseZeroMs === null) { if (!Number.isFinite(phaseZeroMs)) {
return "T+0m"; return null;
} }
const elapsedMinutes = Math.floor((Date.now() - phaseZeroMs) / 60000); const elapsedMinutes = Math.floor((Date.now() - phaseZeroMs) / 60000);
@@ -483,6 +483,10 @@ function createPhaseLogger(prepOffsetMinutes = PHASE_PREP_OFFSET_MINUTES) {
}; };
return { return {
getPrefix() {
return prefix();
},
setPrepOffsetNow() { setPrepOffsetNow() {
phaseZeroMs = Date.now() + prepOffsetMinutes * 60_000; phaseZeroMs = Date.now() + prepOffsetMinutes * 60_000;
}, },
@@ -492,11 +496,46 @@ function createPhaseLogger(prepOffsetMinutes = PHASE_PREP_OFFSET_MINUTES) {
}, },
logPhase(message) { logPhase(message) {
console.log(`${prefix()} ${message}`); console.log(message);
}, },
}; };
} }
function installBracketedLogPrefix(getPrefix) {
const methods = ["log", "warn", "error"];
const originals = new Map();
for (const method of methods) {
const original = console[method].bind(console);
originals.set(method, original);
console[method] = (...args) => {
if (
args.length > 0
&& typeof args[0] === "string"
&& /^\s*\[[^\]]+\]/.test(args[0])
) {
const prefix = getPrefix();
if (prefix) {
original(`${prefix} ${args[0]}`, ...args.slice(1));
return;
}
}
original(...args);
};
}
return () => {
for (const method of methods) {
const original = originals.get(method);
if (original) {
console[method] = original;
}
}
};
}
function compatibleDatacenterChoices(datacenters, serverType, clientType, clientCount) { function compatibleDatacenterChoices(datacenters, serverType, clientType, clientCount) {
const compatible = []; const compatible = [];
@@ -1542,6 +1581,7 @@ async function main() {
await ensureLocalPrereqs(opts); await ensureLocalPrereqs(opts);
const phaseLogger = createPhaseLogger(); const phaseLogger = createPhaseLogger();
const restoreBracketedLogPrefix = installBracketedLogPrefix(() => phaseLogger.getPrefix());
const datacenterChoice = await chooseDatacenter(opts); const datacenterChoice = await chooseDatacenter(opts);
opts.datacenter = datacenterChoice.name; opts.datacenter = datacenterChoice.name;
@@ -1668,6 +1708,8 @@ async function main() {
}); });
sshKeyCreated = true; sshKeyCreated = true;
// Start execution clock at T+0 immediately before cloud server creation.
phaseLogger.setZeroNow();
phaseLogger.logPhase("[phase] create cloud servers in parallel"); phaseLogger.logPhase("[phase] create cloud servers in parallel");
const serverName = `${runId}-server`; const serverName = `${runId}-server`;
@@ -1738,8 +1780,6 @@ async function main() {
ip: c.server.public_net.ipv4.ip, ip: c.server.public_net.ipv4.ip,
})); }));
// Reset phase clock to T+0 when cloud servers are successfully created.
phaseLogger.setZeroNow();
phaseLogger.logPhase("[phase] wait for SSH"); phaseLogger.logPhase("[phase] wait for SSH");
await Promise.all([ await Promise.all([
waitForSsh(serverIp, keyPath), waitForSsh(serverIp, keyPath),
@@ -2236,6 +2276,7 @@ async function main() {
console.log(`[done] ssh key kept: ${keyName}`); console.log(`[done] ssh key kept: ${keyName}`);
} }
} finally { } finally {
restoreBracketedLogPrefix();
removeSignalHandlers(); removeSignalHandlers();
await cleanup(); await cleanup();
} }