diff --git a/src/controllers/admin/database.js b/src/controllers/admin/database.js index 060ba1501a..759002ad6e 100644 --- a/src/controllers/admin/database.js +++ b/src/controllers/admin/database.js @@ -6,26 +6,18 @@ const databaseController = module.exports; databaseController.get = async function (req, res) { const results = {}; - try { - if (nconf.get('redis')) { - const rdb = require('../../database/redis'); - results.redis = await rdb.info(rdb.client); - } - if (nconf.get('mongo')) { - const mdb = require('../../database/mongo'); - results.mongo = await mdb.info(mdb.client); - } - if (nconf.get('postgres')) { - const pdb = require('../../database/postgres'); - results.postgres = await pdb.info(pdb.pool); - } - } catch (err) { - Object.assign(results, { error: err }); - // Override mongo error with more human-readable error - if (err.name === 'MongoError' && err.codeName === 'Unauthorized') { - err.friendlyMessage = '[[admin/advanced/database:mongo.unauthorized]]'; - delete results.mongo; - } + if (nconf.get('redis')) { + const rdb = require('../../database/redis'); + results.redis = await rdb.info(rdb.client); } + if (nconf.get('mongo')) { + const mdb = require('../../database/mongo'); + results.mongo = await mdb.info(mdb.client); + } + if (nconf.get('postgres')) { + const pdb = require('../../database/postgres'); + results.postgres = await pdb.info(pdb.pool); + } + res.render('admin/advanced/database', results); }; diff --git a/src/database/mongo.js b/src/database/mongo.js index e6e5e040a9..7fe13baaaf 100644 --- a/src/database/mongo.js +++ b/src/database/mongo.js @@ -110,14 +110,29 @@ mongoModule.info = async function (db) { db = client.db(); } mongoModule.client = mongoModule.client || db; + let serverStatusError = ''; + + async function getServerStatus() { + try { + return await db.command({ serverStatus: 1 }); + } catch (err) { + serverStatusError = err.message; + // Override mongo error with more human-readable error + if (err.name === 'MongoError' && err.codeName === 'Unauthorized') { + serverStatusError = '[[admin/advanced/database:mongo.unauthorized]]'; + } + winston.error(err.stack); + } + } let [serverStatus, stats, listCollections] = await Promise.all([ - db.command({ serverStatus: 1 }), + getServerStatus(), db.command({ dbStats: 1 }), getCollectionStats(db), ]); stats = stats || {}; serverStatus = serverStatus || {}; + stats.serverStatusError = serverStatusError; const scale = 1024 * 1024 * 1024; listCollections = listCollections.map(function (collectionInfo) { @@ -132,12 +147,12 @@ mongoModule.info = async function (db) { }; }); - stats.mem = serverStatus.mem || {}; + stats.mem = serverStatus.mem || { resident: 0, virtual: 0, mapped: 0 }; stats.mem.resident = (stats.mem.resident / 1024).toFixed(3); stats.mem.virtual = (stats.mem.virtual / 1024).toFixed(3); stats.mem.mapped = (stats.mem.mapped / 1024).toFixed(3); stats.collectionData = listCollections; - stats.network = serverStatus.network || {}; + stats.network = serverStatus.network || { bytesIn: 0, bytesOut: 0, numRequests: 0 }; stats.network.bytesIn = (stats.network.bytesIn / scale).toFixed(3); stats.network.bytesOut = (stats.network.bytesOut / scale).toFixed(3); stats.network.numRequests = utils.addCommas(stats.network.numRequests); diff --git a/src/views/admin/advanced/database.tpl b/src/views/admin/advanced/database.tpl index 3d90e6813c..f63b77cb86 100644 --- a/src/views/admin/advanced/database.tpl +++ b/src/views/admin/advanced/database.tpl @@ -1,13 +1,12 @@ - -
- {error.friendlyMessage} -
- {error.errmsg} -
- +
{{{ if mongo }}}
+ {{{ if mongo.serverStatusError }}} +
+ {mongo.serverStatusError} +
+ {{{ end }}}
[[admin/advanced/database:mongo]]