Skip to content

Commit e8c45e5

Browse files
authored
feat(database-collections): add uncompressed data stat field COMPASS-7691 (#7357)
* feat(database-collecttions): add uncompressed data stat field Add uncompressed data field in database and collections list. Also, update the tooltip for storage and uncompressed data size fields so that it gets easier for users to understand these fields. On branch feat/uncompressed-data-size Changes to be committed: modified: packages/compass-components/src/components/inline-definition.tsx modified: packages/databases-collections-list/src/collections.tsx modified: packages/databases-collections-list/src/databases.tsx modified: packages/databases-collections-list/src/index.spec.tsx * fix(compass-database): update storage size stat value * fix(data-service): add freeStorage command option * fix(data-service): remove unused import * feat(database-collections): add storage summary to single collection * fix(database-collections): add better test mock data * fix(compass-workspaces): missing free_storage_size in test mock method --------- Co-authored-by: Ivan Medina <[email protected]>
1 parent f3d01e0 commit e8c45e5

File tree

10 files changed

+96
-23
lines changed

10 files changed

+96
-23
lines changed

packages/compass-components/src/components/inline-definition.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* eslint-disable react/prop-types */
22
import React from 'react';
3-
import { css } from '@leafygreen-ui/emotion';
3+
import { css, cx } from '@leafygreen-ui/emotion';
44
import { Body, Tooltip } from './leafygreen';
55

66
const underline = css({
@@ -15,6 +15,10 @@ const maxWidth = css({
1515
maxWidth: '360px',
1616
});
1717

18+
const breakSpaces = css({
19+
whiteSpace: 'break-spaces',
20+
});
21+
1822
const InlineDefinition: React.FunctionComponent<
1923
React.HTMLProps<HTMLSpanElement> & {
2024
definition: React.ReactNode;
@@ -34,7 +38,7 @@ const InlineDefinition: React.FunctionComponent<
3438
}
3539
{...tooltipProps}
3640
>
37-
<Body className={maxWidth}>{definition}</Body>
41+
<Body className={cx(maxWidth, breakSpaces)}>{definition}</Body>
3842
</Tooltip>
3943
);
4044
};

packages/compass-workspaces/src/index.spec.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ describe('WorkspacesPlugin', function () {
103103
document_count: 0,
104104
index_count: 0,
105105
storage_size: 0,
106+
free_storage_size: 0,
106107
data_size: 0,
107108
index_size: 0,
108109
},

packages/data-service/src/data-service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2808,7 +2808,7 @@ class DataServiceImpl extends WithLogContext implements DataService {
28082808
const db = this._database(name, 'META');
28092809
const stats = await runCommand(
28102810
db,
2811-
{ dbStats: 1 },
2811+
{ dbStats: 1, freeStorage: 1 },
28122812
{
28132813
enableUtf8Validation: false,
28142814
...maybeOverrideReadPreference(

packages/data-service/src/instance-detail-helper.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ export type DatabaseDetails = {
8585
collection_count: number;
8686
document_count: number;
8787
storage_size: number;
88+
free_storage_size: number;
8889
data_size: number;
8990
index_count: number;
9091
index_size: number;
@@ -373,6 +374,7 @@ export function adaptDatabaseInfo(
373374
storage_size: databaseStats.storageSize ?? 0,
374375
data_size: databaseStats.dataSize ?? 0,
375376
index_size: databaseStats.indexSize ?? 0,
377+
free_storage_size: databaseStats.freeStorageSize ?? 0,
376378
};
377379
}
378380

packages/data-service/src/run-command.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,13 @@ export type DbStats = {
9696
avgObjSize: number;
9797
dataSize: number;
9898
storageSize: number;
99+
freeStorageSize?: number;
99100
numExtents: number;
100101
indexes: number;
101102
indexSize: number;
103+
indexFreeStorageSize?: number;
104+
totalSize?: number;
105+
totalFreeStorageSize?: number;
102106
scaleFactor: number;
103107
fsUsedSize: number;
104108
fsTotalSize: number;
@@ -135,7 +139,7 @@ interface RunDiagnosticsCommand {
135139
): Promise<BuildInfo>;
136140
(
137141
db: Db,
138-
spec: { dbStats: 1; scale?: number },
142+
spec: { dbStats: 1; scale?: number; freeStorage?: 1 },
139143
options?: RunCommandOptions
140144
): Promise<DbStats>;
141145
(

packages/database-model/index.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ interface DatabaseProps {
1010
collectionsStatusError: string | null;
1111
collection_count: number | undefined;
1212
document_count: number | undefined;
13+
calculated_storage_size: number | undefined;
1314
storage_size: number | undefined;
15+
free_storage_size: number | undefined;
1416
data_size: number | undefined;
1517
index_count: number | undefined;
1618
index_size: number | undefined;

packages/database-model/lib/model.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ const DatabaseModel = AmpersandModel.extend(
112112
data_size: 'number',
113113
index_count: 'number',
114114
index_size: 'number',
115+
free_storage_size: 'number',
115116
},
116117
derived: {
117118
// Either returns a collection count from database stats or from real
@@ -126,6 +127,18 @@ const DatabaseModel = AmpersandModel.extend(
126127
: this.collection_count ?? 0;
127128
},
128129
},
130+
calculated_storage_size: {
131+
deps: ['storage_size', 'free_storage_size'],
132+
fn() {
133+
if (
134+
this.storage_size === undefined ||
135+
this.free_storage_size === undefined
136+
) {
137+
return undefined;
138+
}
139+
return this.storage_size - this.free_storage_size;
140+
},
141+
},
129142
},
130143
collections: {
131144
collections: MongoDbCollectionCollection,

packages/databases-collections-list/src/collections.tsx

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -126,30 +126,50 @@ const CollectionsList: React.FunctionComponent<{
126126
: coll.type === 'timeseries'
127127
? [
128128
{
129-
label: 'Storage size',
129+
label: 'Storage',
130130
value:
131131
coll.calculated_storage_size !== undefined
132132
? compactBytes(coll.calculated_storage_size)
133133
: 'N/A',
134+
hint:
135+
coll.calculated_storage_size !== undefined &&
136+
coll.storage_size !== undefined &&
137+
coll.free_storage_size !== undefined &&
138+
'Storage Data: Disk space allocated to this collection for document storage.\n' +
139+
`Total storage: ${compactBytes(coll.storage_size)}\n` +
140+
`Free storage: ${compactBytes(coll.free_storage_size)}`,
141+
},
142+
{
143+
label: 'Uncompressed data',
144+
value:
145+
coll.document_size !== undefined
146+
? compactBytes(coll.document_size)
147+
: 'N/A',
134148
hint:
135149
coll.document_size !== undefined &&
136-
`Uncompressed data size: ${compactBytes(
137-
coll.document_size
138-
)}`,
150+
'Uncompressed Data Size: Total size of the uncompressed data held in this collection.',
139151
},
140152
]
141153
: [
142154
{
143-
label: 'Storage size',
155+
label: 'Storage',
144156
value:
145157
coll.calculated_storage_size !== undefined
146158
? compactBytes(coll.calculated_storage_size)
147159
: 'N/A',
160+
hint:
161+
coll.calculated_storage_size !== undefined &&
162+
'Storage Data: Disk space allocated to this collection for document storage.',
163+
},
164+
{
165+
label: 'Uncompressed data',
166+
value:
167+
coll.document_size !== undefined
168+
? compactBytes(coll.document_size)
169+
: 'N/A',
148170
hint:
149171
coll.document_size !== undefined &&
150-
`Uncompressed data size: ${compactBytes(
151-
coll.document_size
152-
)}`,
172+
'Uncompressed Data Size: Total size of the uncompressed data held in this collection.',
153173
},
154174
{
155175
label: 'Documents',

packages/databases-collections-list/src/databases.tsx

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,15 +74,29 @@ const DatabasesList: React.FunctionComponent<{
7474
inferredFromPrivileges={db.inferred_from_privileges}
7575
data={[
7676
{
77-
label: 'Storage size',
77+
label: 'Storage',
7878
value:
79-
enableDbAndCollStats && db.storage_size !== undefined
80-
? compactBytes(db.storage_size)
79+
enableDbAndCollStats &&
80+
db.calculated_storage_size !== undefined
81+
? compactBytes(db.calculated_storage_size)
82+
: 'N/A',
83+
hint:
84+
enableDbAndCollStats &&
85+
db.storage_size !== undefined &&
86+
db.free_storage_size !== undefined &&
87+
'Storage Data: Disk space allocated to all collections in the database for document storage.\n' +
88+
`Total storage: ${compactBytes(db.storage_size)}\n` +
89+
`Free storage: ${compactBytes(db.free_storage_size)}`,
90+
},
91+
{
92+
label: 'Uncompressed data',
93+
value:
94+
enableDbAndCollStats && db.data_size !== undefined
95+
? compactBytes(db.data_size)
8196
: 'N/A',
8297
hint:
8398
enableDbAndCollStats &&
84-
db.data_size !== undefined &&
85-
`Uncompressed data size: ${compactBytes(db.data_size)}`,
99+
'Uncompressed Data Size: Total size of the uncompressed data held in the database.',
86100
},
87101
{
88102
label: 'Collections',

packages/databases-collections-list/src/index.spec.tsx

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@ import {
1313
PreferencesProvider,
1414
} from 'compass-preferences-model/provider';
1515
import { createSandboxFromDefaultPreferences } from 'compass-preferences-model';
16+
import type { DatabaseProps } from 'mongodb-database-model';
1617

1718
function createDatabase(name) {
18-
return {
19+
const db: Partial<DatabaseProps> = {
1920
_id: name,
2021
name: name,
2122
status: 'ready' as const,
@@ -28,11 +29,18 @@ function createDatabase(name) {
2829
inferred_from_privileges: false,
2930
// dbStats
3031
document_count: 10,
31-
storage_size: 1500,
32+
storage_size: 2500,
33+
free_storage_size: 1000,
3234
data_size: 1000,
3335
index_count: 25,
3436
index_size: 100,
3537
};
38+
39+
if (db.storage_size !== undefined && db.free_storage_size !== undefined) {
40+
db.calculated_storage_size = db.storage_size - db.free_storage_size;
41+
}
42+
43+
return db;
3644
}
3745

3846
function createCollection(name, props: any = {}) {
@@ -151,8 +159,10 @@ describe('databases and collections list', function () {
151159
expect(screen.getAllByTestId('database-grid-item')).to.have.lengthOf(1);
152160
expect(screen.getByText('foo')).to.exist;
153161

154-
expect(screen.getByText(/Storage size/)).to.exist;
162+
expect(screen.getByText(/Storage/)).to.exist;
155163
expect(screen.getByText('1.50 kB')).to.exist;
164+
expect(screen.getByText(/Uncompressed data/)).to.exist;
165+
expect(screen.getByText('1.00 kB')).to.exist;
156166
expect(screen.getByText(/Collections/)).to.exist;
157167
expect(screen.getByText('35')).to.exist;
158168
expect(screen.getByText(/Indexes/)).to.exist;
@@ -249,7 +259,7 @@ describe('databases and collections list', function () {
249259
]);
250260
});
251261

252-
it('should not display statistics (except storage size) on timeseries collection card', function () {
262+
it('should not display statistics (except storage and uncompressed data size) on timeseries collection card', function () {
253263
renderCollectionsList({
254264
namespace: 'db',
255265
collections: colls,
@@ -260,7 +270,8 @@ describe('databases and collections list', function () {
260270
.getByText('bat.bat')
261271
.closest('[data-testid="collection-grid-item"]');
262272
expect(timeseriesCard).to.exist;
263-
expect(timeseriesCard).to.contain.text('Storage size:');
273+
expect(timeseriesCard).to.contain.text('Storage:');
274+
expect(timeseriesCard).to.contain.text('Uncompressed data:');
264275
expect(timeseriesCard).to.not.contain.text('Documents:');
265276
expect(timeseriesCard).to.not.contain.text('Avg. document size::');
266277
expect(timeseriesCard).to.not.contain.text('Indexes:');
@@ -278,8 +289,10 @@ describe('databases and collections list', function () {
278289
onCollectionClick: () => {},
279290
});
280291

281-
expect(screen.getByText(/Storage size/)).to.exist;
292+
expect(screen.getByText(/Storage/)).to.exist;
282293
expect(screen.getByText('1.50 kB')).to.exist;
294+
expect(screen.getByText(/Uncompressed data/)).to.exist;
295+
expect(screen.getByText('11.00 B')).to.exist;
283296
expect(screen.getByText(/Documents/)).to.exist;
284297
expect(screen.getByText('10')).to.exist;
285298
expect(screen.getByText(/Avg. document size/)).to.exist;

0 commit comments

Comments
 (0)