From 5ea700486cc2cfb51a88841837011d10a9004490 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Sat, 23 Nov 2013 18:03:08 -0700 Subject: [PATCH 1/9] Adding statistical facet panel --- src/app/components/require.config.js | 1 + src/app/panels/stats/editor.html | 23 ++++++ src/app/panels/stats/module.html | 3 + src/app/panels/stats/module.js | 118 +++++++++++++++++++++++++++ src/config.js | 1 + src/vendor/numeral.min.js | 8 ++ 6 files changed, 154 insertions(+) create mode 100644 src/app/panels/stats/editor.html create mode 100644 src/app/panels/stats/module.html create mode 100644 src/app/panels/stats/module.js create mode 100644 src/vendor/numeral.min.js diff --git a/src/app/components/require.config.js b/src/app/components/require.config.js index e987b4cbf7329..fe7d60f1c02eb 100644 --- a/src/app/components/require.config.js +++ b/src/app/components/require.config.js @@ -41,6 +41,7 @@ require.config({ modernizr: '../vendor/modernizr-2.6.1', + numeral: '../vendor/numeral.min', elasticjs: '../vendor/elasticjs/elastic-angular-client', }, shim: { diff --git a/src/app/panels/stats/editor.html b/src/app/panels/stats/editor.html new file mode 100644 index 0000000000000..19024bd3d1de1 --- /dev/null +++ b/src/app/panels/stats/editor.html @@ -0,0 +1,23 @@ +
+
Values
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
diff --git a/src/app/panels/stats/module.html b/src/app/panels/stats/module.html new file mode 100644 index 0000000000000..6c0bd827bc37c --- /dev/null +++ b/src/app/panels/stats/module.html @@ -0,0 +1,3 @@ +
+

{{data.value}} {{panel.unit}}

+
diff --git a/src/app/panels/stats/module.js b/src/app/panels/stats/module.js new file mode 100644 index 0000000000000..cefee3dd5b813 --- /dev/null +++ b/src/app/panels/stats/module.js @@ -0,0 +1,118 @@ +define(function (require) { + var angular = require('angular'); + var app = require('app'); + var _ = require('underscore'); + var $ = require('jquery'); + var kbn = require('kbn'); + var numeral = require('numeral'); + + 'use strict'; + + var module = angular.module('kibana.panels.stats', []); + app.useModule(module); + + module.controller('stats', function ($scope, querySrv, dashboard, filterSrv) { + + $scope.panelMeta = { + modals : [ + { + description: "Inspect", + icon: "icon-info-sign", + partial: "app/partials/inspector.html", + show: $scope.panel.spyable + } + ], + editorTabs : [ + {title:'Queries', src:'app/partials/querySelect.html'} + ], + status: 'Experimental', + description: 'A statatics panel' + }; + + var defaults = { + queries : { + mode : 'all', + ids : [] + }, + style : { "font-size": '24pt'}, + format: 'number', + mode: 'count', + spyable : true + }; + + _.defaults($scope.panel, defaults); + + $scope.init = function () { + $scope.ready = false; + $scope.$on('refresh', function () { + $scope.get_data(); + }); + $scope.get_data(); + }; + + $scope.get_data = function () { + if(dashboard.indices.length === 0) { + return; + } + + $scope.panelMeta.loading = true; + + var request = $scope.ejs.Request().indices(dashboard.indices); + var queries = querySrv.getQueryObjs($scope.panel.queries.ids); + + var boolQuery = $scope.ejs.BoolQuery(); + _.each(queries,function(q) { + boolQuery = boolQuery.should(querySrv.toEjsObj(q)); + }); + + var filteredQuery = $scope.ejs + .FilteredQuery(boolQuery, filterSrv.getBoolFilter(filterSrv.ids)) + + var queryFilter = $scope.ejs.QueryFilter(filteredQuery); + + var facet = $scope.ejs.StatisticalFacet('stats'); + facet.field($scope.panel.field) + facet.facetFilter(queryFilter) + request.facet(facet).size(0); + + $scope.inspector = angular.toJson(JSON.parse(request.toString()),true); + + results = request.doSearch(); + results.then(function(results) { + $scope.panelMeta.loading = false; + var value = results.facets.stats[$scope.panel.mode]; + switch ($scope.panel.format) { + case 'money': + value = numeral(value).format('$0,0.00'); + break; + case 'bytes': + value = numeral(value).format('0.00b'); + break; + case 'float': + value = numeral(value).format('0.000'); + break; + default: + value = numeral(value).format('0,0'); + } + $scope.data = { + value: value + }; + $scope.$emit('render'); + }); + }; + + $scope.set_refresh = function (state) { + $scope.refresh = state; + }; + + $scope.close_edit = function() { + if($scope.refresh) { + $scope.get_data(); + } + $scope.refresh = false; + $scope.$emit('render'); + }; + + }); + +}); diff --git a/src/config.js b/src/config.js index 80c0c8129a728..6b14e2ff1c49b 100644 --- a/src/config.js +++ b/src/config.js @@ -49,6 +49,7 @@ function (Settings) { 'bettermap', 'query', 'terms', + 'stats', 'sparklines' ] }); diff --git a/src/vendor/numeral.min.js b/src/vendor/numeral.min.js new file mode 100644 index 0000000000000..81d4e49baeeb2 --- /dev/null +++ b/src/vendor/numeral.min.js @@ -0,0 +1,8 @@ +/*! + * numeral.js + * version : 1.5.2 + * author : Adam Draper + * license : MIT + * http://adamwdraper.github.com/Numeral-js/ + */ +(function(){function a(a){this._value=a}function b(a,b,c,d){var e,f,g=Math.pow(10,b);return f=(c(a*g)/g).toFixed(b),d&&(e=new RegExp("0{1,"+d+"}$"),f=f.replace(e,"")),f}function c(a,b,c){var d;return d=b.indexOf("$")>-1?e(a,b,c):b.indexOf("%")>-1?f(a,b,c):b.indexOf(":")>-1?g(a,b):i(a._value,b,c)}function d(a,b){var c,d,e,f,g,i=b,j=["KB","MB","GB","TB","PB","EB","ZB","YB"],k=!1;if(b.indexOf(":")>-1)a._value=h(b);else if(b===o)a._value=0;else{for("."!==m[n].delimiters.decimal&&(b=b.replace(/\./g,"").replace(m[n].delimiters.decimal,".")),c=new RegExp("[^a-zA-Z]"+m[n].abbreviations.thousand+"(?:\\)|(\\"+m[n].currency.symbol+")?(?:\\))?)?$"),d=new RegExp("[^a-zA-Z]"+m[n].abbreviations.million+"(?:\\)|(\\"+m[n].currency.symbol+")?(?:\\))?)?$"),e=new RegExp("[^a-zA-Z]"+m[n].abbreviations.billion+"(?:\\)|(\\"+m[n].currency.symbol+")?(?:\\))?)?$"),f=new RegExp("[^a-zA-Z]"+m[n].abbreviations.trillion+"(?:\\)|(\\"+m[n].currency.symbol+")?(?:\\))?)?$"),g=0;g<=j.length&&!(k=b.indexOf(j[g])>-1?Math.pow(1024,g+1):!1);g++);a._value=(k?k:1)*(i.match(c)?Math.pow(10,3):1)*(i.match(d)?Math.pow(10,6):1)*(i.match(e)?Math.pow(10,9):1)*(i.match(f)?Math.pow(10,12):1)*(b.indexOf("%")>-1?.01:1)*((b.split("-").length+Math.min(b.split("(").length-1,b.split(")").length-1))%2?1:-1)*Number(b.replace(/[^0-9\.]+/g,"")),a._value=k?Math.ceil(a._value):a._value}return a._value}function e(a,b,c){var d,e=b.indexOf("$")<=1?!0:!1,f="";return b.indexOf(" $")>-1?(f=" ",b=b.replace(" $","")):b.indexOf("$ ")>-1?(f=" ",b=b.replace("$ ","")):b=b.replace("$",""),d=i(a._value,b,c),e?d.indexOf("(")>-1||d.indexOf("-")>-1?(d=d.split(""),d.splice(1,0,m[n].currency.symbol+f),d=d.join("")):d=m[n].currency.symbol+f+d:d.indexOf(")")>-1?(d=d.split(""),d.splice(-1,0,f+m[n].currency.symbol),d=d.join("")):d=d+f+m[n].currency.symbol,d}function f(a,b,c){var d,e="",f=100*a._value;return b.indexOf(" %")>-1?(e=" ",b=b.replace(" %","")):b=b.replace("%",""),d=i(f,b,c),d.indexOf(")")>-1?(d=d.split(""),d.splice(-1,0,e+"%"),d=d.join("")):d=d+e+"%",d}function g(a){var b=Math.floor(a._value/60/60),c=Math.floor((a._value-60*60*b)/60),d=Math.round(a._value-60*60*b-60*c);return b+":"+(10>c?"0"+c:c)+":"+(10>d?"0"+d:d)}function h(a){var b=a.split(":"),c=0;return 3===b.length?(c+=60*60*Number(b[0]),c+=60*Number(b[1]),c+=Number(b[2])):2===b.length&&(c+=60*Number(b[0]),c+=Number(b[1])),Number(c)}function i(a,c,d){var e,f,g,h,i,j,k=!1,l=!1,p=!1,q="",r="",s="",t=Math.abs(a),u=["B","KB","MB","GB","TB","PB","EB","ZB","YB"],v="",w=!1;if(0===a&&null!==o)return o;if(c.indexOf("(")>-1?(k=!0,c=c.slice(1,-1)):c.indexOf("+")>-1&&(l=!0,c=c.replace(/\+/g,"")),c.indexOf("a")>-1&&(c.indexOf(" a")>-1?(q=" ",c=c.replace(" a","")):c=c.replace("a",""),t>=Math.pow(10,12)?(q+=m[n].abbreviations.trillion,a/=Math.pow(10,12)):t=Math.pow(10,9)?(q+=m[n].abbreviations.billion,a/=Math.pow(10,9)):t=Math.pow(10,6)?(q+=m[n].abbreviations.million,a/=Math.pow(10,6)):t=Math.pow(10,3)&&(q+=m[n].abbreviations.thousand,a/=Math.pow(10,3))),c.indexOf("b")>-1)for(c.indexOf(" b")>-1?(r=" ",c=c.replace(" b","")):c=c.replace("b",""),g=0;g<=u.length;g++)if(e=Math.pow(1024,g),f=Math.pow(1024,g+1),a>=e&&f>a){r+=u[g],e>0&&(a/=e);break}return c.indexOf("o")>-1&&(c.indexOf(" o")>-1?(s=" ",c=c.replace(" o","")):c=c.replace("o",""),s+=m[n].ordinal(a)),c.indexOf("[.]")>-1&&(p=!0,c=c.replace("[.]",".")),h=a.toString().split(".")[0],i=c.split(".")[1],j=c.indexOf(","),i?(i.indexOf("[")>-1?(i=i.replace("]",""),i=i.split("["),v=b(a,i[0].length+i[1].length,d,i[1].length)):v=b(a,i.length,d),h=v.split(".")[0],v=v.split(".")[1].length?m[n].delimiters.decimal+v.split(".")[1]:"",p&&0===Number(v.slice(1))&&(v="")):h=b(a,null,d),h.indexOf("-")>-1&&(h=h.slice(1),w=!0),j>-1&&(h=h.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g,"$1"+m[n].delimiters.thousands)),0===c.indexOf(".")&&(h=""),(k&&w?"(":"")+(!k&&w?"-":"")+(!w&&l?"+":"")+h+v+(s?s:"")+(q?q:"")+(r?r:"")+(k&&w?")":"")}function j(a,b){m[a]=b}var k,l="1.5.2",m={},n="en",o=null,p="0,0",q="undefined"!=typeof module&&module.exports;k=function(b){return k.isNumeral(b)?b=b.value():0===b||"undefined"==typeof b?b=0:Number(b)||(b=k.fn.unformat(b)),new a(Number(b))},k.version=l,k.isNumeral=function(b){return b instanceof a},k.language=function(a,b){if(!a)return n;if(a&&!b){if(!m[a])throw new Error("Unknown language : "+a);n=a}return(b||!m[a])&&j(a,b),k},k.languageData=function(a){if(!a)return m[n];if(!m[a])throw new Error("Unknown language : "+a);return m[a]},k.language("en",{delimiters:{thousands:",",decimal:"."},abbreviations:{thousand:"k",million:"m",billion:"b",trillion:"t"},ordinal:function(a){var b=a%10;return 1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th"},currency:{symbol:"$"}}),k.zeroFormat=function(a){o="string"==typeof a?a:null},k.defaultFormat=function(a){p="string"==typeof a?a:"0.0"},k.fn=a.prototype={clone:function(){return k(this)},format:function(a,b){return c(this,a?a:p,void 0!==b?b:Math.round)},unformat:function(a){return"[object Number]"===Object.prototype.toString.call(a)?a:d(this,a?a:p)},value:function(){return this._value},valueOf:function(){return this._value},set:function(a){return this._value=Number(a),this},add:function(a){return this._value=this._value+Number(a),this},subtract:function(a){return this._value=this._value-Number(a),this},multiply:function(a){return this._value=this._value*Number(a),this},divide:function(a){return this._value=this._value/Number(a),this},difference:function(a){var b=this._value-Number(a);return 0>b&&(b=-b),b}},q&&(module.exports=k),"undefined"==typeof ender&&(this.numeral=k),"function"==typeof define&&define.amd&&define([],function(){return k})}).call(this); \ No newline at end of file From 00f09358b33e98adcbf47f747b00794cf228c3b9 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Sat, 23 Nov 2013 22:01:12 -0700 Subject: [PATCH 2/9] Adding some final touches --- src/app/panels/stats/module.html | 2 +- src/app/panels/stats/module.js | 36 ++++++++++++++++++++------------ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/app/panels/stats/module.html b/src/app/panels/stats/module.html index 6c0bd827bc37c..3b0e009d67f52 100644 --- a/src/app/panels/stats/module.html +++ b/src/app/panels/stats/module.html @@ -1,3 +1,3 @@
-

{{data.value}} {{panel.unit}}

+

{{data.value}} {{panel.unit}}

diff --git a/src/app/panels/stats/module.js b/src/app/panels/stats/module.js index cefee3dd5b813..d3792298708ce 100644 --- a/src/app/panels/stats/module.js +++ b/src/app/panels/stats/module.js @@ -56,28 +56,38 @@ define(function (require) { } $scope.panelMeta.loading = true; + + var request, + results, + boolQuery, + queries; + + request = $scope.ejs.Request().indices(dashboard.indices); + + $scope.panel.queries.ids = querySrv.idsByMode($scope.panel.queries); + queries = querySrv.getQueryObjs($scope.panel.queries.ids); - var request = $scope.ejs.Request().indices(dashboard.indices); - var queries = querySrv.getQueryObjs($scope.panel.queries.ids); - - var boolQuery = $scope.ejs.BoolQuery(); + // This could probably be changed to a BoolFilter + boolQuery = $scope.ejs.BoolQuery(); _.each(queries,function(q) { boolQuery = boolQuery.should(querySrv.toEjsObj(q)); }); - var filteredQuery = $scope.ejs - .FilteredQuery(boolQuery, filterSrv.getBoolFilter(filterSrv.ids)) - var queryFilter = $scope.ejs.QueryFilter(filteredQuery); - - var facet = $scope.ejs.StatisticalFacet('stats'); - facet.field($scope.panel.field) - facet.facetFilter(queryFilter) - request.facet(facet).size(0); - + request = request + .facet($scope.ejs.StatisticalFacet('stats') + .field($scope.panel.field) + .facetFilter($scope.ejs.QueryFilter( + $scope.ejs.FilteredQuery( + boolQuery, + filterSrv.getBoolFilter(filterSrv.ids) + )))).size(0); + + // Populate the inspector panel $scope.inspector = angular.toJson(JSON.parse(request.toString()),true); results = request.doSearch(); + results.then(function(results) { $scope.panelMeta.loading = false; var value = results.facets.stats[$scope.panel.mode]; From 89e8ebb588378d3a3c18a5877f613c3e3592ae52 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Sat, 23 Nov 2013 22:32:30 -0700 Subject: [PATCH 3/9] Fixing editor layout --- src/app/panels/stats/editor.html | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/app/panels/stats/editor.html b/src/app/panels/stats/editor.html index 19024bd3d1de1..3aadc53f8bf1e 100644 --- a/src/app/panels/stats/editor.html +++ b/src/app/panels/stats/editor.html @@ -1,17 +1,18 @@
-
Values
+
Details
- +
+
Formating
From 3b101d78680768e570f9a10a9af705252578a225 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Sun, 24 Nov 2013 20:49:36 -0700 Subject: [PATCH 4/9] Removing minified version of numeral.js and adding the un-minified version --- src/app/components/require.config.js | 2 +- src/vendor/numeral.js | 565 +++++++++++++++++++++++++++ src/vendor/numeral.min.js | 8 - 3 files changed, 566 insertions(+), 9 deletions(-) create mode 100644 src/vendor/numeral.js delete mode 100644 src/vendor/numeral.min.js diff --git a/src/app/components/require.config.js b/src/app/components/require.config.js index fe7d60f1c02eb..64d03a8ab28dc 100644 --- a/src/app/components/require.config.js +++ b/src/app/components/require.config.js @@ -41,7 +41,7 @@ require.config({ modernizr: '../vendor/modernizr-2.6.1', - numeral: '../vendor/numeral.min', + numeral: '../vendor/numeral', elasticjs: '../vendor/elasticjs/elastic-angular-client', }, shim: { diff --git a/src/vendor/numeral.js b/src/vendor/numeral.js new file mode 100644 index 0000000000000..20b514018b067 --- /dev/null +++ b/src/vendor/numeral.js @@ -0,0 +1,565 @@ +/*! + * numeral.js + * version : 1.5.2 + * author : Adam Draper + * license : MIT + * http://adamwdraper.github.com/Numeral-js/ + */ + +(function () { + + /************************************ + Constants + ************************************/ + + var numeral, + VERSION = '1.5.2', + // internal storage for language config files + languages = {}, + currentLanguage = 'en', + zeroFormat = null, + defaultFormat = '0,0', + // check for nodeJS + hasModule = (typeof module !== 'undefined' && module.exports); + + + /************************************ + Constructors + ************************************/ + + + // Numeral prototype object + function Numeral (number) { + this._value = number; + } + + /** + * Implementation of toFixed() that treats floats more like decimals + * + * Fixes binary rounding issues (eg. (0.615).toFixed(2) === '0.61') that present + * problems for accounting- and finance-related software. + */ + function toFixed (value, precision, roundingFunction, optionals) { + var power = Math.pow(10, precision), + optionalsRegExp, + output; + + //roundingFunction = (roundingFunction !== undefined ? roundingFunction : Math.round); + // Multiply up by precision, round accurately, then divide and use native toFixed(): + output = (roundingFunction(value * power) / power).toFixed(precision); + + if (optionals) { + optionalsRegExp = new RegExp('0{1,' + optionals + '}$'); + output = output.replace(optionalsRegExp, ''); + } + + return output; + } + + /************************************ + Formatting + ************************************/ + + // determine what type of formatting we need to do + function formatNumeral (n, format, roundingFunction) { + var output; + + // figure out what kind of format we are dealing with + if (format.indexOf('$') > -1) { // currency!!!!! + output = formatCurrency(n, format, roundingFunction); + } else if (format.indexOf('%') > -1) { // percentage + output = formatPercentage(n, format, roundingFunction); + } else if (format.indexOf(':') > -1) { // time + output = formatTime(n, format); + } else { // plain ol' numbers or bytes + output = formatNumber(n._value, format, roundingFunction); + } + + // return string + return output; + } + + // revert to number + function unformatNumeral (n, string) { + var stringOriginal = string, + thousandRegExp, + millionRegExp, + billionRegExp, + trillionRegExp, + suffixes = ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'], + bytesMultiplier = false, + power; + + if (string.indexOf(':') > -1) { + n._value = unformatTime(string); + } else { + if (string === zeroFormat) { + n._value = 0; + } else { + if (languages[currentLanguage].delimiters.decimal !== '.') { + string = string.replace(/\./g,'').replace(languages[currentLanguage].delimiters.decimal, '.'); + } + + // see if abbreviations are there so that we can multiply to the correct number + thousandRegExp = new RegExp('[^a-zA-Z]' + languages[currentLanguage].abbreviations.thousand + '(?:\\)|(\\' + languages[currentLanguage].currency.symbol + ')?(?:\\))?)?$'); + millionRegExp = new RegExp('[^a-zA-Z]' + languages[currentLanguage].abbreviations.million + '(?:\\)|(\\' + languages[currentLanguage].currency.symbol + ')?(?:\\))?)?$'); + billionRegExp = new RegExp('[^a-zA-Z]' + languages[currentLanguage].abbreviations.billion + '(?:\\)|(\\' + languages[currentLanguage].currency.symbol + ')?(?:\\))?)?$'); + trillionRegExp = new RegExp('[^a-zA-Z]' + languages[currentLanguage].abbreviations.trillion + '(?:\\)|(\\' + languages[currentLanguage].currency.symbol + ')?(?:\\))?)?$'); + + // see if bytes are there so that we can multiply to the correct number + for (power = 0; power <= suffixes.length; power++) { + bytesMultiplier = (string.indexOf(suffixes[power]) > -1) ? Math.pow(1024, power + 1) : false; + + if (bytesMultiplier) { + break; + } + } + + // do some math to create our number + n._value = ((bytesMultiplier) ? bytesMultiplier : 1) * ((stringOriginal.match(thousandRegExp)) ? Math.pow(10, 3) : 1) * ((stringOriginal.match(millionRegExp)) ? Math.pow(10, 6) : 1) * ((stringOriginal.match(billionRegExp)) ? Math.pow(10, 9) : 1) * ((stringOriginal.match(trillionRegExp)) ? Math.pow(10, 12) : 1) * ((string.indexOf('%') > -1) ? 0.01 : 1) * (((string.split('-').length + Math.min(string.split('(').length-1, string.split(')').length-1)) % 2)? 1: -1) * Number(string.replace(/[^0-9\.]+/g, '')); + + // round if we are talking about bytes + n._value = (bytesMultiplier) ? Math.ceil(n._value) : n._value; + } + } + return n._value; + } + + function formatCurrency (n, format, roundingFunction) { + var prependSymbol = format.indexOf('$') <= 1 ? true : false, + space = '', + output; + + // check for space before or after currency + if (format.indexOf(' $') > -1) { + space = ' '; + format = format.replace(' $', ''); + } else if (format.indexOf('$ ') > -1) { + space = ' '; + format = format.replace('$ ', ''); + } else { + format = format.replace('$', ''); + } + + // format the number + output = formatNumber(n._value, format, roundingFunction); + + // position the symbol + if (prependSymbol) { + if (output.indexOf('(') > -1 || output.indexOf('-') > -1) { + output = output.split(''); + output.splice(1, 0, languages[currentLanguage].currency.symbol + space); + output = output.join(''); + } else { + output = languages[currentLanguage].currency.symbol + space + output; + } + } else { + if (output.indexOf(')') > -1) { + output = output.split(''); + output.splice(-1, 0, space + languages[currentLanguage].currency.symbol); + output = output.join(''); + } else { + output = output + space + languages[currentLanguage].currency.symbol; + } + } + + return output; + } + + function formatPercentage (n, format, roundingFunction) { + var space = '', + output, + value = n._value * 100; + + // check for space before % + if (format.indexOf(' %') > -1) { + space = ' '; + format = format.replace(' %', ''); + } else { + format = format.replace('%', ''); + } + + output = formatNumber(value, format, roundingFunction); + + if (output.indexOf(')') > -1 ) { + output = output.split(''); + output.splice(-1, 0, space + '%'); + output = output.join(''); + } else { + output = output + space + '%'; + } + + return output; + } + + function formatTime (n) { + var hours = Math.floor(n._value/60/60), + minutes = Math.floor((n._value - (hours * 60 * 60))/60), + seconds = Math.round(n._value - (hours * 60 * 60) - (minutes * 60)); + return hours + ':' + ((minutes < 10) ? '0' + minutes : minutes) + ':' + ((seconds < 10) ? '0' + seconds : seconds); + } + + function unformatTime (string) { + var timeArray = string.split(':'), + seconds = 0; + // turn hours and minutes into seconds and add them all up + if (timeArray.length === 3) { + // hours + seconds = seconds + (Number(timeArray[0]) * 60 * 60); + // minutes + seconds = seconds + (Number(timeArray[1]) * 60); + // seconds + seconds = seconds + Number(timeArray[2]); + } else if (timeArray.length === 2) { + // minutes + seconds = seconds + (Number(timeArray[0]) * 60); + // seconds + seconds = seconds + Number(timeArray[1]); + } + return Number(seconds); + } + + function formatNumber (value, format, roundingFunction) { + var negP = false, + signed = false, + optDec = false, + abbr = '', + bytes = '', + ord = '', + abs = Math.abs(value), + suffixes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'], + min, + max, + power, + w, + precision, + thousands, + d = '', + neg = false; + + // check if number is zero and a custom zero format has been set + if (value === 0 && zeroFormat !== null) { + return zeroFormat; + } else { + // see if we should use parentheses for negative number or if we should prefix with a sign + // if both are present we default to parentheses + if (format.indexOf('(') > -1) { + negP = true; + format = format.slice(1, -1); + } else if (format.indexOf('+') > -1) { + signed = true; + format = format.replace(/\+/g, ''); + } + + // see if abbreviation is wanted + if (format.indexOf('a') > -1) { + // check for space before abbreviation + if (format.indexOf(' a') > -1) { + abbr = ' '; + format = format.replace(' a', ''); + } else { + format = format.replace('a', ''); + } + + if (abs >= Math.pow(10, 12)) { + // trillion + abbr = abbr + languages[currentLanguage].abbreviations.trillion; + value = value / Math.pow(10, 12); + } else if (abs < Math.pow(10, 12) && abs >= Math.pow(10, 9)) { + // billion + abbr = abbr + languages[currentLanguage].abbreviations.billion; + value = value / Math.pow(10, 9); + } else if (abs < Math.pow(10, 9) && abs >= Math.pow(10, 6)) { + // million + abbr = abbr + languages[currentLanguage].abbreviations.million; + value = value / Math.pow(10, 6); + } else if (abs < Math.pow(10, 6) && abs >= Math.pow(10, 3)) { + // thousand + abbr = abbr + languages[currentLanguage].abbreviations.thousand; + value = value / Math.pow(10, 3); + } + } + + // see if we are formatting bytes + if (format.indexOf('b') > -1) { + // check for space before + if (format.indexOf(' b') > -1) { + bytes = ' '; + format = format.replace(' b', ''); + } else { + format = format.replace('b', ''); + } + + for (power = 0; power <= suffixes.length; power++) { + min = Math.pow(1024, power); + max = Math.pow(1024, power+1); + + if (value >= min && value < max) { + bytes = bytes + suffixes[power]; + if (min > 0) { + value = value / min; + } + break; + } + } + } + + // see if ordinal is wanted + if (format.indexOf('o') > -1) { + // check for space before + if (format.indexOf(' o') > -1) { + ord = ' '; + format = format.replace(' o', ''); + } else { + format = format.replace('o', ''); + } + + ord = ord + languages[currentLanguage].ordinal(value); + } + + if (format.indexOf('[.]') > -1) { + optDec = true; + format = format.replace('[.]', '.'); + } + + w = value.toString().split('.')[0]; + precision = format.split('.')[1]; + thousands = format.indexOf(','); + + if (precision) { + if (precision.indexOf('[') > -1) { + precision = precision.replace(']', ''); + precision = precision.split('['); + d = toFixed(value, (precision[0].length + precision[1].length), roundingFunction, precision[1].length); + } else { + d = toFixed(value, precision.length, roundingFunction); + } + + w = d.split('.')[0]; + + if (d.split('.')[1].length) { + d = languages[currentLanguage].delimiters.decimal + d.split('.')[1]; + } else { + d = ''; + } + + if (optDec && Number(d.slice(1)) === 0) { + d = ''; + } + } else { + w = toFixed(value, null, roundingFunction); + } + + // format number + if (w.indexOf('-') > -1) { + w = w.slice(1); + neg = true; + } + + if (thousands > -1) { + w = w.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1' + languages[currentLanguage].delimiters.thousands); + } + + if (format.indexOf('.') === 0) { + w = ''; + } + + return ((negP && neg) ? '(' : '') + ((!negP && neg) ? '-' : '') + ((!neg && signed) ? '+' : '') + w + d + ((ord) ? ord : '') + ((abbr) ? abbr : '') + ((bytes) ? bytes : '') + ((negP && neg) ? ')' : ''); + } + } + + /************************************ + Top Level Functions + ************************************/ + + numeral = function (input) { + if (numeral.isNumeral(input)) { + input = input.value(); + } else if (input === 0 || typeof input === 'undefined') { + input = 0; + } else if (!Number(input)) { + input = numeral.fn.unformat(input); + } + + return new Numeral(Number(input)); + }; + + // version number + numeral.version = VERSION; + + // compare numeral object + numeral.isNumeral = function (obj) { + return obj instanceof Numeral; + }; + + // This function will load languages and then set the global language. If + // no arguments are passed in, it will simply return the current global + // language key. + numeral.language = function (key, values) { + if (!key) { + return currentLanguage; + } + + if (key && !values) { + if(!languages[key]) { + throw new Error('Unknown language : ' + key); + } + currentLanguage = key; + } + + if (values || !languages[key]) { + loadLanguage(key, values); + } + + return numeral; + }; + + // This function provides access to the loaded language data. If + // no arguments are passed in, it will simply return the current + // global language object. + numeral.languageData = function (key) { + if (!key) { + return languages[currentLanguage]; + } + + if (!languages[key]) { + throw new Error('Unknown language : ' + key); + } + + return languages[key]; + }; + + numeral.language('en', { + delimiters: { + thousands: ',', + decimal: '.' + }, + abbreviations: { + thousand: 'k', + million: 'm', + billion: 'b', + trillion: 't' + }, + ordinal: function (number) { + var b = number % 10; + return (~~ (number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + }, + currency: { + symbol: '$' + } + }); + + numeral.zeroFormat = function (format) { + zeroFormat = typeof(format) === 'string' ? format : null; + }; + + numeral.defaultFormat = function (format) { + defaultFormat = typeof(format) === 'string' ? format : '0.0'; + }; + + /************************************ + Helpers + ************************************/ + + function loadLanguage(key, values) { + languages[key] = values; + } + + + /************************************ + Numeral Prototype + ************************************/ + + + numeral.fn = Numeral.prototype = { + + clone : function () { + return numeral(this); + }, + + format : function (inputString, roundingFunction) { + return formatNumeral(this, + inputString ? inputString : defaultFormat, + (roundingFunction !== undefined) ? roundingFunction : Math.round + ); + }, + + unformat : function (inputString) { + if (Object.prototype.toString.call(inputString) === '[object Number]') { + return inputString; + } + return unformatNumeral(this, inputString ? inputString : defaultFormat); + }, + + value : function () { + return this._value; + }, + + valueOf : function () { + return this._value; + }, + + set : function (value) { + this._value = Number(value); + return this; + }, + + add : function (value) { + this._value = this._value + Number(value); + return this; + }, + + subtract : function (value) { + this._value = this._value - Number(value); + return this; + }, + + multiply : function (value) { + this._value = this._value * Number(value); + return this; + }, + + divide : function (value) { + this._value = this._value / Number(value); + return this; + }, + + difference : function (value) { + var difference = this._value - Number(value); + + if (difference < 0) { + difference = -difference; + } + + return difference; + } + + }; + + /************************************ + Exposing Numeral + ************************************/ + + // CommonJS module is defined + if (hasModule) { + module.exports = numeral; + } + + /*global ender:false */ + if (typeof ender === 'undefined') { + // here, `this` means `window` in the browser, or `global` on the server + // add `numeral` as a global object via a string identifier, + // for Closure Compiler 'advanced' mode + this['numeral'] = numeral; + } + + /*global define:false */ + if (typeof define === 'function' && define.amd) { + define([], function () { + return numeral; + }); + } +}).call(this); diff --git a/src/vendor/numeral.min.js b/src/vendor/numeral.min.js deleted file mode 100644 index 81d4e49baeeb2..0000000000000 --- a/src/vendor/numeral.min.js +++ /dev/null @@ -1,8 +0,0 @@ -/*! - * numeral.js - * version : 1.5.2 - * author : Adam Draper - * license : MIT - * http://adamwdraper.github.com/Numeral-js/ - */ -(function(){function a(a){this._value=a}function b(a,b,c,d){var e,f,g=Math.pow(10,b);return f=(c(a*g)/g).toFixed(b),d&&(e=new RegExp("0{1,"+d+"}$"),f=f.replace(e,"")),f}function c(a,b,c){var d;return d=b.indexOf("$")>-1?e(a,b,c):b.indexOf("%")>-1?f(a,b,c):b.indexOf(":")>-1?g(a,b):i(a._value,b,c)}function d(a,b){var c,d,e,f,g,i=b,j=["KB","MB","GB","TB","PB","EB","ZB","YB"],k=!1;if(b.indexOf(":")>-1)a._value=h(b);else if(b===o)a._value=0;else{for("."!==m[n].delimiters.decimal&&(b=b.replace(/\./g,"").replace(m[n].delimiters.decimal,".")),c=new RegExp("[^a-zA-Z]"+m[n].abbreviations.thousand+"(?:\\)|(\\"+m[n].currency.symbol+")?(?:\\))?)?$"),d=new RegExp("[^a-zA-Z]"+m[n].abbreviations.million+"(?:\\)|(\\"+m[n].currency.symbol+")?(?:\\))?)?$"),e=new RegExp("[^a-zA-Z]"+m[n].abbreviations.billion+"(?:\\)|(\\"+m[n].currency.symbol+")?(?:\\))?)?$"),f=new RegExp("[^a-zA-Z]"+m[n].abbreviations.trillion+"(?:\\)|(\\"+m[n].currency.symbol+")?(?:\\))?)?$"),g=0;g<=j.length&&!(k=b.indexOf(j[g])>-1?Math.pow(1024,g+1):!1);g++);a._value=(k?k:1)*(i.match(c)?Math.pow(10,3):1)*(i.match(d)?Math.pow(10,6):1)*(i.match(e)?Math.pow(10,9):1)*(i.match(f)?Math.pow(10,12):1)*(b.indexOf("%")>-1?.01:1)*((b.split("-").length+Math.min(b.split("(").length-1,b.split(")").length-1))%2?1:-1)*Number(b.replace(/[^0-9\.]+/g,"")),a._value=k?Math.ceil(a._value):a._value}return a._value}function e(a,b,c){var d,e=b.indexOf("$")<=1?!0:!1,f="";return b.indexOf(" $")>-1?(f=" ",b=b.replace(" $","")):b.indexOf("$ ")>-1?(f=" ",b=b.replace("$ ","")):b=b.replace("$",""),d=i(a._value,b,c),e?d.indexOf("(")>-1||d.indexOf("-")>-1?(d=d.split(""),d.splice(1,0,m[n].currency.symbol+f),d=d.join("")):d=m[n].currency.symbol+f+d:d.indexOf(")")>-1?(d=d.split(""),d.splice(-1,0,f+m[n].currency.symbol),d=d.join("")):d=d+f+m[n].currency.symbol,d}function f(a,b,c){var d,e="",f=100*a._value;return b.indexOf(" %")>-1?(e=" ",b=b.replace(" %","")):b=b.replace("%",""),d=i(f,b,c),d.indexOf(")")>-1?(d=d.split(""),d.splice(-1,0,e+"%"),d=d.join("")):d=d+e+"%",d}function g(a){var b=Math.floor(a._value/60/60),c=Math.floor((a._value-60*60*b)/60),d=Math.round(a._value-60*60*b-60*c);return b+":"+(10>c?"0"+c:c)+":"+(10>d?"0"+d:d)}function h(a){var b=a.split(":"),c=0;return 3===b.length?(c+=60*60*Number(b[0]),c+=60*Number(b[1]),c+=Number(b[2])):2===b.length&&(c+=60*Number(b[0]),c+=Number(b[1])),Number(c)}function i(a,c,d){var e,f,g,h,i,j,k=!1,l=!1,p=!1,q="",r="",s="",t=Math.abs(a),u=["B","KB","MB","GB","TB","PB","EB","ZB","YB"],v="",w=!1;if(0===a&&null!==o)return o;if(c.indexOf("(")>-1?(k=!0,c=c.slice(1,-1)):c.indexOf("+")>-1&&(l=!0,c=c.replace(/\+/g,"")),c.indexOf("a")>-1&&(c.indexOf(" a")>-1?(q=" ",c=c.replace(" a","")):c=c.replace("a",""),t>=Math.pow(10,12)?(q+=m[n].abbreviations.trillion,a/=Math.pow(10,12)):t=Math.pow(10,9)?(q+=m[n].abbreviations.billion,a/=Math.pow(10,9)):t=Math.pow(10,6)?(q+=m[n].abbreviations.million,a/=Math.pow(10,6)):t=Math.pow(10,3)&&(q+=m[n].abbreviations.thousand,a/=Math.pow(10,3))),c.indexOf("b")>-1)for(c.indexOf(" b")>-1?(r=" ",c=c.replace(" b","")):c=c.replace("b",""),g=0;g<=u.length;g++)if(e=Math.pow(1024,g),f=Math.pow(1024,g+1),a>=e&&f>a){r+=u[g],e>0&&(a/=e);break}return c.indexOf("o")>-1&&(c.indexOf(" o")>-1?(s=" ",c=c.replace(" o","")):c=c.replace("o",""),s+=m[n].ordinal(a)),c.indexOf("[.]")>-1&&(p=!0,c=c.replace("[.]",".")),h=a.toString().split(".")[0],i=c.split(".")[1],j=c.indexOf(","),i?(i.indexOf("[")>-1?(i=i.replace("]",""),i=i.split("["),v=b(a,i[0].length+i[1].length,d,i[1].length)):v=b(a,i.length,d),h=v.split(".")[0],v=v.split(".")[1].length?m[n].delimiters.decimal+v.split(".")[1]:"",p&&0===Number(v.slice(1))&&(v="")):h=b(a,null,d),h.indexOf("-")>-1&&(h=h.slice(1),w=!0),j>-1&&(h=h.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g,"$1"+m[n].delimiters.thousands)),0===c.indexOf(".")&&(h=""),(k&&w?"(":"")+(!k&&w?"-":"")+(!w&&l?"+":"")+h+v+(s?s:"")+(q?q:"")+(r?r:"")+(k&&w?")":"")}function j(a,b){m[a]=b}var k,l="1.5.2",m={},n="en",o=null,p="0,0",q="undefined"!=typeof module&&module.exports;k=function(b){return k.isNumeral(b)?b=b.value():0===b||"undefined"==typeof b?b=0:Number(b)||(b=k.fn.unformat(b)),new a(Number(b))},k.version=l,k.isNumeral=function(b){return b instanceof a},k.language=function(a,b){if(!a)return n;if(a&&!b){if(!m[a])throw new Error("Unknown language : "+a);n=a}return(b||!m[a])&&j(a,b),k},k.languageData=function(a){if(!a)return m[n];if(!m[a])throw new Error("Unknown language : "+a);return m[a]},k.language("en",{delimiters:{thousands:",",decimal:"."},abbreviations:{thousand:"k",million:"m",billion:"b",trillion:"t"},ordinal:function(a){var b=a%10;return 1===~~(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th"},currency:{symbol:"$"}}),k.zeroFormat=function(a){o="string"==typeof a?a:null},k.defaultFormat=function(a){p="string"==typeof a?a:"0.0"},k.fn=a.prototype={clone:function(){return k(this)},format:function(a,b){return c(this,a?a:p,void 0!==b?b:Math.round)},unformat:function(a){return"[object Number]"===Object.prototype.toString.call(a)?a:d(this,a?a:p)},value:function(){return this._value},valueOf:function(){return this._value},set:function(a){return this._value=Number(a),this},add:function(a){return this._value=this._value+Number(a),this},subtract:function(a){return this._value=this._value-Number(a),this},multiply:function(a){return this._value=this._value*Number(a),this},divide:function(a){return this._value=this._value/Number(a),this},difference:function(a){var b=this._value-Number(a);return 0>b&&(b=-b),b}},q&&(module.exports=k),"undefined"==typeof ender&&(this.numeral=k),"function"==typeof define&&define.amd&&define([],function(){return k})}).call(this); \ No newline at end of file From 335fd3dac32ac7c29b9fe6f702c81ddb9aa28912 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Wed, 18 Dec 2013 21:39:11 -0700 Subject: [PATCH 5/9] #724 Fixing issues identified in comments from @rashidkpc --- src/app/panels/stats/editor.html | 4 ++ src/app/panels/stats/module.html | 8 +++ src/app/panels/stats/module.js | 102 +++++++++++++++++++++++-------- src/config.js | 2 +- 4 files changed, 91 insertions(+), 25 deletions(-) diff --git a/src/app/panels/stats/editor.html b/src/app/panels/stats/editor.html index 3aadc53f8bf1e..28a1739e862ad 100644 --- a/src/app/panels/stats/editor.html +++ b/src/app/panels/stats/editor.html @@ -21,4 +21,8 @@
Formating
+
+ + +
diff --git a/src/app/panels/stats/module.html b/src/app/panels/stats/module.html index 3b0e009d67f52..a04aadbe57697 100644 --- a/src/app/panels/stats/module.html +++ b/src/app/panels/stats/module.html @@ -1,3 +1,11 @@

{{data.value}} {{panel.unit}}

+ + + + + + + +
{{item.label}}{{item.value}}
diff --git a/src/app/panels/stats/module.js b/src/app/panels/stats/module.js index d3792298708ce..0f2d7c6535cb1 100644 --- a/src/app/panels/stats/module.js +++ b/src/app/panels/stats/module.js @@ -1,10 +1,29 @@ -define(function (require) { - var angular = require('angular'); - var app = require('app'); - var _ = require('underscore'); - var $ = require('jquery'); - var kbn = require('kbn'); - var numeral = require('numeral'); +/* + + ## Stats Module + + ### Parameters + * format :: The format of the value returned. (Default: number) + * style :: The font size of the main number to be displayed. + * mode :: The aggergate value to use for display + * spyable :: Dislay the 'eye' icon that show the last elasticsearch query + +*/ +define([ + 'angular', + 'app', + 'underscore', + 'jquery', + 'kbn', + 'numeral' +], function ( + angular, + app, + _, + $, + kbn, + numeral +) { 'use strict'; @@ -25,10 +44,11 @@ define(function (require) { editorTabs : [ {title:'Queries', src:'app/partials/querySelect.html'} ], - status: 'Experimental', - description: 'A statatics panel' + status: 'Beta', + description: 'A statatics panel for displaying aggergations using the Elastic Search statistical facet query.' }; + var defaults = { queries : { mode : 'all', @@ -37,6 +57,7 @@ define(function (require) { style : { "font-size": '24pt'}, format: 'number', mode: 'count', + display_breakdown: 'yes', spyable : true }; @@ -67,13 +88,14 @@ define(function (require) { $scope.panel.queries.ids = querySrv.idsByMode($scope.panel.queries); queries = querySrv.getQueryObjs($scope.panel.queries.ids); + console.log('queries', queries); + // This could probably be changed to a BoolFilter boolQuery = $scope.ejs.BoolQuery(); _.each(queries,function(q) { boolQuery = boolQuery.should(querySrv.toEjsObj(q)); }); - request = request .facet($scope.ejs.StatisticalFacet('stats') .field($scope.panel.field) @@ -83,30 +105,62 @@ define(function (require) { filterSrv.getBoolFilter(filterSrv.ids) )))).size(0); + _.each(queries, function (q) { + var alias = q.alias || q.query; + var query = $scope.ejs.BoolQuery(); + query.should(querySrv.toEjsObj(q)); + request.facet($scope.ejs.StatisticalFacet('stats_'+alias) + .field($scope.panel.field) + .facetFilter($scope.ejs.QueryFilter( + $scope.ejs.FilteredQuery( + query, + filterSrv.getBoolFilter(filterSrv.ids) + ) + )) + ); + }); + // Populate the inspector panel $scope.inspector = angular.toJson(JSON.parse(request.toString()),true); results = request.doSearch(); + var format = function (format, value) { + switch (format) { + case 'money': + value = numeral(value).format('$0,0.00'); + break; + case 'bytes': + value = numeral(value).format('0.00b'); + break; + case 'float': + value = numeral(value).format('0.000'); + break; + default: + value = numeral(value).format('0,0'); + } + return value; + }; + results.then(function(results) { $scope.panelMeta.loading = false; var value = results.facets.stats[$scope.panel.mode]; - switch ($scope.panel.format) { - case 'money': - value = numeral(value).format('$0,0.00'); - break; - case 'bytes': - value = numeral(value).format('0.00b'); - break; - case 'float': - value = numeral(value).format('0.000'); - break; - default: - value = numeral(value).format('0,0'); - } + + var rows = queries.map(function (q) { + var alias = q.alias || q.query; + var obj = _.clone(q); + obj.label = alias; + obj.value = format($scope.panel.format,results.facets['stats_'+alias][$scope.panel.mode]); + return obj; + }); + $scope.data = { - value: value + value: format($scope.panel.format, value), + rows: rows }; + + console.log($scope.data); + $scope.$emit('render'); }); }; diff --git a/src/config.js b/src/config.js index 6b14e2ff1c49b..c4a7d7c4e7e83 100644 --- a/src/config.js +++ b/src/config.js @@ -18,7 +18,7 @@ function (Settings) { * elasticsearch host * @type {String} */ - elasticsearch: "http://"+window.location.hostname+":9200", + elasticsearch: "http://"+window.location.hostname+":9500", /** * The default ES index to use for storing Kibana specific object From 46094db2b2bcbddb8ea6a2a37748feffeef03fee Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Wed, 18 Dec 2013 21:41:03 -0700 Subject: [PATCH 6/9] reverting config change --- src/config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.js b/src/config.js index c4a7d7c4e7e83..6b14e2ff1c49b 100644 --- a/src/config.js +++ b/src/config.js @@ -18,7 +18,7 @@ function (Settings) { * elasticsearch host * @type {String} */ - elasticsearch: "http://"+window.location.hostname+":9500", + elasticsearch: "http://"+window.location.hostname+":9200", /** * The default ES index to use for storing Kibana specific object From 817d0e7c567f498c753628268500b47541c97c43 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Wed, 18 Dec 2013 21:48:19 -0700 Subject: [PATCH 7/9] Adding unit to breakdown table --- src/app/panels/stats/module.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/panels/stats/module.html b/src/app/panels/stats/module.html index a04aadbe57697..0e26c199c6a5f 100644 --- a/src/app/panels/stats/module.html +++ b/src/app/panels/stats/module.html @@ -4,7 +4,7 @@

{{data. {{item.label}} - {{item.value}} + {{item.value}} {{panel.unit}} From 9254abcfb565614a5bf397722454c97eeec2ad7e Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Thu, 19 Dec 2013 21:58:04 -0700 Subject: [PATCH 8/9] removing debug --- src/app/panels/stats/module.js | 3 --- src/config.js | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/app/panels/stats/module.js b/src/app/panels/stats/module.js index 0f2d7c6535cb1..8bad6ca693d04 100644 --- a/src/app/panels/stats/module.js +++ b/src/app/panels/stats/module.js @@ -88,7 +88,6 @@ define([ $scope.panel.queries.ids = querySrv.idsByMode($scope.panel.queries); queries = querySrv.getQueryObjs($scope.panel.queries.ids); - console.log('queries', queries); // This could probably be changed to a BoolFilter boolQuery = $scope.ejs.BoolQuery(); @@ -159,8 +158,6 @@ define([ rows: rows }; - console.log($scope.data); - $scope.$emit('render'); }); }; diff --git a/src/config.js b/src/config.js index 6b14e2ff1c49b..c4a7d7c4e7e83 100644 --- a/src/config.js +++ b/src/config.js @@ -18,7 +18,7 @@ function (Settings) { * elasticsearch host * @type {String} */ - elasticsearch: "http://"+window.location.hostname+":9200", + elasticsearch: "http://"+window.location.hostname+":9500", /** * The default ES index to use for storing Kibana specific object From 5ae58cb0a094a4180821d3f1b5be3818eb10bfce Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Thu, 19 Dec 2013 21:59:22 -0700 Subject: [PATCH 9/9] reverting port change --- src/config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.js b/src/config.js index c4a7d7c4e7e83..6b14e2ff1c49b 100644 --- a/src/config.js +++ b/src/config.js @@ -18,7 +18,7 @@ function (Settings) { * elasticsearch host * @type {String} */ - elasticsearch: "http://"+window.location.hostname+":9500", + elasticsearch: "http://"+window.location.hostname+":9200", /** * The default ES index to use for storing Kibana specific object