feat: observe BI data source health
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
import assert from 'node:assert/strict';
|
||||
import test from 'node:test';
|
||||
import {
|
||||
clearDataSourceTelemetry,
|
||||
getDataSourceTelemetry,
|
||||
observeDataSource,
|
||||
recordDataSourceOutcome,
|
||||
} from './source-telemetry.js';
|
||||
|
||||
test('reports unobserved sources without treating them as failures', () => {
|
||||
clearDataSourceTelemetry();
|
||||
const report = getDataSourceTelemetry(new Date('2026-08-07T08:00:00Z'));
|
||||
assert.ok(report.sources.every(source => source.state === 'unobserved'));
|
||||
assert.ok(report.sources.every(source => source.failureRate === null));
|
||||
});
|
||||
|
||||
test('publishes rolling outcomes and last success/failure timestamps', () => {
|
||||
clearDataSourceTelemetry();
|
||||
recordDataSourceOutcome('oneOsMileage', true, 1_000);
|
||||
recordDataSourceOutcome('oneOsMileage', false, 2_000);
|
||||
const source = getDataSourceTelemetry().sources.find(item => item.source === 'oneOsMileage');
|
||||
assert.deepEqual(source && {
|
||||
state: source.state,
|
||||
attempts: source.attempts,
|
||||
failures: source.failures,
|
||||
failureRate: source.failureRate,
|
||||
lastSuccessAt: source.lastSuccessAt,
|
||||
lastFailureAt: source.lastFailureAt,
|
||||
}, {
|
||||
state: 'failing',
|
||||
attempts: 2,
|
||||
failures: 1,
|
||||
failureRate: 0.5,
|
||||
lastSuccessAt: '1970-01-01T00:00:01.000Z',
|
||||
lastFailureAt: '1970-01-01T00:00:02.000Z',
|
||||
});
|
||||
});
|
||||
|
||||
test('observes final operation outcomes without retaining error details', async () => {
|
||||
clearDataSourceTelemetry();
|
||||
await assert.rejects(observeDataSource('hydrogenDatabase', async () => {
|
||||
throw new Error('sensitive connection detail');
|
||||
}));
|
||||
const serialized = JSON.stringify(getDataSourceTelemetry());
|
||||
assert.equal(serialized.includes('sensitive connection detail'), false);
|
||||
});
|
||||
|
||||
test('keeps only the latest 100 outcomes', () => {
|
||||
clearDataSourceTelemetry();
|
||||
recordDataSourceOutcome('etcDatabase', false, 1);
|
||||
for (let index = 0; index < 100; index += 1) {
|
||||
recordDataSourceOutcome('etcDatabase', true, index + 2);
|
||||
}
|
||||
const source = getDataSourceTelemetry().sources.find(item => item.source === 'etcDatabase');
|
||||
assert.equal(source?.attempts, 100);
|
||||
assert.equal(source?.failures, 0);
|
||||
assert.equal(source?.failureRate, 0);
|
||||
});
|
||||
Reference in New Issue
Block a user