kibana-sinatra 0.0.7 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/kibana-sinatra.gemspec +1 -0
- data/lib/kibana/assets/app/app.js +8 -3
- data/lib/kibana/assets/app/components/kbn.js +45 -10
- data/lib/kibana/assets/app/components/{underscore.extended.js → lodash.extended.js} +2 -4
- data/lib/kibana/assets/app/components/require.config.js +5 -6
- data/lib/kibana/assets/app/components/settings.js +1 -1
- data/lib/kibana/assets/app/controllers/dash.js +10 -5
- data/lib/kibana/assets/app/controllers/dashLoader.js +1 -1
- data/lib/kibana/assets/app/controllers/pulldown.js +1 -1
- data/lib/kibana/assets/app/controllers/row.js +1 -1
- data/lib/kibana/assets/app/dashboards/default.json +1 -1
- data/lib/kibana/assets/app/dashboards/logstash.js +4 -4
- data/lib/kibana/assets/app/dashboards/logstash.json +1 -1
- data/lib/kibana/assets/app/directives/addPanel.js +1 -1
- data/lib/kibana/assets/app/directives/arrayJoin.js +1 -1
- data/lib/kibana/assets/app/directives/configModal.js +23 -5
- data/lib/kibana/assets/app/directives/kibanaPanel.js +70 -50
- data/lib/kibana/assets/app/directives/kibanaSimplePanel.js +1 -1
- data/lib/kibana/assets/app/factories/store.js +59 -0
- data/lib/kibana/assets/app/filters/all.js +6 -13
- data/lib/kibana/assets/app/panels/bettermap/module.html +5 -0
- data/lib/kibana/assets/app/panels/bettermap/module.js +1 -1
- data/lib/kibana/assets/app/panels/column/editor.html +1 -1
- data/lib/kibana/assets/app/panels/column/module.js +7 -6
- data/lib/kibana/assets/app/panels/dashcontrol/module.js +1 -1
- data/lib/kibana/assets/app/panels/derivequeries/module.js +1 -1
- data/lib/kibana/assets/app/panels/fields/module.js +1 -1
- data/lib/kibana/assets/app/panels/filtering/module.html +10 -17
- data/lib/kibana/assets/app/panels/filtering/module.js +19 -1
- data/lib/kibana/assets/app/panels/histogram/module.html +4 -4
- data/lib/kibana/assets/app/panels/histogram/module.js +62 -12
- data/lib/kibana/assets/app/panels/histogram/timeSeries.js +6 -3
- data/lib/kibana/assets/app/panels/hits/module.js +1 -1
- data/lib/kibana/assets/app/panels/map/module.js +1 -1
- data/lib/kibana/assets/app/panels/pie/editor.html +1 -1
- data/lib/kibana/assets/app/panels/pie/module.js +1 -1
- data/lib/kibana/assets/app/panels/query/meta.html +1 -1
- data/lib/kibana/assets/app/panels/query/module.html +1 -1
- data/lib/kibana/assets/app/panels/query/module.js +2 -7
- data/lib/kibana/assets/app/panels/query/query.css +9 -7
- data/lib/kibana/assets/app/panels/sparklines/module.js +2 -2
- data/lib/kibana/assets/app/panels/sparklines/timeSeries.js +3 -3
- data/lib/kibana/assets/app/panels/stats/editor.html +36 -0
- data/lib/kibana/assets/app/panels/stats/module.html +15 -0
- data/lib/kibana/assets/app/panels/stats/module.js +199 -0
- data/lib/kibana/assets/app/panels/table/editor.html +23 -27
- data/lib/kibana/assets/app/panels/table/micropanel.html +3 -1
- data/lib/kibana/assets/app/panels/table/module.js +7 -1
- data/lib/kibana/assets/app/panels/terms/editor.html +16 -3
- data/lib/kibana/assets/app/panels/terms/module.html +14 -5
- data/lib/kibana/assets/app/panels/terms/module.js +66 -18
- data/lib/kibana/assets/app/panels/text/module.js +1 -1
- data/lib/kibana/assets/app/panels/timepicker/editor.html +14 -12
- data/lib/kibana/assets/app/panels/timepicker/module.html +3 -8
- data/lib/kibana/assets/app/panels/timepicker/module.js +1 -1
- data/lib/kibana/assets/app/panels/trends/module.js +1 -1
- data/lib/kibana/assets/app/partials/dashLoader.html +10 -10
- data/lib/kibana/assets/app/partials/dashboard.html +35 -44
- data/lib/kibana/assets/app/partials/dasheditor.html +7 -5
- data/lib/kibana/assets/app/partials/paneleditor.html +2 -1
- data/lib/kibana/assets/app/partials/panelgeneral.html +1 -1
- data/lib/kibana/assets/app/partials/roweditor.html +11 -9
- data/lib/kibana/assets/app/services/alertSrv.js +1 -1
- data/lib/kibana/assets/app/services/dashboard.js +27 -14
- data/lib/kibana/assets/app/services/esVersion.js +70 -31
- data/lib/kibana/assets/app/services/fields.js +14 -37
- data/lib/kibana/assets/app/services/filterSrv.js +7 -11
- data/lib/kibana/assets/app/services/kbnIndex.js +24 -15
- data/lib/kibana/assets/app/services/panelMove.js +1 -1
- data/lib/kibana/assets/app/services/querySrv.js +20 -6
- data/lib/kibana/assets/app/services/timer.js +1 -1
- data/lib/kibana/assets/css/bootstrap.dark.min.css +1 -1
- data/lib/kibana/assets/css/bootstrap.light.min.css +1 -1
- data/lib/kibana/assets/img/cubes.png +0 -0
- data/lib/kibana/assets/img/light.png +0 -0
- data/lib/kibana/assets/index.html +3 -2
- data/lib/kibana/assets/vendor/LICENSE.json +90 -0
- data/lib/kibana/assets/vendor/angular/angular-cookies.js +185 -0
- data/lib/kibana/assets/vendor/angular/angular-dragdrop.js +33 -4
- data/lib/kibana/assets/vendor/blob.js +178 -0
- data/lib/kibana/assets/vendor/bootstrap/bootstrap.js +6 -1
- data/lib/kibana/assets/vendor/bootstrap/less/bak/bootswatch.dark.less +555 -0
- data/lib/kibana/assets/vendor/bootstrap/less/bak/variables.dark.less +304 -0
- data/lib/kibana/assets/vendor/bootstrap/less/bootswatch.dark.less +349 -327
- data/lib/kibana/assets/vendor/bootstrap/less/bootswatch.light.less +590 -7
- data/lib/kibana/assets/vendor/bootstrap/less/modals.less +1 -1
- data/lib/kibana/assets/vendor/bootstrap/less/overrides.less +191 -75
- data/lib/kibana/assets/vendor/bootstrap/less/variables.dark.less +96 -97
- data/lib/kibana/assets/vendor/bootstrap/less/variables.light.less +84 -81
- data/lib/kibana/assets/vendor/jquery/jquery.flot.events.js +39 -51
- data/lib/kibana/assets/vendor/lodash.js +6785 -0
- data/lib/kibana/assets/vendor/numeral.js +565 -0
- data/lib/kibana/sinatra/version.rb +1 -1
- data/lib/kibana/views/config.erb +1 -0
- data/test/sinatra_test.rb +2 -2
- metadata +30 -4
- data/lib/kibana/assets/vendor/underscore.js +0 -1246
@@ -39,7 +39,8 @@
|
|
39
39
|
default logstash index pattern you might use
|
40
40
|
<code>[logstash-]YYYY.MM.DD</code>. The [] in "[logstash-]" are
|
41
41
|
important as they instruct Kibana not to treat those letters as a
|
42
|
-
pattern.
|
42
|
+
pattern. You may also specify multiple indices by seperating them with a comma(,).
|
43
|
+
For example <code>[web-]YYYY.MM.DD,[mail-]YYYY.MM.DD</code>
|
43
44
|
Please also note that indices should rollover at midnight <strong>UTC</strong>.
|
44
45
|
</p>
|
45
46
|
<p class="small">
|
@@ -79,7 +80,7 @@
|
|
79
80
|
<div class="row-fluid">
|
80
81
|
<div class="span8">
|
81
82
|
<h4>Rows</h4>
|
82
|
-
<table class="table table-
|
83
|
+
<table class="table table-striped">
|
83
84
|
<thead>
|
84
85
|
<th width="1%"></th>
|
85
86
|
<th width="1%"></th>
|
@@ -90,7 +91,7 @@
|
|
90
91
|
<td><i ng-click="_.move(dashboard.current.rows,$index,$index-1)" ng-hide="$first" class="pointer icon-arrow-up"></i></td>
|
91
92
|
<td><i ng-click="_.move(dashboard.current.rows,$index,$index+1)" ng-hide="$last" class="pointer icon-arrow-down"></i></td>
|
92
93
|
<td><i ng-click="dashboard.current.rows = _.without(dashboard.current.rows,row)" class="pointer icon-remove"></i></td>
|
93
|
-
<td>{{row.title}}</td>
|
94
|
+
<td>{{row.title||'Untitled'}}</td>
|
94
95
|
</tr>
|
95
96
|
</table>
|
96
97
|
</div>
|
@@ -177,6 +178,7 @@
|
|
177
178
|
</div>
|
178
179
|
|
179
180
|
<div class="modal-footer">
|
180
|
-
<button ng-click="add_row(dashboard.current,row); reset_row();" class="btn btn-
|
181
|
-
<button type="button" class="btn btn-
|
181
|
+
<button type="button" ng-click="add_row(dashboard.current,row); reset_row();" class="btn btn-info" ng-show="editor.index == 2">Create Row</button>
|
182
|
+
<button type="button" class="btn btn-success" ng-click="editor.index=0;editSave(dashboard);dismiss();reset_panel();dashboard.refresh()">Save</button>
|
183
|
+
<button type="button" class="btn btn-danger" ng-click="editor.index=0;dismiss();reset_panel();dashboard.refresh()">Cancel</button>
|
182
184
|
</div>
|
@@ -19,5 +19,6 @@
|
|
19
19
|
|
20
20
|
<div class="modal-footer">
|
21
21
|
<!-- close_edit() is provided here to allow for a scope to perform action on dismiss -->
|
22
|
-
<button type="button" class="btn btn-
|
22
|
+
<button type="button" class="btn btn-success" ng-click="editor.index=0;editSave(panel);close_edit();dismiss()">Save</button>
|
23
|
+
<button type="button" class="btn btn-danger" ng-click="editor.index=0;dismiss()">Cancel</button>
|
23
24
|
</div>
|
@@ -9,7 +9,7 @@
|
|
9
9
|
<label class="small">Title</label><input type="text" class="input-medium" ng-model='panel.title'></input>
|
10
10
|
</div>
|
11
11
|
<div class="editor-option" ng-hide="panel.sizeable == false">
|
12
|
-
<label class="small">Span</label> <select class="input-mini" ng-model="panel.span" ng-options="f for f in [
|
12
|
+
<label class="small">Span</label> <select class="input-mini" ng-model="panel.span" ng-options="f for f in [1,2,3,4,5,6,7,8,9,10,11,12]"></select>
|
13
13
|
</div>
|
14
14
|
<div class="editor-option">
|
15
15
|
<label class="small">Editable</label><input type="checkbox" ng-model="panel.editable" ng-checked="panel.editable">
|
@@ -6,23 +6,23 @@
|
|
6
6
|
</div>
|
7
7
|
</div>
|
8
8
|
|
9
|
-
<div class="row
|
10
|
-
<div class="
|
9
|
+
<div class="editor-row" ng-if="editor.index == 0">
|
10
|
+
<div class="editor-option">
|
11
11
|
<label class="small">Title</label><input type="text" class="input-medium" ng-model='row.title'></input>
|
12
12
|
</div>
|
13
|
-
<div class="
|
13
|
+
<div class="editor-option">
|
14
14
|
<label class="small">Height</label><input type="text" class="input-mini" ng-model='row.height'></input>
|
15
15
|
</div>
|
16
|
-
<div class="
|
16
|
+
<div class="editor-option">
|
17
17
|
<label class="small"> Editable </label><input type="checkbox" ng-model="row.editable" ng-checked="row.editable" />
|
18
18
|
</div>
|
19
|
-
<div class="
|
19
|
+
<div class="editor-option">
|
20
20
|
<label class="small"> Collapsable </label><input type="checkbox" ng-model="row.collapsable" ng-checked="row.collapsable" />
|
21
21
|
</div>
|
22
22
|
</div>
|
23
23
|
<div class="row-fluid" ng-if="editor.index == 1">
|
24
24
|
<div class="span12">
|
25
|
-
<h4>Panels
|
25
|
+
<h4>Panels</h4>
|
26
26
|
<table class="table table-condensed table-striped">
|
27
27
|
<thead>
|
28
28
|
<th>Title</th>
|
@@ -36,7 +36,7 @@
|
|
36
36
|
<tr ng-repeat="panel in row.panels">
|
37
37
|
<td>{{panel.title}}</td>
|
38
38
|
<td>{{panel.type}}</td>
|
39
|
-
<td><select ng-hide="panel.sizeable == false" class="input-mini" ng-model="panel.span" ng-options="size for size in [
|
39
|
+
<td><select ng-hide="panel.sizeable == false" class="input-mini" ng-model="panel.span" ng-options="size for size in [1,2,3,4,5,6,7,8,9,10,11,12]"></select></td>
|
40
40
|
<td><i ng-click="row.panels = _.without(row.panels,panel)" class="pointer icon-remove"></i></td>
|
41
41
|
<td><i ng-click="_.move(row.panels,$index,$index-1)" ng-hide="$first" class="pointer icon-arrow-up"></i></td>
|
42
42
|
<td><i ng-click="_.move(row.panels,$index,$index+1)" ng-hide="$last" class="pointer icon-arrow-down"></i></td>
|
@@ -60,6 +60,8 @@
|
|
60
60
|
</div>
|
61
61
|
</div>
|
62
62
|
<div class="modal-footer">
|
63
|
-
<button ng-show="
|
64
|
-
<button
|
63
|
+
<button ng-show="editor.index == 1" ng-click="editor.index = 2;" class="btn btn-info" ng-disabled="panel.loadingEditor">Add Panel</button>
|
64
|
+
<button ng-show="panel.type && editor.index == 2" ng-click="editSave(row);add_panel(row,panel);reset_panel();editor.index = 0;dismiss();" class="btn btn-success" ng-disabled="panel.loadingEditor">Save</button>
|
65
|
+
<button ng-hide="panel.type && editor.index == 2" ng-click="editor.index=0;editSave(row);dismiss();reset_panel();close_edit()" class="btn btn-success">Save</button>
|
66
|
+
<button type="button" class="btn btn-danger" ng-click="editor.index=0;dismiss();reset_panel();close_edit()">Cancel</button>
|
65
67
|
</div>
|
@@ -2,11 +2,12 @@ define([
|
|
2
2
|
'angular',
|
3
3
|
'jquery',
|
4
4
|
'kbn',
|
5
|
-
'
|
5
|
+
'lodash',
|
6
6
|
'config',
|
7
7
|
'moment',
|
8
8
|
'modernizr',
|
9
|
-
'filesaver'
|
9
|
+
'filesaver',
|
10
|
+
'blob'
|
10
11
|
],
|
11
12
|
function (angular, $, kbn, _, config, moment, Modernizr) {
|
12
13
|
'use strict';
|
@@ -15,7 +16,7 @@ function (angular, $, kbn, _, config, moment, Modernizr) {
|
|
15
16
|
|
16
17
|
module.service('dashboard', function(
|
17
18
|
$routeParams, $http, $rootScope, $injector, $location, $timeout,
|
18
|
-
ejsResource, timer, kbnIndex, alertSrv
|
19
|
+
ejsResource, timer, kbnIndex, alertSrv, esVersion, esMinVersion
|
19
20
|
) {
|
20
21
|
// A hash of defaults to use when loading a dashboard
|
21
22
|
|
@@ -79,7 +80,14 @@ function (angular, $, kbn, _, config, moment, Modernizr) {
|
|
79
80
|
// Clear the current dashboard to prevent reloading
|
80
81
|
self.current = {};
|
81
82
|
self.indices = [];
|
82
|
-
|
83
|
+
esVersion.isMinimum().then(function(isMinimum) {
|
84
|
+
if(isMinimum) {
|
85
|
+
route();
|
86
|
+
} else {
|
87
|
+
alertSrv.set('Upgrade Required',"Your version of Elasticsearch is too old. Kibana requires" +
|
88
|
+
" Elasticsearch " + esMinVersion + " or above.", "error");
|
89
|
+
}
|
90
|
+
});
|
83
91
|
});
|
84
92
|
|
85
93
|
var route = function() {
|
@@ -114,7 +122,6 @@ function (angular, $, kbn, _, config, moment, Modernizr) {
|
|
114
122
|
// as their default
|
115
123
|
if (Modernizr.localstorage) {
|
116
124
|
if(!(_.isUndefined(window.localStorage['dashboard'])) && window.localStorage['dashboard'] !== '') {
|
117
|
-
console.log(window.localStorage['dashboard']);
|
118
125
|
$location.path(config.default_route);
|
119
126
|
alertSrv.set('Saving to browser storage has been replaced',' with saving to Elasticsearch.'+
|
120
127
|
' Click <a href="#/dashboard/local/deprecated">here</a> to load your old dashboard anyway.');
|
@@ -247,7 +254,6 @@ function (angular, $, kbn, _, config, moment, Modernizr) {
|
|
247
254
|
};
|
248
255
|
|
249
256
|
this.set_default = function(route) {
|
250
|
-
console.log(route);
|
251
257
|
if (Modernizr.localstorage) {
|
252
258
|
// Purge any old dashboards
|
253
259
|
if(!_.isUndefined(window.localStorage['dashboard'])) {
|
@@ -490,18 +496,25 @@ function (angular, $, kbn, _, config, moment, Modernizr) {
|
|
490
496
|
});
|
491
497
|
};
|
492
498
|
|
499
|
+
this.start_scheduled_refresh = function (after_ms) {
|
500
|
+
timer.cancel(self.refresh_timer);
|
501
|
+
self.refresh_timer = timer.register($timeout(function () {
|
502
|
+
self.start_scheduled_refresh(after_ms);
|
503
|
+
self.refresh();
|
504
|
+
}, after_ms));
|
505
|
+
};
|
506
|
+
|
507
|
+
this.cancel_scheduled_refresh = function () {
|
508
|
+
timer.cancel(self.refresh_timer);
|
509
|
+
};
|
510
|
+
|
493
511
|
this.set_interval = function (interval) {
|
494
512
|
self.current.refresh = interval;
|
495
|
-
if(interval) {
|
513
|
+
if (interval) {
|
496
514
|
var _i = kbn.interval_to_ms(interval);
|
497
|
-
|
498
|
-
self.refresh_timer = timer.register($timeout(function() {
|
499
|
-
self.set_interval(interval);
|
500
|
-
self.refresh();
|
501
|
-
},_i));
|
502
|
-
self.refresh();
|
515
|
+
this.start_scheduled_refresh(_i);
|
503
516
|
} else {
|
504
|
-
|
517
|
+
this.cancel_scheduled_refresh();
|
505
518
|
}
|
506
519
|
};
|
507
520
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
define([
|
2
2
|
'angular',
|
3
|
-
'
|
3
|
+
'lodash',
|
4
4
|
'config'
|
5
5
|
],
|
6
6
|
function (angular, _, config) {
|
@@ -8,47 +8,55 @@ function (angular, _, config) {
|
|
8
8
|
|
9
9
|
var module = angular.module('kibana.services');
|
10
10
|
|
11
|
-
module.service('esVersion', function($http, alertSrv) {
|
11
|
+
module.service('esVersion', function($http, alertSrv, esMinVersion, $q) {
|
12
12
|
|
13
13
|
this.versions = [];
|
14
14
|
|
15
15
|
// save a reference to this
|
16
|
-
var self = this
|
16
|
+
var self = this,
|
17
|
+
defer = $q.defer();
|
17
18
|
|
18
19
|
this.init = function() {
|
19
20
|
getVersions();
|
20
21
|
};
|
21
22
|
|
22
23
|
var getVersions = function() {
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
}
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
}
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
24
|
+
if(self.versions.length !== 0) {
|
25
|
+
defer.resolve(self.versions);
|
26
|
+
return defer.promise;
|
27
|
+
} else {
|
28
|
+
var nodeInfo = $http({
|
29
|
+
url: config.elasticsearch + '/_nodes',
|
30
|
+
method: "GET",
|
31
|
+
}).error(function(data, status) {
|
32
|
+
if(status === 0) {
|
33
|
+
alertSrv.set('Error',"Could not contact Elasticsearch at "+config.elasticsearch+
|
34
|
+
". Please ensure that Elasticsearch is reachable from your system." ,'error');
|
35
|
+
} else {
|
36
|
+
alertSrv.set('Error',"Could not reach "+config.elasticsearch+"/_nodes. If you"+
|
37
|
+
" are using a proxy, ensure it is configured correctly",'error');
|
38
|
+
}
|
39
|
+
});
|
35
40
|
|
36
|
-
|
37
|
-
|
38
|
-
|
41
|
+
return nodeInfo.then(function(p) {
|
42
|
+
_.each(p.data.nodes, function(v) {
|
43
|
+
self.versions.push(v.version.split('-')[0]);
|
44
|
+
});
|
45
|
+
self.versions = sortVersions(_.uniq(self.versions));
|
46
|
+
return self.versions;
|
39
47
|
});
|
40
|
-
|
41
|
-
|
48
|
+
}
|
49
|
+
|
42
50
|
};
|
43
51
|
|
44
52
|
// Get the max version in this cluster
|
45
|
-
this.max = function() {
|
46
|
-
return _.last(
|
53
|
+
this.max = function(versions) {
|
54
|
+
return _.last(versions);
|
47
55
|
};
|
48
56
|
|
49
57
|
// Return the lowest version in the cluster
|
50
|
-
this.min = function() {
|
51
|
-
return _.first(
|
58
|
+
this.min = function(versions) {
|
59
|
+
return _.first(versions);
|
52
60
|
};
|
53
61
|
|
54
62
|
// Sort versions from lowest to highest
|
@@ -90,29 +98,47 @@ function (angular, _, config) {
|
|
90
98
|
return _cf;
|
91
99
|
};
|
92
100
|
|
101
|
+
this.isMinimum = function() {
|
102
|
+
return self.gte(esMinVersion);
|
103
|
+
};
|
104
|
+
|
93
105
|
// check if lowest version in cluster = `version`
|
94
106
|
this.eq = function(version) {
|
95
|
-
return
|
107
|
+
return getVersions().then(function(v) {
|
108
|
+
return version === self.min(v) ? true : false;
|
109
|
+
});
|
110
|
+
|
96
111
|
};
|
97
112
|
|
98
113
|
// version > lowest version in cluster?
|
99
114
|
this.gt = function(version) {
|
100
|
-
return
|
115
|
+
return getVersions().then(function(v) {
|
116
|
+
return version === self.min(v) ? false : self.gte(version);
|
117
|
+
});
|
118
|
+
|
101
119
|
};
|
102
120
|
|
103
121
|
// version < highest version in cluster?
|
104
122
|
this.lt = function(version) {
|
105
|
-
return
|
123
|
+
return getVersions().then(function(v) {
|
124
|
+
return version === self.max(v) ? false : self.lte(version);
|
125
|
+
});
|
126
|
+
|
106
127
|
};
|
107
128
|
|
108
129
|
// Check if the lowest version in the cluster is >= to `version`
|
109
130
|
this.gte = function(version) {
|
110
|
-
return
|
131
|
+
return getVersions().then(function(v) {
|
132
|
+
return self.compare(version,self.min(v));
|
133
|
+
});
|
134
|
+
|
111
135
|
};
|
112
136
|
|
113
137
|
// Check if the highest version in the cluster is <= to `version`
|
114
138
|
this.lte = function(version) {
|
115
|
-
return
|
139
|
+
return getVersions().then(function(v) {
|
140
|
+
return self.compare(self.max(v),version);
|
141
|
+
});
|
116
142
|
};
|
117
143
|
|
118
144
|
// Determine if a specific version is greater than or equal to another
|
@@ -121,10 +147,11 @@ function (angular, _, config) {
|
|
121
147
|
var b = required.split('.');
|
122
148
|
var i;
|
123
149
|
|
124
|
-
|
150
|
+
// leave suffixes as is ("RC1 or -SNAPSHOT")
|
151
|
+
for (i = 0; i < Math.min(a.length, 3); ++i) {
|
125
152
|
a[i] = Number(a[i]);
|
126
153
|
}
|
127
|
-
for (i = 0; i < b.length; ++i) {
|
154
|
+
for (i = 0; i < Math.min(b.length, 3); ++i) {
|
128
155
|
b[i] = Number(b[i]);
|
129
156
|
}
|
130
157
|
if (a.length === 2) {
|
@@ -140,6 +167,18 @@ function (angular, _, config) {
|
|
140
167
|
if (a[2] > b[2]){return true;}
|
141
168
|
if (a[2] < b[2]){return false;}
|
142
169
|
|
170
|
+
if (a.length > 3) {
|
171
|
+
// rc/beta suffix
|
172
|
+
if (b.length <= 3) {
|
173
|
+
return false;
|
174
|
+
} // no suffix on b -> a<b
|
175
|
+
return a[3] >= b[3];
|
176
|
+
}
|
177
|
+
if (b.length > 3) {
|
178
|
+
// b has a suffix but a not -> a>b
|
179
|
+
return true;
|
180
|
+
}
|
181
|
+
|
143
182
|
return true;
|
144
183
|
};
|
145
184
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
define([
|
2
2
|
'angular',
|
3
|
-
'
|
3
|
+
'lodash',
|
4
4
|
'config'
|
5
5
|
],
|
6
6
|
function (angular, _, config) {
|
@@ -8,7 +8,8 @@ function (angular, _, config) {
|
|
8
8
|
|
9
9
|
var module = angular.module('kibana.services');
|
10
10
|
|
11
|
-
module.service('fields', function(dashboard, $rootScope, $http, alertSrv) {
|
11
|
+
module.service('fields', function(dashboard, $rootScope, $http, esVersion, alertSrv) {
|
12
|
+
|
12
13
|
// Save a reference to this
|
13
14
|
var self = this;
|
14
15
|
|
@@ -36,7 +37,8 @@ function (angular, _, config) {
|
|
36
37
|
var fields = [];
|
37
38
|
_.each(m, function(types) {
|
38
39
|
_.each(types, function(type) {
|
39
|
-
fields = _.
|
40
|
+
fields = _.difference(_.union(fields,_.keys(type)),
|
41
|
+
['_parent','_routing','_size','_ttl','_all','_uid','_version','_boost','_source']);
|
40
42
|
});
|
41
43
|
});
|
42
44
|
return fields;
|
@@ -44,7 +46,7 @@ function (angular, _, config) {
|
|
44
46
|
|
45
47
|
this.map = function(indices) {
|
46
48
|
var request = $http({
|
47
|
-
url: config.elasticsearch + "/" + indices.join(',') + "/_mapping",
|
49
|
+
url: config.elasticsearch + "/" + indices.join(',') + "/_mapping/field/*",
|
48
50
|
method: "GET"
|
49
51
|
}).error(function(data, status) {
|
50
52
|
if(status === 0) {
|
@@ -52,7 +54,7 @@ function (angular, _, config) {
|
|
52
54
|
". Please ensure that Elasticsearch is reachable from your system." ,'error');
|
53
55
|
} else {
|
54
56
|
alertSrv.set('Error',"No index found at "+config.elasticsearch+"/" +
|
55
|
-
indices.join(',')+"/_mapping
|
57
|
+
indices.join(',')+"/_mapping/field/*. Please create at least one index." +
|
56
58
|
"If you're using a proxy ensure it is configured correctly.",'error');
|
57
59
|
}
|
58
60
|
});
|
@@ -60,43 +62,18 @@ function (angular, _, config) {
|
|
60
62
|
// Flatten the mapping of each index into dot notated keys.
|
61
63
|
return request.then(function(p) {
|
62
64
|
var mapping = {};
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
65
|
+
return esVersion.gte('1.0.0.RC1').then(function(version) {
|
66
|
+
_.each(p.data, function(indexMap,index) {
|
67
|
+
mapping[index] = {};
|
68
|
+
_.each((version ? indexMap.mappings : indexMap), function (typeMap,type) {
|
69
|
+
mapping[index][type] = typeMap;
|
70
|
+
});
|
67
71
|
});
|
72
|
+
return mapping;
|
68
73
|
});
|
69
|
-
return mapping;
|
70
74
|
});
|
71
75
|
};
|
72
76
|
|
73
|
-
var flatten = function(obj,prefix) {
|
74
|
-
var propName = (prefix) ? prefix : '',
|
75
|
-
dot = (prefix) ? '.':'',
|
76
|
-
ret = {};
|
77
|
-
for(var attr in obj){
|
78
|
-
if(attr === 'dynamic_templates' || attr === '_default_') {
|
79
|
-
continue;
|
80
|
-
}
|
81
|
-
// For now only support multi field on the top level
|
82
|
-
// and if there is a default field set.
|
83
|
-
if(obj[attr]['type'] === 'multi_field') {
|
84
|
-
ret[attr] = obj[attr]['fields'][attr] || obj[attr];
|
85
|
-
var keys = _.without(_.keys(obj[attr]['fields']),attr);
|
86
|
-
for(var key in keys) {
|
87
|
-
ret[attr+'.'+keys[key]] = obj[attr]['fields'][keys[key]];
|
88
|
-
}
|
89
|
-
} else if (attr === 'properties') {
|
90
|
-
_.extend(ret,flatten(obj[attr], propName));
|
91
|
-
} else if(typeof obj[attr] === 'object'){
|
92
|
-
_.extend(ret,flatten(obj[attr], propName + dot + attr));
|
93
|
-
} else {
|
94
|
-
ret[propName] = obj;
|
95
|
-
}
|
96
|
-
}
|
97
|
-
return ret;
|
98
|
-
};
|
99
|
-
|
100
77
|
});
|
101
78
|
|
102
79
|
});
|