Merge pull request #3713 from Rabson/fix/diagnostics-totalsize-undefined

fix: (diagnostics) derive Mongo totalSize when dbStats omits it (Atlas shared tier)
This commit is contained in:
Alexander Holliday authored and GitHub committed 2026-06-09 09:09:47 -07:00
commit 0fb210e9e1
2 files changed
+40 -4

No files matched your search

@@ -87,9 +87,9 @@ export class DiagnosticService implements IDiagnosticService {
const entry: CollectionDiagnostics = {
name: collection.collectionName,
documentCount,
storageSize: stats.storageSize,
totalIndexSize: stats.totalIndexSize,
totalSize: stats.totalSize,
storageSize: stats.storageSize ?? 0,
totalIndexSize: stats.totalIndexSize ?? 0,
totalSize: stats.totalSize ?? (stats.storageSize ?? 0) + (stats.totalIndexSize ?? 0),
};
if (stats.timeseries?.bucketCount !== undefined) {
entry.bucketCount = stats.timeseries.bucketCount;
@@ -103,7 +103,7 @@ export class DiagnosticService implements IDiagnosticService {
host: mongo.connection.host,
port: mongo.connection.port,
dbName: mongo.connection.name,
totalSize: dbStats.totalSize,
totalSize: dbStats.totalSize ?? (dbStats.storageSize ?? 0) + (dbStats.indexSize ?? 0),
collections,
};
};
@@ -147,6 +147,42 @@ describe("DiagnosticService", () => {
});
});
it("derives mongoStats.totalSize from storageSize + indexSize when the server omits it (e.g. Atlas shared tier)", async () => {
const db = makeDb({
collections: [{ collectionName: "monitors" }],
dbStats: { storageSize: 376832, indexSize: 1155072 },
});
const service = new DiagnosticService(db);
const promise = service.getSystemStats();
jest.advanceTimersByTime(1000);
await jest.advanceTimersByTimeAsync(10);
const result = await promise;
expect(result.mongoStats.totalSize).toBe(376832 + 1155072);
expect(Number.isFinite(result.mongoStats.totalSize)).toBe(true);
});
it("derives collection totalSize and defaults missing size fields to 0 when collStats omits them", async () => {
const db = makeDb({
collections: [{ collectionName: "checks" }],
collStats: { storageSize: 200 },
});
const service = new DiagnosticService(db);
const promise = service.getSystemStats();
jest.advanceTimersByTime(1000);
await jest.advanceTimersByTimeAsync(10);
const result = await promise;
const coll = result.mongoStats.collections[0];
expect(coll).toMatchObject({
name: "checks",
storageSize: 200,
totalIndexSize: 0,
totalSize: 200, // storageSize (200) + totalIndexSize (0)
});
expect(Number.isFinite(coll?.totalSize)).toBe(true);
});
it("includes bucketCount on timeseries collections, omits it elsewhere", async () => {
const db = makeDb({
collections: [{ collectionName: "checks" }],