Skip to content

Commit 620b5e2

Browse files
committed
MONGOSH-299 - Logging/Profiling helpers
1 parent f04774c commit 620b5e2

File tree

3 files changed

+272
-0
lines changed

3 files changed

+272
-0
lines changed

packages/i18n/src/locales/en_US.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1000,6 +1000,26 @@ const translations = {
10001000
link: 'https://docs.mongodb.com/manual/reference/method/db.disableFreeMonitoring',
10011001
description: 'returns the db disableFreeMonitoring. uses the setFreeMonitoring command',
10021002
example: 'db.disableFreeMonitoring()',
1003+
},
1004+
getProfilingStatus: {
1005+
link: 'https://docs.mongodb.com/manual/reference/method/db.getProfilingStatus',
1006+
description: 'returns the db getProfilingStatus. uses the profile command',
1007+
example: 'db.getProfilingStatus()',
1008+
},
1009+
setProfilingLevel: {
1010+
link: 'https://docs.mongodb.com/manual/reference/method/db.setProfilingLevel',
1011+
description: 'returns the db setProfilingLevel. uses the profile command',
1012+
example: 'db.setProfilingLevel(level, <options>)',
1013+
},
1014+
setLogLevel: {
1015+
link: 'https://docs.mongodb.com/manual/reference/method/db.setLogLevel',
1016+
description: 'returns the db setLogLevel. uses the setParameter command',
1017+
example: 'db.setLogLevel(logLevel, <component>)',
1018+
},
1019+
getLogComponents: {
1020+
link: 'https://docs.mongodb.com/manual/reference/method/db.getLogComponents',
1021+
description: 'returns the db getLogComponents. uses the getParameter command',
1022+
example: 'db.getLogComponents()'
10031023
}
10041024
}
10051025
}

packages/shell-api/src/database.spec.ts

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1779,6 +1779,163 @@ describe('Database', () => {
17791779
expect(catchedError).to.equal(expectedError);
17801780
});
17811781
});
1782+
1783+
describe('getProfilingStatus', () => {
1784+
it('calls serviceProvider.runCommand on the database', async() => {
1785+
serviceProvider.runCommand.resolves({ ok: 1 });
1786+
await database.getProfilingStatus();
1787+
1788+
expect(serviceProvider.runCommand).to.have.been.calledWith(
1789+
database._name,
1790+
{
1791+
profile: -1
1792+
}
1793+
);
1794+
});
1795+
1796+
it('returns whatever serviceProvider.runCommand returns', async() => {
1797+
const expectedResult = { ok: 1 };
1798+
serviceProvider.runCommand.resolves(expectedResult);
1799+
const result = await database.getProfilingStatus();
1800+
expect(result).to.deep.equal(expectedResult);
1801+
});
1802+
1803+
it('throws if serviceProvider.runCommand rejects', async() => {
1804+
const expectedError = new Error();
1805+
serviceProvider.runCommand.rejects(expectedError);
1806+
const catchedError = await database.getProfilingStatus()
1807+
.catch(e => e);
1808+
expect(catchedError).to.equal(expectedError);
1809+
});
1810+
});
1811+
1812+
describe('setProfilingLevel', () => {
1813+
it('calls serviceProvider.runCommand on the database no options', async() => {
1814+
serviceProvider.runCommand.resolves({ ok: 1 });
1815+
await database.setProfilingLevel(1);
1816+
1817+
expect(serviceProvider.runCommand).to.have.been.calledWith(
1818+
database._name,
1819+
{
1820+
profile: 1
1821+
}
1822+
);
1823+
});
1824+
1825+
it('calls serviceProvider.runCommand on the database w number options', async() => {
1826+
serviceProvider.runCommand.resolves({ ok: 1 });
1827+
await database.setProfilingLevel(1, 100);
1828+
1829+
expect(serviceProvider.runCommand).to.have.been.calledWith(
1830+
database._name,
1831+
{
1832+
profile: 1,
1833+
slowms: 100
1834+
}
1835+
);
1836+
});
1837+
1838+
it('calls serviceProvider.runCommand on the database w doc options', async() => {
1839+
serviceProvider.runCommand.resolves({ ok: 1 });
1840+
await database.setProfilingLevel(1, { slowms: 100, sampleRate: 0.5 });
1841+
1842+
expect(serviceProvider.runCommand).to.have.been.calledWith(
1843+
database._name,
1844+
{
1845+
profile: 1,
1846+
slowms: 100,
1847+
sampleRate: 0.5
1848+
}
1849+
);
1850+
});
1851+
1852+
it('returns whatever serviceProvider.runCommand returns', async() => {
1853+
const expectedResult = { ok: 1 };
1854+
serviceProvider.runCommand.resolves(expectedResult);
1855+
const result = await database.setProfilingLevel(1);
1856+
expect(result).to.deep.equal(expectedResult);
1857+
});
1858+
1859+
it('throws if serviceProvider.runCommand rejects', async() => {
1860+
const expectedError = new Error();
1861+
serviceProvider.runCommand.rejects(expectedError);
1862+
const catchedError = await database.setProfilingLevel(1)
1863+
.catch(e => e);
1864+
expect(catchedError).to.equal(expectedError);
1865+
});
1866+
});
1867+
1868+
describe('setLogLevel', () => {
1869+
it('calls serviceProvider.runCommand on the database with no component', async() => {
1870+
serviceProvider.runCommand.resolves({ ok: 1 });
1871+
await database.setLogLevel(2);
1872+
1873+
expect(serviceProvider.runCommand).to.have.been.calledWith(
1874+
ADMIN_DB,
1875+
{
1876+
setParameter: 1,
1877+
logComponentVerbosity: { verbosity: 2 }
1878+
}
1879+
);
1880+
});
1881+
it('calls serviceProvider.runCommand on the database with string component', async() => {
1882+
serviceProvider.runCommand.resolves({ ok: 1 });
1883+
await database.setLogLevel(2, 'a.b.c');
1884+
1885+
expect(serviceProvider.runCommand).to.have.been.calledWith(
1886+
ADMIN_DB,
1887+
{
1888+
setParameter: 1,
1889+
logComponentVerbosity: { a: { b: { c: { verbosity: 2 } } } }
1890+
}
1891+
);
1892+
});
1893+
1894+
it('returns whatever serviceProvider.runCommand returns', async() => {
1895+
const expectedResult = { ok: 1 };
1896+
serviceProvider.runCommand.resolves(expectedResult);
1897+
const result = await database.setLogLevel(2);
1898+
expect(result).to.deep.equal(expectedResult);
1899+
});
1900+
1901+
it('throws if serviceProvider.runCommand rejects', async() => {
1902+
const expectedError = new Error();
1903+
serviceProvider.runCommand.rejects(expectedError);
1904+
const catchedError = await database.setLogLevel(2)
1905+
.catch(e => e);
1906+
expect(catchedError).to.equal(expectedError);
1907+
});
1908+
});
1909+
1910+
describe('getLogComponents', () => {
1911+
it('calls serviceProvider.runCommand on the database with options', async() => {
1912+
serviceProvider.runCommand.resolves({ ok: 1 });
1913+
await database.getLogComponents();
1914+
1915+
expect(serviceProvider.runCommand).to.have.been.calledWith(
1916+
ADMIN_DB,
1917+
{
1918+
getParameter: 1,
1919+
logComponentVerbosity: 1
1920+
}
1921+
);
1922+
});
1923+
1924+
it('returns whatever serviceProvider.runCommand returns', async() => {
1925+
const expectedResult = { ok: 1, logComponentVerbosity: 100 };
1926+
serviceProvider.runCommand.resolves(expectedResult);
1927+
const result = await database.getLogComponents();
1928+
expect(result).to.deep.equal(100);
1929+
});
1930+
1931+
it('throws if serviceProvider.runCommand rejects', async() => {
1932+
const expectedError = new Error();
1933+
serviceProvider.runCommand.rejects(expectedError);
1934+
const catchedError = await database.getLogComponents()
1935+
.catch(e => e);
1936+
expect(catchedError).to.equal(expectedError);
1937+
});
1938+
});
17821939
});
17831940
});
17841941

packages/shell-api/src/database.ts

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -822,4 +822,99 @@ export default class Database extends ShellApiClass {
822822
}
823823
return result;
824824
}
825+
826+
@returnsPromise
827+
async getProfilingStatus(): Promise<any> {
828+
this._emitDatabaseApiCall('getProfilingStatus', {});
829+
const result = await this._mongo._serviceProvider.runCommand(
830+
this._name,
831+
{
832+
profile: -1,
833+
}
834+
);
835+
if (!result || !result.ok) {
836+
throw new MongoshRuntimeError(`Error running command profile ${result ? result.errmsg || '' : ''}`);
837+
}
838+
return result;
839+
}
840+
841+
@returnsPromise
842+
async setProfilingLevel(level: number, opts: any = {}): Promise<any> {
843+
assertArgsDefined(level);
844+
if (level < 0 || level > 2) {
845+
throw new MongoshInvalidInputError(`Input level ${level} is out of range [0..2]`);
846+
}
847+
if (typeof opts === 'number') {
848+
opts = { slowms: opts };
849+
}
850+
this._emitDatabaseApiCall('setProfilingLevel', { opts: opts });
851+
const result = await this._mongo._serviceProvider.runCommand(
852+
this._name,
853+
{
854+
profile: level,
855+
...opts
856+
}
857+
);
858+
if (!result || !result.ok) {
859+
throw new MongoshRuntimeError(`Error running command profile ${result ? result.errmsg || '' : ''}`);
860+
}
861+
return result;
862+
}
863+
864+
@returnsPromise
865+
async setLogLevel(logLevel: number, component?: any): Promise<any> {
866+
assertArgsDefined(logLevel);
867+
this._emitDatabaseApiCall('setLogLevel', { logLevel: logLevel, component: component });
868+
let componentNames = [];
869+
if (typeof component === 'string') {
870+
componentNames = component.split('.');
871+
} else if (component !== undefined) {
872+
throw new MongoshInvalidInputError(`setLogLevel component must be a string: got ${typeof component}`);
873+
}
874+
let vDoc = { verbosity: logLevel };
875+
876+
// nest vDoc
877+
for (let key, obj; componentNames.length > 0;) {
878+
obj = {};
879+
key = componentNames.pop();
880+
obj[key] = vDoc;
881+
vDoc = obj;
882+
}
883+
884+
const cmdObj = { setParameter: 1, logComponentVerbosity: vDoc };
885+
886+
// TODO: when we implement sessions
887+
// if (driverSession._isExplicit || !jsTest.options().disableImplicitSessions) {
888+
// cmdObj = driverSession._serverSession.injectSessionId(cmdObj);
889+
// }
890+
891+
const result = await this._mongo._serviceProvider.runCommand(
892+
ADMIN_DB,
893+
cmdObj
894+
);
895+
if (!result || !result.ok) {
896+
throw new MongoshRuntimeError(`Error running command setParameter ${result ? result.errmsg || '' : ''}`);
897+
}
898+
return result;
899+
}
900+
901+
@returnsPromise
902+
async getLogComponents(): Promise<any> {
903+
this._emitDatabaseApiCall('getLogComponents', {});
904+
const cmdObj = { getParameter: 1, logComponentVerbosity: 1 };
905+
906+
// TODO: when we implement sessions
907+
// if (driverSession._isExplicit || !jsTest.options().disableImplicitSessions) {
908+
// cmdObj = driverSession._serverSession.injectSessionId(cmdObj);
909+
// }
910+
911+
const result = await this._mongo._serviceProvider.runCommand(
912+
ADMIN_DB,
913+
cmdObj
914+
);
915+
if (!result || !result.ok) {
916+
throw new MongoshRuntimeError(`Error running command ${result ? result.errmsg || '' : ''}`);
917+
}
918+
return result.logComponentVerbosity;
919+
}
825920
}

0 commit comments

Comments
 (0)