#!/usr/bin/env node // Compare local /api/version latency with request monitoring enabled and disabled. // Start two otherwise identical server instances and set OPS_BASE_URL/OPS_ENABLED_URL. const urls = { disabled: process.env.OPS_BASE_URL, enabled: process.env.OPS_ENABLED_URL }; if (!urls.disabled || !urls.enabled) { console.error('Set OPS_BASE_URL and OPS_ENABLED_URL to local server URLs.'); process.exit(2); } const samples = { disabled: [], enabled: [] }; async function request(url) { const start = performance.now(); const response = await fetch(`${url}/api/version`); await response.arrayBuffer(); if (!response.ok) throw new Error(`${url} returned HTTP ${response.status}`); return performance.now() - start; } for (const key of Object.keys(urls)) for (let i = 0; i < 30; i++) await request(urls[key]); for (let i = 0; i < 500; i++) { for (const key of i % 2 ? ['enabled', 'disabled'] : ['disabled', 'enabled']) samples[key].push(await request(urls[key])); } const percentile = (values, p) => [...values].sort((a, b) => a - b)[Math.ceil(values.length * p) - 1]; const result = Object.fromEntries(Object.entries(samples).map(([key, values]) => [key, { requests: values.length, p50Ms: Number(percentile(values, .5).toFixed(3)), p95Ms: Number(percentile(values, .95).toFixed(3)), meanMs: Number((values.reduce((a, b) => a + b, 0) / values.length).toFixed(3)), }])); console.log(JSON.stringify({ route: '/api/version', pairs: samples.disabled.length, result, meanDeltaPercent: Number(((result.enabled.meanMs / result.disabled.meanMs - 1) * 100).toFixed(2)) }, null, 2));