UNPKG

kibana-123

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

74 lines (57 loc) 1.81 kB
var _ = require('lodash'); // Downsampling of cummulative metrics // Good: count, sum // Bad: avg, min, max // For upsampling cummulative metrics (eg sum from 1M to 1d), could rename this scale. // Really only the 0s that screws this up, need to distribute contents of spikes to empty buckets // Empty is currently 0, which is not right function sum(set) { return _.reduce(set, function (sum, num) { return sum + num; }, 0); } module.exports = function (dataTuples, targetTuples) { var i = 0; var j = 0; var spreadCount = 0; var result = []; var bucket; var time; var scaleSet; var step; var nextRealNumber; while (i < targetTuples.length) { scaleSet = []; bucket = targetTuples[i]; time = bucket[0]; // Find stuff to sum j = 0; while (j < dataTuples.length && Math.abs(dataTuples[j][0] <= time)) { scaleSet.push(dataTuples[j][1]); j++; } dataTuples.splice(0, j); // We hit a real number, or the end if (scaleSet.length > 0 || i === targetTuples.length - 1) { nextRealNumber = sum(scaleSet); step = nextRealNumber; // Backfill null buckets if (spreadCount > 0) { // Naively distibute the nextRealNumber amoungst the buckets // Without considering where it is headed next // We do spreadCount + 1 so that we include nextRealNumber when we smooth things out, // since we'll overwrite it anyway. // Thus [5, null, null, 30] becomes [5, 10, 10, 10] step = nextRealNumber / (spreadCount + 1); while (spreadCount > 0) { result[i - spreadCount][1] = step; spreadCount--; } } result.push([time, step]); } else { result.push([time, null]); spreadCount++; } i++; } return result; };