UNPKG

kibana-with-account

Version:

kibana-with-account is develop based kibana project

88 lines (72 loc) 2.76 kB
define(function (require) { const _ = require('lodash'); const moment = require('moment'); // gets parsed value if given arg is a moment object function timeValue(val) { return moment.isMoment(val) ? val.valueOf() : val; } // returns a properly formatted millisecond timestamp index constraint function msConstraint(comparison, value) { return { [comparison]: timeValue(value), format: 'epoch_millis' }; } // returns a new object with any indexes removed that do not include the // time field // // fixme: this really seems like a bug that needs to be fixed in // elasticsearch itself, but this workaround will do for now function omitIndicesWithoutTimeField(indices, timeFieldName) { return _.pick(indices, index => index.fields[timeFieldName]); } return function CalculateIndicesFactory(Promise, es) { // Uses the field stats api to determine the names of indices that need to // be queried against that match the given pattern and fall within the // given time range function calculateIndices(pattern, timeFieldName, start, stop, sortDirection) { return getFieldStats(pattern, timeFieldName, start, stop) .then(resp => omitIndicesWithoutTimeField(resp.indices, timeFieldName)) .then(indices => sortIndexStats(indices, timeFieldName, sortDirection)); }; // creates the configuration hash that must be passed to the elasticsearch // client function getFieldStats(pattern, timeFieldName, start, stop) { const constraints = {}; if (start) { constraints.max_value = msConstraint('gte', start); } if (stop) { constraints.min_value = msConstraint('lte', stop); } return es.fieldStats({ index: pattern, level: 'indices', body: { fields: [ timeFieldName ], index_constraints: { [timeFieldName]: constraints } } }); } function sortIndexStats(indices, timeFieldName, sortDirection) { const desc = sortDirection === 'desc'; const leader = desc ? 'max' : 'min'; let indexDetails = _(indices).map((stats, index) => { const field = stats.fields[timeFieldName]; // TODO: remove when we get to es 2.2, see elastic/elasticsearch#14404 let min = field.min_value; if (typeof min === 'string') min = moment(min).valueOf(); let max = field.max_value; if (typeof max === 'string') max = moment(max).valueOf(); return { index, min, max }; }); if (sortDirection) { indexDetails = indexDetails.sortByOrder([leader], [sortDirection]); } return indexDetails.value(); } return calculateIndices; }; });