35 lines
1.9 KiB
JavaScript
35 lines
1.9 KiB
JavaScript
import { test } from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { createRequestMonitor } from './request-monitor.js';
|
|
import { Hono } from 'hono';
|
|
import { registerRequestMonitorRoutes } from './request-monitor.js';
|
|
|
|
test('request monitor records route latency, status errors, and current process health', async () => {
|
|
let t = 100;
|
|
const monitor = createRequestMonitor({ now: () => t, snapshotIntervalMs: 0, adapters: { media: () => ({ queued: 2 }) } });
|
|
const middleware = monitor.middleware();
|
|
const ctx = (path, status) => ({ req: { path }, res: { status } });
|
|
await middleware(ctx('/api/media/abc/status', 200), async () => { t += 8; });
|
|
await middleware(ctx('/api/media/abc/status', 404), async () => { t += 4; });
|
|
await middleware(ctx('/api/media/xyz/status', 503), async () => { t += 12; });
|
|
const sample = await monitor.sample();
|
|
assert.equal(sample.routes['/api/media/:id/status'].requests, 3);
|
|
assert.equal(sample.routes['/api/media/:id/status'].errors, 2);
|
|
assert.equal(sample.routes['/api/media/:id/status'].p50, 8);
|
|
assert.equal(sample.media.queued, 2);
|
|
assert.ok(sample.rssBytes > 0);
|
|
monitor.close();
|
|
});
|
|
|
|
test('monitor snapshot history is retained and its endpoint is admin protected', async () => {
|
|
let t = 10_000;
|
|
const monitor = createRequestMonitor({ now: () => t, snapshotIntervalMs: 0 });
|
|
await monitor.snapshot(); t += 60_000; await monitor.snapshot();
|
|
const app = new Hono();
|
|
registerRequestMonitorRoutes(app, { monitor, adminAuth: async (c,next) => c.req.header('x-admin') ? next() : c.json({ok:false},401) });
|
|
assert.equal((await app.request('/api/admin/ops/metrics')).status, 401);
|
|
const response = await app.request('/api/admin/ops/metrics', { headers: { 'x-admin': 'yes' } });
|
|
const data = await response.json(); assert.equal(data.history.length, 2); assert.ok(data.current.rssBytes > 0);
|
|
monitor.close();
|
|
});
|