From 8ee296057895bdafdbd6f1fc3d48409df01cf525 Mon Sep 17 00:00:00 2001 From: Stacey Gammon Date: Tue, 16 May 2017 16:08:37 -0400 Subject: [PATCH 1/3] Simple stats api POC --- src/server/kbn_server.js | 4 ++++ src/server/stats/index.js | 1 + src/server/stats/stats.js | 25 +++++++++++++++++++++++++ src/server/stats/stats_mixin.js | 18 ++++++++++++++++++ 4 files changed, 48 insertions(+) create mode 100644 src/server/stats/index.js create mode 100644 src/server/stats/stats.js create mode 100644 src/server/stats/stats_mixin.js diff --git a/src/server/kbn_server.js b/src/server/kbn_server.js index 6ddd73aced884..1f59a61bf66f8 100644 --- a/src/server/kbn_server.js +++ b/src/server/kbn_server.js @@ -20,6 +20,7 @@ import uiSettingsMixin from '../ui/settings'; import optimizeMixin from '../optimize'; import pluginsInitializeMixin from './plugins/initialize'; import { savedObjectsMixin } from './saved_objects'; +import { statsMixin } from './stats'; const rootDir = fromRoot('.'); @@ -40,6 +41,9 @@ module.exports = 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..f7f556d78e904 --- /dev/null +++ b/src/server/stats/stats.js @@ -0,0 +1,25 @@ +import { SavedObjectsClient } from '../saved_objects/client'; + +async function getStatsForType(savedObjectsClient, type) { + const response = await savedObjectsClient.find({ type, perPage: 0 }); + return { + total: response.total + }; +} + +export async function getStats(kibanaIndex, callAdminCluster) { + const savedObjectsClient = new SavedObjectsClient(kibanaIndex, callAdminCluster); + const types = ['dashboard', 'visualization', 'search', 'index-pattern']; + const stats = {}; + + const requests = types.map(type => { + return getStatsForType(savedObjectsClient, type); + }); + const results = await Promise.all(requests); + 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..65e9e7721c5cb --- /dev/null +++ b/src/server/stats/stats_mixin.js @@ -0,0 +1,18 @@ +import { getStats } from './stats'; + +export function statsMixin(kbnServer, server) { + server.route({ + method: 'GET', + path: '/api/stats', + handler: async function (request, reply) { + const { callWithInternalUser } = server.plugins.elasticsearch.getCluster('admin'); + const callAdminCluster = (...args) => callWithInternalUser(...args); + + const stats = await getStats( + server.config().get('kibana.index'), + callAdminCluster); + + return reply(stats); + } + }); +} From b5716888ba62f41712e69c690fb9d47ef2a8f5e1 Mon Sep 17 00:00:00 2001 From: Stacey Gammon Date: Fri, 2 Jun 2017 08:43:30 -0400 Subject: [PATCH 2/3] Code review clean up --- src/server/stats/stats.js | 12 ++++-------- src/server/stats/stats_mixin.js | 3 ++- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/server/stats/stats.js b/src/server/stats/stats.js index f7f556d78e904..cfef219d4c1ae 100644 --- a/src/server/stats/stats.js +++ b/src/server/stats/stats.js @@ -1,21 +1,17 @@ import { SavedObjectsClient } from '../saved_objects/client'; async function getStatsForType(savedObjectsClient, type) { - const response = await savedObjectsClient.find({ type, perPage: 0 }); - return { - total: response.total - }; + 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 = {}; - const requests = types.map(type => { - return getStatsForType(savedObjectsClient, type); - }); - const results = await Promise.all(requests); results.forEach((statsForType, index) => { stats[types[index]] = statsForType; }); diff --git a/src/server/stats/stats_mixin.js b/src/server/stats/stats_mixin.js index 65e9e7721c5cb..6753627b4ff0e 100644 --- a/src/server/stats/stats_mixin.js +++ b/src/server/stats/stats_mixin.js @@ -10,7 +10,8 @@ export function statsMixin(kbnServer, server) { const stats = await getStats( server.config().get('kibana.index'), - callAdminCluster); + callAdminCluster + ); return reply(stats); } From 4488f1b576948ae41b899c1ac549fecbe68ba0cd Mon Sep 17 00:00:00 2001 From: Stacey Gammon Date: Fri, 9 Jun 2017 15:36:22 -0400 Subject: [PATCH 3/3] reply with promise, avoids async function --- src/server/stats/stats_mixin.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/stats/stats_mixin.js b/src/server/stats/stats_mixin.js index 6753627b4ff0e..d8ff833591083 100644 --- a/src/server/stats/stats_mixin.js +++ b/src/server/stats/stats_mixin.js @@ -4,11 +4,11 @@ export function statsMixin(kbnServer, server) { server.route({ method: 'GET', path: '/api/stats', - handler: async function (request, reply) { + handler: function (request, reply) { const { callWithInternalUser } = server.plugins.elasticsearch.getCluster('admin'); const callAdminCluster = (...args) => callWithInternalUser(...args); - const stats = await getStats( + const stats = getStats( server.config().get('kibana.index'), callAdminCluster );