UNPKG

kibana-riya

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

82 lines (69 loc) 2.38 kB
import _ from 'lodash'; import moment from '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]); } export default 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]; return { index, min: field.min_value, max: field.max_value }; }); if (sortDirection) { indexDetails = indexDetails.sortByOrder([leader], [sortDirection]); } return indexDetails.value(); } return calculateIndices; };