Skip to content
Merged
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* eslint-disable react/prop-types */
import React from 'react';
import { css } from '@leafygreen-ui/emotion';
import { css, cx } from '@leafygreen-ui/emotion';
import { Body, Tooltip } from './leafygreen';

const underline = css({
Expand All @@ -15,6 +15,10 @@ const maxWidth = css({
maxWidth: '360px',
});

const breakSpaces = css({
whiteSpace: 'break-spaces',
});

const InlineDefinition: React.FunctionComponent<
React.HTMLProps<HTMLSpanElement> & {
definition: React.ReactNode;
Expand All @@ -34,7 +38,7 @@ const InlineDefinition: React.FunctionComponent<
}
{...tooltipProps}
>
<Body className={maxWidth}>{definition}</Body>
<Body className={cx(maxWidth, breakSpaces)}>{definition}</Body>
</Tooltip>
);
};
Expand Down
2 changes: 1 addition & 1 deletion packages/data-service/src/data-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2808,7 +2808,7 @@ class DataServiceImpl extends WithLogContext implements DataService {
const db = this._database(name, 'META');
const stats = await runCommand(
db,
{ dbStats: 1 },
{ dbStats: 1, freeStorage: 1 },
{
enableUtf8Validation: false,
...maybeOverrideReadPreference(
Expand Down
2 changes: 2 additions & 0 deletions packages/data-service/src/instance-detail-helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ export type DatabaseDetails = {
collection_count: number;
document_count: number;
storage_size: number;
free_storage_size: number;
data_size: number;
index_count: number;
index_size: number;
Expand Down Expand Up @@ -373,6 +374,7 @@ export function adaptDatabaseInfo(
storage_size: databaseStats.storageSize ?? 0,
data_size: databaseStats.dataSize ?? 0,
index_size: databaseStats.indexSize ?? 0,
free_storage_size: databaseStats.freeStorageSize ?? 0,
};
}

Expand Down
6 changes: 5 additions & 1 deletion packages/data-service/src/run-command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,9 +96,13 @@ export type DbStats = {
avgObjSize: number;
dataSize: number;
storageSize: number;
freeStorageSize?: number;
numExtents: number;
indexes: number;
indexSize: number;
indexFreeStorageSize?: number;
totalSize?: number;
totalFreeStorageSize?: number;
scaleFactor: number;
fsUsedSize: number;
fsTotalSize: number;
Expand Down Expand Up @@ -135,7 +139,7 @@ interface RunDiagnosticsCommand {
): Promise<BuildInfo>;
(
db: Db,
spec: { dbStats: 1; scale?: number },
spec: { dbStats: 1; scale?: number; freeStorage?: 1 },
options?: RunCommandOptions
): Promise<DbStats>;
(
Expand Down
2 changes: 2 additions & 0 deletions packages/database-model/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ interface DatabaseProps {
collectionsStatusError: string | null;
collection_count: number | undefined;
document_count: number | undefined;
calculated_storage_size: number | undefined;
storage_size: number | undefined;
free_storage_size: number | undefined;
data_size: number | undefined;
index_count: number | undefined;
index_size: number | undefined;
Expand Down
13 changes: 13 additions & 0 deletions packages/database-model/lib/model.js
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ const DatabaseModel = AmpersandModel.extend(
data_size: 'number',
index_count: 'number',
index_size: 'number',
free_storage_size: 'number',
},
derived: {
// Either returns a collection count from database stats or from real
Expand All @@ -126,6 +127,18 @@ const DatabaseModel = AmpersandModel.extend(
: this.collection_count ?? 0;
},
},
calculated_storage_size: {
deps: ['storage_size', 'free_storage_size'],
fn() {
if (
this.storage_size === undefined ||
this.free_storage_size === undefined
) {
return undefined;
}
return this.storage_size - this.free_storage_size;
},
},
},
collections: {
collections: MongoDbCollectionCollection,
Expand Down
32 changes: 24 additions & 8 deletions packages/databases-collections-list/src/collections.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -126,30 +126,46 @@ const CollectionsList: React.FunctionComponent<{
: coll.type === 'timeseries'
? [
{
label: 'Storage size',
label: 'Storage',
value:
coll.calculated_storage_size !== undefined
? compactBytes(coll.calculated_storage_size)
: 'N/A',
hint:
coll.calculated_storage_size !== undefined &&
'Storage Data: Disk space allocated to this collection for document storage.',
},
{
label: 'Uncompressed data',
value:
coll.document_size !== undefined
? compactBytes(coll.document_size)
: 'N/A',
hint:
coll.document_size !== undefined &&
`Uncompressed data size: ${compactBytes(
coll.document_size
)}`,
'Uncompressed Data Size: Total size of the uncompressed data held in this collection.',
},
]
: [
{
label: 'Storage size',
label: 'Storage',
value:
coll.calculated_storage_size !== undefined
? compactBytes(coll.calculated_storage_size)
: 'N/A',
hint:
coll.calculated_storage_size !== undefined &&
'Storage Data: Disk space allocated to this collection for document storage.',
},
{
label: 'Uncompressed data',
value:
coll.document_size !== undefined
? compactBytes(coll.document_size)
: 'N/A',
hint:
coll.document_size !== undefined &&
`Uncompressed data size: ${compactBytes(
coll.document_size
)}`,
'Uncompressed Data Size: Total size of the uncompressed data held in this collection.',
},
{
label: 'Documents',
Expand Down
24 changes: 19 additions & 5 deletions packages/databases-collections-list/src/databases.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -74,15 +74,29 @@ const DatabasesList: React.FunctionComponent<{
inferredFromPrivileges={db.inferred_from_privileges}
data={[
{
label: 'Storage size',
label: 'Storage',
value:
enableDbAndCollStats && db.storage_size !== undefined
? compactBytes(db.storage_size)
enableDbAndCollStats &&
db.calculated_storage_size !== undefined
? compactBytes(db.calculated_storage_size)
: 'N/A',
hint:
enableDbAndCollStats &&
db.storage_size !== undefined &&
db.free_storage_size !== undefined &&
'Storage Data: Disk space allocated to all collections in the database for document storage.\n' +
`Total storage: ${compactBytes(db.storage_size)}\n` +
`Free storage: ${compactBytes(db.free_storage_size)}`,
},
{
label: 'Uncompressed data',
value:
enableDbAndCollStats && db.data_size !== undefined
? compactBytes(db.data_size)
: 'N/A',
hint:
enableDbAndCollStats &&
db.data_size !== undefined &&
`Uncompressed data size: ${compactBytes(db.data_size)}`,
'Uncompressed Data Size: Total size of the uncompressed data held in the database.',
},
{
label: 'Collections',
Expand Down
15 changes: 11 additions & 4 deletions packages/databases-collections-list/src/index.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ function createDatabase(name) {
// dbStats
document_count: 10,
storage_size: 1500,
free_storage_size: 0,
calculated_storage_size: 1500,
data_size: 1000,
index_count: 25,
index_size: 100,
Expand Down Expand Up @@ -151,8 +153,10 @@ describe('databases and collections list', function () {
expect(screen.getAllByTestId('database-grid-item')).to.have.lengthOf(1);
expect(screen.getByText('foo')).to.exist;

expect(screen.getByText(/Storage size/)).to.exist;
expect(screen.getByText(/Storage/)).to.exist;
expect(screen.getByText('1.50 kB')).to.exist;
expect(screen.getByText(/Uncompressed data/)).to.exist;
expect(screen.getByText('1.00 kB')).to.exist;
expect(screen.getByText(/Collections/)).to.exist;
expect(screen.getByText('35')).to.exist;
expect(screen.getByText(/Indexes/)).to.exist;
Expand Down Expand Up @@ -249,7 +253,7 @@ describe('databases and collections list', function () {
]);
});

it('should not display statistics (except storage size) on timeseries collection card', function () {
it('should not display statistics (except storage and uncompressed data size) on timeseries collection card', function () {
renderCollectionsList({
namespace: 'db',
collections: colls,
Expand All @@ -260,7 +264,8 @@ describe('databases and collections list', function () {
.getByText('bat.bat')
.closest('[data-testid="collection-grid-item"]');
expect(timeseriesCard).to.exist;
expect(timeseriesCard).to.contain.text('Storage size:');
expect(timeseriesCard).to.contain.text('Storage:');
expect(timeseriesCard).to.contain.text('Uncompressed data:');
expect(timeseriesCard).to.not.contain.text('Documents:');
expect(timeseriesCard).to.not.contain.text('Avg. document size::');
expect(timeseriesCard).to.not.contain.text('Indexes:');
Expand All @@ -278,8 +283,10 @@ describe('databases and collections list', function () {
onCollectionClick: () => {},
});

expect(screen.getByText(/Storage size/)).to.exist;
expect(screen.getByText(/Storage/)).to.exist;
expect(screen.getByText('1.50 kB')).to.exist;
expect(screen.getByText(/Uncompressed data/)).to.exist;
expect(screen.getByText('11.00 B')).to.exist;
expect(screen.getByText(/Documents/)).to.exist;
expect(screen.getByText('10')).to.exist;
expect(screen.getByText(/Avg. document size/)).to.exist;
Expand Down
Loading