diff --git a/src/server/kbn_server.js b/src/server/kbn_server.js index 921801679cd1f..e4d18a7b8afb9 100644 --- a/src/server/kbn_server.js +++ b/src/server/kbn_server.js @@ -20,6 +20,7 @@ import optimizeMixin from '../optimize'; import pluginsInitializeMixin from './plugins/initialize'; import { indexPatternsMixin } from './index_patterns'; import { savedObjectsMixin } from './saved_objects'; +import { statsMixin } from './stats'; const rootDir = fromRoot('.'); @@ -40,6 +41,9 @@ export default class KbnServer { warningsMixin, statusMixin, + // set up stats route + statsMixin, + // writes pid file pidMixin, diff --git a/src/server/stats/index.js b/src/server/stats/index.js new file mode 100644 index 0000000000000..8c76a0b6ca257 --- /dev/null +++ b/src/server/stats/index.js @@ -0,0 +1 @@ +export { statsMixin } from './stats_mixin'; diff --git a/src/server/stats/stats.js b/src/server/stats/stats.js new file mode 100644 index 0000000000000..cfef219d4c1ae --- /dev/null +++ b/src/server/stats/stats.js @@ -0,0 +1,21 @@ +import { SavedObjectsClient } from '../saved_objects/client'; + +async function getStatsForType(savedObjectsClient, type) { + const { total } = await savedObjectsClient.find({ type, perPage: 0 }); + return { total }; +} + +export async function getStats(kibanaIndex, callAdminCluster) { + const savedObjectsClient = new SavedObjectsClient(kibanaIndex, callAdminCluster); + const types = ['dashboard', 'visualization', 'search', 'index-pattern']; + const requests = types.map(type => getStatsForType(savedObjectsClient, type)); + const results = await Promise.all(requests); + const stats = {}; + + results.forEach((statsForType, index) => { + stats[types[index]] = statsForType; + }); + + stats.index = kibanaIndex; + return stats; +} diff --git a/src/server/stats/stats_mixin.js b/src/server/stats/stats_mixin.js new file mode 100644 index 0000000000000..d8ff833591083 --- /dev/null +++ b/src/server/stats/stats_mixin.js @@ -0,0 +1,19 @@ +import { getStats } from './stats'; + +export function statsMixin(kbnServer, server) { + server.route({ + method: 'GET', + path: '/api/stats', + handler: function (request, reply) { + const { callWithInternalUser } = server.plugins.elasticsearch.getCluster('admin'); + const callAdminCluster = (...args) => callWithInternalUser(...args); + + const stats = getStats( + server.config().get('kibana.index'), + callAdminCluster + ); + + return reply(stats); + } + }); +}