openvibers/openvibe.blog Commits
Blog: telemetry flushes each minute and keeps 14 days (#54)
Changes
@@@ -34,8 +34,8 @@ async function start() {ctx.outbox.start();ctx.worker.start();// The request collector aggregates in memory and has no timer of its own (openvibe-sdk 0.46 createHttpTelemetry):-- // this tick writes each 15-second interval's samples; the stop clears it and flushes once more.-- ctx.telemetryTick = setInterval(() => { ctx.telemetry.flush().catch(() => {}); }, 15_000);++ // this tick writes each minute's samples; the stop clears it and flushes once more.++ ctx.telemetryTick = setInterval(() => { ctx.telemetry.flush().catch(() => {}); }, 60_000);ctx.telemetryTick.unref();// The network changelog and patch notes run where the worker runs (one process).if (config.worker.enabled) ctx.changelog.start();@@@ -9,7 +9,7 @@* objects attached to published posts still exist; gone → the explicit* broken-asset state; an outage changes nothing (check_failed)* telemetry retention openvibe-sdk/telemetry startTelemetryRetention(): a minute after start, then once a day,-- * telemetry_samples rows older than 30 days are deleted (a redeploy never pushes it a day out)++ * telemetry_samples rows older than 14 days are deleted (a redeploy never pushes it a day out)*/const { pruneTelemetry, startTelemetryRetention } = require('openvibe-sdk/telemetry');@@@ -46,7 +46,7 @@ function createWorker({ config, store, posts, media, outbox, log = console }) {}async function pruneSamples() {-- try { return await pruneTelemetry({ db: store.db }); } catch (err) { log.warn('[Blog] telemetry retention failed:', err.message); return null; }++ try { return await pruneTelemetry({ db: store.db, olderThanDays: 14 }); } catch (err) { log.warn('[Blog] telemetry retention failed:', err.message); return null; }}return {@@@ -61,7 +61,7 @@ function createWorker({ config, store, posts, media, outbox, log = console }) {mediaTimer = setInterval(() => verifyMedia().catch((err) => log.warn('[Blog] media verification failed:', err.message)), config.media.verifyIntervalMs);mediaTimer.unref();}-- retention = startTelemetryRetention({ db: store.db, log });++ retention = startTelemetryRetention({ db: store.db, log, olderThanDays: 14 });setTimeout(scheduleTick, 1000).unref();},async stop() { clearInterval(scheduleTimer); clearInterval(mediaTimer); if (retention) await retention.stop(); },@@@ -46,10 +46,10 @@ const read = (p) => fs.readFileSync(path.join(__dirname, '..', p), 'utf8');assert.deepStrictEqual(requests(), []);});-- await check('the worker retention drops telemetry_samples rows older than 30 days and keeps newer ones', async () => {++ await check('the worker retention drops telemetry_samples rows older than 14 days and keeps newer ones', async () => {const db = t.ctx.store.db;const insert = (days) => db.query(`INSERT INTO telemetry_samples (at, service, operation) VALUES (now() - make_interval(days => $1), 'blog', 'http.request')`, [days]);-- await insert(45);++ await insert(20);await insert(1);assert.strictEqual(await t.ctx.worker.pruneSamples(), 1);const left = await db.query('SELECT count(*)::int AS n FROM telemetry_samples');
@@ -34,8 +34,8 @@ async function start() {
@@ -34,8 +34,8 @@ async function start() {
ctx.outbox.start();
ctx.outbox.start();
ctx.worker.start();
ctx.worker.start();
// The request collector aggregates in memory and has no timer of its own (openvibe-sdk 0.46 createHttpTelemetry):
// The request collector aggregates in memory and has no timer of its own (openvibe-sdk 0.46 createHttpTelemetry):
- // this tick writes each 15-second interval's samples; the stop clears it and flushes once more.
- ctx.telemetryTick = setInterval(() => { ctx.telemetry.flush().catch(() => {}); }, 15_000);
+ // this tick writes each minute's samples; the stop clears it and flushes once more.
+ ctx.telemetryTick = setInterval(() => { ctx.telemetry.flush().catch(() => {}); }, 60_000);
ctx.telemetryTick.unref();
ctx.telemetryTick.unref();
// The network changelog and patch notes run where the worker runs (one process).
// The network changelog and patch notes run where the worker runs (one process).
if (config.worker.enabled) ctx.changelog.start();
if (config.worker.enabled) ctx.changelog.start();
@@ -9,7 +9,7 @@
@@ -9,7 +9,7 @@
* objects attached to published posts still exist; gone → the explicit
* objects attached to published posts still exist; gone → the explicit
* broken-asset state; an outage changes nothing (check_failed)
* broken-asset state; an outage changes nothing (check_failed)
* telemetry retention openvibe-sdk/telemetry startTelemetryRetention(): a minute after start, then once a day,
* telemetry retention openvibe-sdk/telemetry startTelemetryRetention(): a minute after start, then once a day,
- * telemetry_samples rows older than 30 days are deleted (a redeploy never pushes it a day out)
+ * telemetry_samples rows older than 14 days are deleted (a redeploy never pushes it a day out)
*/
*/
const { pruneTelemetry, startTelemetryRetention } = require('openvibe-sdk/telemetry');
const { pruneTelemetry, startTelemetryRetention } = require('openvibe-sdk/telemetry');
@@ -46,7 +46,7 @@ function createWorker({ config, store, posts, media, outbox, log = console }) {
@@ -46,7 +46,7 @@ function createWorker({ config, store, posts, media, outbox, log = console }) {
}
}
async function pruneSamples() {
async function pruneSamples() {
- try { return await pruneTelemetry({ db: store.db }); } catch (err) { log.warn('[Blog] telemetry retention failed:', err.message); return null; }
+ try { return await pruneTelemetry({ db: store.db, olderThanDays: 14 }); } catch (err) { log.warn('[Blog] telemetry retention failed:', err.message); return null; }
}
}
return {
return {
@@ -61,7 +61,7 @@ function createWorker({ config, store, posts, media, outbox, log = console }) {
@@ -61,7 +61,7 @@ function createWorker({ config, store, posts, media, outbox, log = console }) {
mediaTimer = setInterval(() => verifyMedia().catch((err) => log.warn('[Blog] media verification failed:', err.message)), config.media.verifyIntervalMs);
mediaTimer = setInterval(() => verifyMedia().catch((err) => log.warn('[Blog] media verification failed:', err.message)), config.media.verifyIntervalMs);
mediaTimer.unref();
mediaTimer.unref();
}
}
- retention = startTelemetryRetention({ db: store.db, log });
+ retention = startTelemetryRetention({ db: store.db, log, olderThanDays: 14 });
setTimeout(scheduleTick, 1000).unref();
setTimeout(scheduleTick, 1000).unref();
},
},
async stop() { clearInterval(scheduleTimer); clearInterval(mediaTimer); if (retention) await retention.stop(); },
async stop() { clearInterval(scheduleTimer); clearInterval(mediaTimer); if (retention) await retention.stop(); },
@@ -46,10 +46,10 @@ const read = (p) => fs.readFileSync(path.join(__dirname, '..', p), 'utf8');
@@ -46,10 +46,10 @@ const read = (p) => fs.readFileSync(path.join(__dirname, '..', p), 'utf8');
assert.deepStrictEqual(requests(), []);
assert.deepStrictEqual(requests(), []);
});
});
- await check('the worker retention drops telemetry_samples rows older than 30 days and keeps newer ones', async () => {
+ await check('the worker retention drops telemetry_samples rows older than 14 days and keeps newer ones', async () => {
const db = t.ctx.store.db;
const db = t.ctx.store.db;
const insert = (days) => db.query(`INSERT INTO telemetry_samples (at, service, operation) VALUES (now() - make_interval(days => $1), 'blog', 'http.request')`, [days]);
const insert = (days) => db.query(`INSERT INTO telemetry_samples (at, service, operation) VALUES (now() - make_interval(days => $1), 'blog', 'http.request')`, [days]);
- await insert(45);
+ await insert(20);
await insert(1);
await insert(1);
assert.strictEqual(await t.ctx.worker.pruneSamples(), 1);
assert.strictEqual(await t.ctx.worker.pruneSamples(), 1);
const left = await db.query('SELECT count(*)::int AS n FROM telemetry_samples');
const left = await db.query('SELECT count(*)::int AS n FROM telemetry_samples');