@spalger/kibana
Version:
Kibana is an open source (Apache Licensed), browser based analytics and search dashboard for Elasticsearch. Kibana is a snap to setup and start using. Kibana strives to be easy to get started with, while also being flexible and powerful, just like Elastic
96 lines (76 loc) • 2.72 kB
JavaScript
var _ = require('lodash');
var Promise = require('bluebird');
var elasticsearch = require('elasticsearch');
var exposeClient = require('./expose_client');
var migrateConfig = require('./migrate_config');
var createKibanaIndex = require('./create_kibana_index');
var checkEsVersion = require('./check_es_version');
var NoConnections = elasticsearch.errors.NoConnections;
var util = require('util');
var format = util.format;
module.exports = function (plugin, server) {
var config = server.config();
var client = server.plugins.elasticsearch.client;
plugin.status.yellow('Waiting for Elasticsearch');
function waitForPong() {
return client.ping({ requestTimeout: 1500 }).catch(function (err) {
if (!(err instanceof NoConnections)) throw err;
plugin.status.red(format('Unable to connect to Elasticsearch at %s. Retrying in 2.5 seconds.', config.get('elasticsearch.url')));
return Promise.delay(2500).then(waitForPong);
});
}
function waitForShards() {
return client.cluster.health({
timeout: '5s', // tells es to not sit around and wait forever
index: config.get('kibana.index')
})
.then(function (resp) {
// if "timed_out" === true then elasticsearch could not
// find any idices matching our filter within 5 seconds
if (resp.timed_out) {
plugin.status.yellow('No existing Kibana index found');
return createKibanaIndex(server);
}
// If status === "red" that means that index(es) were found
// but the shards are not ready for queries
if (resp.status === 'red') {
plugin.status.red('Elasticsearch is still initializing the kibana index... Trying again in 2.5 second.');
return Promise.delay(2500).then(waitForShards);
}
// otherwise we are g2g
plugin.status.green('Kibana index ready');
});
}
function check() {
return waitForPong()
.then(_.partial(checkEsVersion, server, plugin))
.then(waitForShards)
.then(_.partial(migrateConfig, server))
.catch(_.bindKey(server, 'log', 'error'));
}
var timeoutId = null;
function scheduleCheck(ms) {
if (timeoutId) return;
var myId = setTimeout(function () {
check().finally(function () {
if (timeoutId === myId) startorRestartChecking();
});
}, ms);
timeoutId = myId;
}
function startorRestartChecking() {
scheduleCheck(stopChecking() ? 2500 : 1);
}
function stopChecking() {
if (!timeoutId) return false;
clearTimeout(timeoutId);
timeoutId = null;
return true;
}
return {
run: check,
start: startorRestartChecking,
stop: stopChecking,
isRunning: function () { return !!timeoutId; },
};
};