kibana-sinatra 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/kibana-sinatra.gemspec +24 -0
- data/lib/kibana/assets/app/app.js +140 -0
- data/lib/kibana/assets/app/components/extend-jquery.js +46 -0
- data/lib/kibana/assets/app/components/kbn.js +332 -0
- data/lib/kibana/assets/app/components/require.config.js +90 -0
- data/lib/kibana/assets/app/components/settings.js +27 -0
- data/lib/kibana/assets/app/components/underscore.extended.js +32 -0
- data/lib/kibana/assets/app/controllers/all.js +5 -0
- data/lib/kibana/assets/app/controllers/dash.js +91 -0
- data/lib/kibana/assets/app/controllers/dashLoader.js +123 -0
- data/lib/kibana/assets/app/controllers/row.js +76 -0
- data/lib/kibana/assets/app/dashboards/blank.json +42 -0
- data/lib/kibana/assets/app/dashboards/default.json +89 -0
- data/lib/kibana/assets/app/dashboards/guided.json +274 -0
- data/lib/kibana/assets/app/dashboards/logstash.js +181 -0
- data/lib/kibana/assets/app/dashboards/logstash.json +222 -0
- data/lib/kibana/assets/app/dashboards/noted.json +202 -0
- data/lib/kibana/assets/app/directives/addPanel.js +30 -0
- data/lib/kibana/assets/app/directives/all.js +10 -0
- data/lib/kibana/assets/app/directives/arrayJoin.js +34 -0
- data/lib/kibana/assets/app/directives/confirmClick.js +26 -0
- data/lib/kibana/assets/app/directives/dashUpload.js +37 -0
- data/lib/kibana/assets/app/directives/kibanaPanel.js +103 -0
- data/lib/kibana/assets/app/directives/ngBlur.js +20 -0
- data/lib/kibana/assets/app/directives/ngModelOnBlur.js +25 -0
- data/lib/kibana/assets/app/directives/tip.js +20 -0
- data/lib/kibana/assets/app/filters/all.js +110 -0
- data/lib/kibana/assets/app/panels/bettermap/editor.html +17 -0
- data/lib/kibana/assets/app/panels/bettermap/leaflet/images/layers-2x.png +0 -0
- data/lib/kibana/assets/app/panels/bettermap/leaflet/images/layers.png +0 -0
- data/lib/kibana/assets/app/panels/bettermap/leaflet/images/marker-icon-2x.png +0 -0
- data/lib/kibana/assets/app/panels/bettermap/leaflet/images/marker-icon.png +0 -0
- data/lib/kibana/assets/app/panels/bettermap/leaflet/images/marker-shadow.png +0 -0
- data/lib/kibana/assets/app/panels/bettermap/leaflet/leaflet-src.js +8724 -0
- data/lib/kibana/assets/app/panels/bettermap/leaflet/leaflet.css +463 -0
- data/lib/kibana/assets/app/panels/bettermap/leaflet/leaflet.ie.css +51 -0
- data/lib/kibana/assets/app/panels/bettermap/leaflet/leaflet.js +8 -0
- data/lib/kibana/assets/app/panels/bettermap/leaflet/plugins.css +75 -0
- data/lib/kibana/assets/app/panels/bettermap/leaflet/plugins.js +16 -0
- data/lib/kibana/assets/app/panels/bettermap/module.css +4 -0
- data/lib/kibana/assets/app/panels/bettermap/module.html +6 -0
- data/lib/kibana/assets/app/panels/bettermap/module.js +232 -0
- data/lib/kibana/assets/app/panels/column/editor.html +36 -0
- data/lib/kibana/assets/app/panels/column/module.html +16 -0
- data/lib/kibana/assets/app/panels/column/module.js +105 -0
- data/lib/kibana/assets/app/panels/column/panelgeneral.html +11 -0
- data/lib/kibana/assets/app/panels/dashcontrol/editor.html +44 -0
- data/lib/kibana/assets/app/panels/dashcontrol/load.html +40 -0
- data/lib/kibana/assets/app/panels/dashcontrol/module.html +6 -0
- data/lib/kibana/assets/app/panels/dashcontrol/module.js +198 -0
- data/lib/kibana/assets/app/panels/dashcontrol/save.html +30 -0
- data/lib/kibana/assets/app/panels/dashcontrol/share.html +11 -0
- data/lib/kibana/assets/app/panels/derivequeries/editor.html +23 -0
- data/lib/kibana/assets/app/panels/derivequeries/module.html +33 -0
- data/lib/kibana/assets/app/panels/derivequeries/module.js +160 -0
- data/lib/kibana/assets/app/panels/fields/editor.html +10 -0
- data/lib/kibana/assets/app/panels/fields/micropanel.html +25 -0
- data/lib/kibana/assets/app/panels/fields/module.html +3 -0
- data/lib/kibana/assets/app/panels/fields/module.js +37 -0
- data/lib/kibana/assets/app/panels/filtering/editor.html +7 -0
- data/lib/kibana/assets/app/panels/filtering/meta.html +15 -0
- data/lib/kibana/assets/app/panels/filtering/module.html +78 -0
- data/lib/kibana/assets/app/panels/filtering/module.js +66 -0
- data/lib/kibana/assets/app/panels/histogram/editor.html +74 -0
- data/lib/kibana/assets/app/panels/histogram/interval.js +57 -0
- data/lib/kibana/assets/app/panels/histogram/module.html +91 -0
- data/lib/kibana/assets/app/panels/histogram/module.js +511 -0
- data/lib/kibana/assets/app/panels/histogram/timeSeries.js +179 -0
- data/lib/kibana/assets/app/panels/hits/editor.html +29 -0
- data/lib/kibana/assets/app/panels/hits/module.html +44 -0
- data/lib/kibana/assets/app/panels/hits/module.js +270 -0
- data/lib/kibana/assets/app/panels/map/editor.html +15 -0
- data/lib/kibana/assets/app/panels/map/lib/jquery.jvectormap.min.js +8 -0
- data/lib/kibana/assets/app/panels/map/lib/map.europe.js +1 -0
- data/lib/kibana/assets/app/panels/map/lib/map.usa.js +1 -0
- data/lib/kibana/assets/app/panels/map/lib/map.world.js +1 -0
- data/lib/kibana/assets/app/panels/map/module.html +63 -0
- data/lib/kibana/assets/app/panels/map/module.js +185 -0
- data/lib/kibana/assets/app/panels/pie/editor.html +49 -0
- data/lib/kibana/assets/app/panels/pie/module.html +12 -0
- data/lib/kibana/assets/app/panels/pie/module.js +297 -0
- data/lib/kibana/assets/app/panels/query/editor.html +7 -0
- data/lib/kibana/assets/app/panels/query/meta.html +21 -0
- data/lib/kibana/assets/app/panels/query/module.html +25 -0
- data/lib/kibana/assets/app/panels/query/module.js +69 -0
- data/lib/kibana/assets/app/panels/query/query.css +39 -0
- data/lib/kibana/assets/app/panels/table/editor.html +48 -0
- data/lib/kibana/assets/app/panels/table/micropanel.html +44 -0
- data/lib/kibana/assets/app/panels/table/module.html +104 -0
- data/lib/kibana/assets/app/panels/table/module.js +389 -0
- data/lib/kibana/assets/app/panels/table/pagination.html +27 -0
- data/lib/kibana/assets/app/panels/terms/editor.html +51 -0
- data/lib/kibana/assets/app/panels/terms/module.html +55 -0
- data/lib/kibana/assets/app/panels/terms/module.js +307 -0
- data/lib/kibana/assets/app/panels/text/editor.html +16 -0
- data/lib/kibana/assets/app/panels/text/lib/showdown.js +1454 -0
- data/lib/kibana/assets/app/panels/text/module.html +10 -0
- data/lib/kibana/assets/app/panels/text/module.js +85 -0
- data/lib/kibana/assets/app/panels/timepicker/editor.html +34 -0
- data/lib/kibana/assets/app/panels/timepicker/module.html +73 -0
- data/lib/kibana/assets/app/panels/timepicker/module.js +268 -0
- data/lib/kibana/assets/app/panels/timepicker/refreshctrl.html +5 -0
- data/lib/kibana/assets/app/panels/trends/editor.html +20 -0
- data/lib/kibana/assets/app/panels/trends/module.html +11 -0
- data/lib/kibana/assets/app/panels/trends/module.js +232 -0
- data/lib/kibana/assets/app/partials/dashLoader.html +78 -0
- data/lib/kibana/assets/app/partials/dashLoaderShare.html +11 -0
- data/lib/kibana/assets/app/partials/dashboard.html +77 -0
- data/lib/kibana/assets/app/partials/dasheditor.html +151 -0
- data/lib/kibana/assets/app/partials/inspector.html +15 -0
- data/lib/kibana/assets/app/partials/load.html +4 -0
- data/lib/kibana/assets/app/partials/modal.html +12 -0
- data/lib/kibana/assets/app/partials/paneladd.html +6 -0
- data/lib/kibana/assets/app/partials/paneleditor.html +23 -0
- data/lib/kibana/assets/app/partials/panelgeneral.html +22 -0
- data/lib/kibana/assets/app/partials/querySelect.html +24 -0
- data/lib/kibana/assets/app/partials/roweditor.html +65 -0
- data/lib/kibana/assets/app/services/alertSrv.js +49 -0
- data/lib/kibana/assets/app/services/all.js +11 -0
- data/lib/kibana/assets/app/services/dashboard.js +417 -0
- data/lib/kibana/assets/app/services/fields.js +96 -0
- data/lib/kibana/assets/app/services/filterSrv.js +200 -0
- data/lib/kibana/assets/app/services/kbnIndex.js +101 -0
- data/lib/kibana/assets/app/services/panelMove.js +83 -0
- data/lib/kibana/assets/app/services/querySrv.js +147 -0
- data/lib/kibana/assets/app/services/timer.js +34 -0
- data/lib/kibana/assets/css/animate.min.css +3270 -0
- data/lib/kibana/assets/css/bootstrap-responsive.min.css +9 -0
- data/lib/kibana/assets/css/bootstrap.dark.min.css +9 -0
- data/lib/kibana/assets/css/bootstrap.light.min.css +9 -0
- data/lib/kibana/assets/css/font-awesome.min.css +403 -0
- data/lib/kibana/assets/css/main.css +193 -0
- data/lib/kibana/assets/css/normalize.min.css +1 -0
- data/lib/kibana/assets/css/timepicker.css +423 -0
- data/lib/kibana/assets/font/FontAwesome.otf +0 -0
- data/lib/kibana/assets/font/fontawesome-webfont.eot +0 -0
- data/lib/kibana/assets/font/fontawesome-webfont.svg +399 -0
- data/lib/kibana/assets/font/fontawesome-webfont.ttf +0 -0
- data/lib/kibana/assets/font/fontawesome-webfont.woff +0 -0
- data/lib/kibana/assets/img/glyphicons-halflings-white.png +0 -0
- data/lib/kibana/assets/img/glyphicons-halflings.png +0 -0
- data/lib/kibana/assets/img/kibana.png +0 -0
- data/lib/kibana/assets/img/load.gif +0 -0
- data/lib/kibana/assets/img/load_big.gif +0 -0
- data/lib/kibana/assets/index.html +49 -0
- data/lib/kibana/assets/vendor/angular/angular-dragdrop.js +304 -0
- data/lib/kibana/assets/vendor/angular/angular-sanitize.js +556 -0
- data/lib/kibana/assets/vendor/angular/angular-strap.js +875 -0
- data/lib/kibana/assets/vendor/angular/angular.js +15158 -0
- data/lib/kibana/assets/vendor/angular/datepicker.js +1046 -0
- data/lib/kibana/assets/vendor/angular/timepicker.js +888 -0
- data/lib/kibana/assets/vendor/bootstrap/bootstrap.js +2280 -0
- data/lib/kibana/assets/vendor/bootstrap/less/accordion.less +34 -0
- data/lib/kibana/assets/vendor/bootstrap/less/alerts.less +79 -0
- data/lib/kibana/assets/vendor/bootstrap/less/bootstrap.dark.less +4 -0
- data/lib/kibana/assets/vendor/bootstrap/less/bootstrap.less +63 -0
- data/lib/kibana/assets/vendor/bootstrap/less/bootstrap.light.less +4 -0
- data/lib/kibana/assets/vendor/bootstrap/less/bootswatch.dark.less +554 -0
- data/lib/kibana/assets/vendor/bootstrap/less/bootswatch.light.less +9 -0
- data/lib/kibana/assets/vendor/bootstrap/less/breadcrumbs.less +24 -0
- data/lib/kibana/assets/vendor/bootstrap/less/button-groups.less +229 -0
- data/lib/kibana/assets/vendor/bootstrap/less/buttons.less +228 -0
- data/lib/kibana/assets/vendor/bootstrap/less/carousel.less +158 -0
- data/lib/kibana/assets/vendor/bootstrap/less/close.less +32 -0
- data/lib/kibana/assets/vendor/bootstrap/less/code.less +61 -0
- data/lib/kibana/assets/vendor/bootstrap/less/component-animations.less +22 -0
- data/lib/kibana/assets/vendor/bootstrap/less/dropdowns.less +248 -0
- data/lib/kibana/assets/vendor/bootstrap/less/forms.less +690 -0
- data/lib/kibana/assets/vendor/bootstrap/less/grid.less +21 -0
- data/lib/kibana/assets/vendor/bootstrap/less/hero-unit.less +25 -0
- data/lib/kibana/assets/vendor/bootstrap/less/labels-badges.less +84 -0
- data/lib/kibana/assets/vendor/bootstrap/less/layouts.less +16 -0
- data/lib/kibana/assets/vendor/bootstrap/less/media.less +55 -0
- data/lib/kibana/assets/vendor/bootstrap/less/mixins.less +702 -0
- data/lib/kibana/assets/vendor/bootstrap/less/modals.less +95 -0
- data/lib/kibana/assets/vendor/bootstrap/less/navbar.less +497 -0
- data/lib/kibana/assets/vendor/bootstrap/less/navs.less +409 -0
- data/lib/kibana/assets/vendor/bootstrap/less/overrides.less +237 -0
- data/lib/kibana/assets/vendor/bootstrap/less/pager.less +43 -0
- data/lib/kibana/assets/vendor/bootstrap/less/pagination.less +123 -0
- data/lib/kibana/assets/vendor/bootstrap/less/popovers.less +133 -0
- data/lib/kibana/assets/vendor/bootstrap/less/progress-bars.less +122 -0
- data/lib/kibana/assets/vendor/bootstrap/less/reset.less +216 -0
- data/lib/kibana/assets/vendor/bootstrap/less/responsive-1200px-min.less +28 -0
- data/lib/kibana/assets/vendor/bootstrap/less/responsive-767px-max.less +193 -0
- data/lib/kibana/assets/vendor/bootstrap/less/responsive-768px-979px.less +19 -0
- data/lib/kibana/assets/vendor/bootstrap/less/responsive-navbar.less +189 -0
- data/lib/kibana/assets/vendor/bootstrap/less/responsive-utilities.less +59 -0
- data/lib/kibana/assets/vendor/bootstrap/less/responsive.less +48 -0
- data/lib/kibana/assets/vendor/bootstrap/less/scaffolding.less +53 -0
- data/lib/kibana/assets/vendor/bootstrap/less/sprites.less +197 -0
- data/lib/kibana/assets/vendor/bootstrap/less/tables.less +244 -0
- data/lib/kibana/assets/vendor/bootstrap/less/tests/buttons.html +139 -0
- data/lib/kibana/assets/vendor/bootstrap/less/tests/css-tests.css +150 -0
- data/lib/kibana/assets/vendor/bootstrap/less/tests/css-tests.html +1399 -0
- data/lib/kibana/assets/vendor/bootstrap/less/tests/forms-responsive.html +71 -0
- data/lib/kibana/assets/vendor/bootstrap/less/tests/forms.html +179 -0
- data/lib/kibana/assets/vendor/bootstrap/less/tests/navbar-fixed-top.html +104 -0
- data/lib/kibana/assets/vendor/bootstrap/less/tests/navbar-static-top.html +107 -0
- data/lib/kibana/assets/vendor/bootstrap/less/tests/navbar.html +107 -0
- data/lib/kibana/assets/vendor/bootstrap/less/thumbnails.less +53 -0
- data/lib/kibana/assets/vendor/bootstrap/less/tooltip.less +70 -0
- data/lib/kibana/assets/vendor/bootstrap/less/type.less +247 -0
- data/lib/kibana/assets/vendor/bootstrap/less/utilities.less +30 -0
- data/lib/kibana/assets/vendor/bootstrap/less/variables.dark.less +304 -0
- data/lib/kibana/assets/vendor/bootstrap/less/variables.less +301 -0
- data/lib/kibana/assets/vendor/bootstrap/less/variables.light.less +301 -0
- data/lib/kibana/assets/vendor/bootstrap/less/wells.less +29 -0
- data/lib/kibana/assets/vendor/elasticjs/elastic-angular-client.js +81 -0
- data/lib/kibana/assets/vendor/elasticjs/elastic.js +19993 -0
- data/lib/kibana/assets/vendor/filesaver.js +216 -0
- data/lib/kibana/assets/vendor/jquery/jquery-1.8.0.js +2 -0
- data/lib/kibana/assets/vendor/jquery/jquery-ui-1.10.3.js +5253 -0
- data/lib/kibana/assets/vendor/jquery/jquery.flot.js +3060 -0
- data/lib/kibana/assets/vendor/jquery/jquery.flot.pie.js +817 -0
- data/lib/kibana/assets/vendor/jquery/jquery.flot.selection.js +360 -0
- data/lib/kibana/assets/vendor/jquery/jquery.flot.stack.js +188 -0
- data/lib/kibana/assets/vendor/jquery/jquery.flot.stackpercent.js +126 -0
- data/lib/kibana/assets/vendor/jquery/jquery.flot.time.js +431 -0
- data/lib/kibana/assets/vendor/modernizr-2.6.1.js +4 -0
- data/lib/kibana/assets/vendor/moment.js +1662 -0
- data/lib/kibana/assets/vendor/require/css-build.js +78 -0
- data/lib/kibana/assets/vendor/require/css.js +23 -0
- data/lib/kibana/assets/vendor/require/require.js +2024 -0
- data/lib/kibana/assets/vendor/require/text.js +386 -0
- data/lib/kibana/assets/vendor/require/tmpl.js +17 -0
- data/lib/kibana/assets/vendor/timezone.js +993 -0
- data/lib/kibana/assets/vendor/underscore.js +1246 -0
- data/lib/kibana/sinatra.rb +3 -0
- data/lib/kibana/sinatra/version.rb +5 -0
- data/lib/kibana/sinatra/web.rb +28 -0
- data/lib/kibana/views/config.erb +54 -0
- metadata +325 -0
@@ -0,0 +1,96 @@
|
|
1
|
+
define([
|
2
|
+
'angular',
|
3
|
+
'underscore',
|
4
|
+
'config'
|
5
|
+
],
|
6
|
+
function (angular, _, config) {
|
7
|
+
'use strict';
|
8
|
+
|
9
|
+
var module = angular.module('kibana.services');
|
10
|
+
|
11
|
+
module.service('fields', function(dashboard, $rootScope, $http, alertSrv) {
|
12
|
+
// Save a reference to this
|
13
|
+
var self = this;
|
14
|
+
|
15
|
+
this.list = ['_type'];
|
16
|
+
this.mapping = {};
|
17
|
+
|
18
|
+
$rootScope.$watch(function(){return dashboard.indices;},function(n) {
|
19
|
+
if(!_.isUndefined(n) && n.length) {
|
20
|
+
// Only get the mapping for indices we don't know it for
|
21
|
+
var indices = _.difference(n,_.keys(self.mapping));
|
22
|
+
// Only get the mapping if there are indices
|
23
|
+
if(indices.length > 0) {
|
24
|
+
self.map(indices).then(function(result) {
|
25
|
+
self.mapping = _.extend(self.mapping,result);
|
26
|
+
self.list = mapFields(self.mapping);
|
27
|
+
});
|
28
|
+
// Otherwise just use the cached mapping
|
29
|
+
} else {
|
30
|
+
self.list = mapFields(_.pick(self.mapping,n));
|
31
|
+
}
|
32
|
+
}
|
33
|
+
});
|
34
|
+
|
35
|
+
var mapFields = function (m) {
|
36
|
+
var fields = [];
|
37
|
+
_.each(m, function(types) {
|
38
|
+
_.each(types, function(v) {
|
39
|
+
fields = _.union(fields,_.keys(v));
|
40
|
+
});
|
41
|
+
});
|
42
|
+
return fields;
|
43
|
+
};
|
44
|
+
|
45
|
+
this.map = function(indices) {
|
46
|
+
var request = $http({
|
47
|
+
url: config.elasticsearch + "/" + indices.join(',') + "/_mapping",
|
48
|
+
method: "GET"
|
49
|
+
}).error(function(data, status) {
|
50
|
+
if(status === 0) {
|
51
|
+
alertSrv.set('Error',"Could not contact Elasticsearch at "+config.elasticsearch+
|
52
|
+
". Please ensure that Elasticsearch is reachable from your system." ,'error');
|
53
|
+
} else {
|
54
|
+
alertSrv.set('Error',"No index found at "+config.elasticsearch+"/" +
|
55
|
+
indices.join(',')+"/_mapping. Please create at least one index." +
|
56
|
+
"If you're using a proxy ensure it is configured correctly.",'error');
|
57
|
+
}
|
58
|
+
});
|
59
|
+
|
60
|
+
return request.then(function(p) {
|
61
|
+
var mapping = {};
|
62
|
+
_.each(p.data, function(v,k) {
|
63
|
+
mapping[k] = {};
|
64
|
+
_.each(v, function (v,f) {
|
65
|
+
mapping[k][f] = flatten(v);
|
66
|
+
});
|
67
|
+
});
|
68
|
+
return mapping;
|
69
|
+
});
|
70
|
+
};
|
71
|
+
|
72
|
+
var flatten = function(obj,prefix) {
|
73
|
+
var propName = (prefix) ? prefix : '',
|
74
|
+
dot = (prefix) ? '.':'',
|
75
|
+
ret = {};
|
76
|
+
for(var attr in obj){
|
77
|
+
// For now only support multi field on the top level
|
78
|
+
// and if if there is a default field set.
|
79
|
+
if(obj[attr]['type'] === 'multi_field') {
|
80
|
+
ret[attr] = obj[attr]['fields'][attr] || obj[attr];
|
81
|
+
continue;
|
82
|
+
}
|
83
|
+
if (attr === 'properties') {
|
84
|
+
_.extend(ret,flatten(obj[attr], propName));
|
85
|
+
} else if(typeof obj[attr] === 'object'){
|
86
|
+
_.extend(ret,flatten(obj[attr], propName + dot + attr));
|
87
|
+
} else {
|
88
|
+
ret[propName] = obj;
|
89
|
+
}
|
90
|
+
}
|
91
|
+
return ret;
|
92
|
+
};
|
93
|
+
|
94
|
+
});
|
95
|
+
|
96
|
+
});
|
@@ -0,0 +1,200 @@
|
|
1
|
+
define([
|
2
|
+
'angular',
|
3
|
+
'underscore',
|
4
|
+
'config'
|
5
|
+
], function (angular, _, config) {
|
6
|
+
'use strict';
|
7
|
+
|
8
|
+
var module = angular.module('kibana.services');
|
9
|
+
|
10
|
+
module.service('filterSrv', function(dashboard, ejsResource) {
|
11
|
+
// Create an object to hold our service state on the dashboard
|
12
|
+
dashboard.current.services.filter = dashboard.current.services.filter || {};
|
13
|
+
|
14
|
+
// Defaults for it
|
15
|
+
var _d = {
|
16
|
+
idQueue : [],
|
17
|
+
list : {},
|
18
|
+
ids : []
|
19
|
+
};
|
20
|
+
|
21
|
+
// For convenience
|
22
|
+
var ejs = ejsResource(config.elasticsearch);
|
23
|
+
var _f = dashboard.current.services.filter;
|
24
|
+
|
25
|
+
// Save a reference to this
|
26
|
+
var self = this;
|
27
|
+
|
28
|
+
// Call this whenever we need to reload the important stuff
|
29
|
+
this.init = function() {
|
30
|
+
// Populate defaults
|
31
|
+
_.defaults(dashboard.current.services.filter,_d);
|
32
|
+
|
33
|
+
// Accessors
|
34
|
+
self.list = dashboard.current.services.filter.list;
|
35
|
+
self.ids = dashboard.current.services.filter.ids;
|
36
|
+
_f = dashboard.current.services.filter;
|
37
|
+
|
38
|
+
_.each(self.getByType('time',true),function(time) {
|
39
|
+
self.list[time.id].from = new Date(time.from);
|
40
|
+
self.list[time.id].to = new Date(time.to);
|
41
|
+
});
|
42
|
+
|
43
|
+
};
|
44
|
+
|
45
|
+
// This is used both for adding filters and modifying them.
|
46
|
+
// If an id is passed, the filter at that id is updated
|
47
|
+
this.set = function(filter,id) {
|
48
|
+
_.defaults(filter,{mandate:'must'});
|
49
|
+
filter.active = true;
|
50
|
+
if(!_.isUndefined(id)) {
|
51
|
+
if(!_.isUndefined(self.list[id])) {
|
52
|
+
_.extend(self.list[id],filter);
|
53
|
+
return id;
|
54
|
+
} else {
|
55
|
+
return false;
|
56
|
+
}
|
57
|
+
} else {
|
58
|
+
if(_.isUndefined(filter.type)) {
|
59
|
+
return false;
|
60
|
+
} else {
|
61
|
+
var _id = nextId();
|
62
|
+
var _filter = {
|
63
|
+
alias: '',
|
64
|
+
id: _id
|
65
|
+
};
|
66
|
+
_.defaults(filter,_filter);
|
67
|
+
self.list[_id] = filter;
|
68
|
+
self.ids.push(_id);
|
69
|
+
return _id;
|
70
|
+
}
|
71
|
+
}
|
72
|
+
};
|
73
|
+
|
74
|
+
this.getBoolFilter = function(ids) {
|
75
|
+
// A default match all filter, just in case there are no other filters
|
76
|
+
var bool = ejs.BoolFilter().must(ejs.MatchAllFilter());
|
77
|
+
var either_bool = ejs.BoolFilter().must(ejs.MatchAllFilter());
|
78
|
+
_.each(ids,function(id) {
|
79
|
+
if(self.list[id].active) {
|
80
|
+
switch(self.list[id].mandate)
|
81
|
+
{
|
82
|
+
case 'mustNot':
|
83
|
+
bool = bool.mustNot(self.getEjsObj(id));
|
84
|
+
break;
|
85
|
+
case 'either':
|
86
|
+
either_bool = either_bool.should(self.getEjsObj(id));
|
87
|
+
break;
|
88
|
+
default:
|
89
|
+
bool = bool.must(self.getEjsObj(id));
|
90
|
+
}
|
91
|
+
}
|
92
|
+
});
|
93
|
+
return bool.must(either_bool);
|
94
|
+
};
|
95
|
+
|
96
|
+
this.getEjsObj = function(id) {
|
97
|
+
return self.toEjsObj(self.list[id]);
|
98
|
+
};
|
99
|
+
|
100
|
+
this.toEjsObj = function (filter) {
|
101
|
+
if(!filter.active) {
|
102
|
+
return false;
|
103
|
+
}
|
104
|
+
switch(filter.type)
|
105
|
+
{
|
106
|
+
case 'time':
|
107
|
+
return ejs.RangeFilter(filter.field)
|
108
|
+
.from(filter.from.valueOf())
|
109
|
+
.to(filter.to.valueOf());
|
110
|
+
case 'range':
|
111
|
+
return ejs.RangeFilter(filter.field)
|
112
|
+
.from(filter.from)
|
113
|
+
.to(filter.to);
|
114
|
+
case 'querystring':
|
115
|
+
return ejs.QueryFilter(ejs.QueryStringQuery(filter.query)).cache(true);
|
116
|
+
case 'field':
|
117
|
+
return ejs.QueryFilter(ejs.FieldQuery(filter.field,filter.query)).cache(true);
|
118
|
+
case 'terms':
|
119
|
+
return ejs.TermsFilter(filter.field,filter.value);
|
120
|
+
case 'exists':
|
121
|
+
return ejs.ExistsFilter(filter.field);
|
122
|
+
case 'missing':
|
123
|
+
return ejs.MissingFilter(filter.field);
|
124
|
+
default:
|
125
|
+
return false;
|
126
|
+
}
|
127
|
+
};
|
128
|
+
|
129
|
+
this.getByType = function(type,inactive) {
|
130
|
+
return _.pick(self.list,self.idsByType(type,inactive));
|
131
|
+
};
|
132
|
+
|
133
|
+
this.removeByType = function(type) {
|
134
|
+
var ids = self.idsByType(type);
|
135
|
+
_.each(ids,function(id) {
|
136
|
+
self.remove(id);
|
137
|
+
});
|
138
|
+
return ids;
|
139
|
+
};
|
140
|
+
|
141
|
+
this.idsByType = function(type,inactive) {
|
142
|
+
var _require = inactive ? {type:type} : {type:type,active:true};
|
143
|
+
return _.pluck(_.where(self.list,_require),'id');
|
144
|
+
};
|
145
|
+
|
146
|
+
// TOFIX: Error handling when there is more than one field
|
147
|
+
this.timeField = function() {
|
148
|
+
return _.pluck(self.getByType('time'),'field');
|
149
|
+
};
|
150
|
+
|
151
|
+
// This special function looks for all time filters, and returns a time range according to the mode
|
152
|
+
// No idea when max would actually be used
|
153
|
+
this.timeRange = function(mode) {
|
154
|
+
var _t = _.where(self.list,{type:'time',active:true});
|
155
|
+
if(_t.length === 0) {
|
156
|
+
return false;
|
157
|
+
}
|
158
|
+
switch(mode) {
|
159
|
+
case "min":
|
160
|
+
return {
|
161
|
+
from: new Date(_.max(_.pluck(_t,'from'))),
|
162
|
+
to: new Date(_.min(_.pluck(_t,'to')))
|
163
|
+
};
|
164
|
+
case "max":
|
165
|
+
return {
|
166
|
+
from: new Date(_.min(_.pluck(_t,'from'))),
|
167
|
+
to: new Date(_.max(_.pluck(_t,'to')))
|
168
|
+
};
|
169
|
+
default:
|
170
|
+
return false;
|
171
|
+
}
|
172
|
+
};
|
173
|
+
|
174
|
+
this.remove = function(id) {
|
175
|
+
if(!_.isUndefined(self.list[id])) {
|
176
|
+
delete self.list[id];
|
177
|
+
// This must happen on the full path also since _.without returns a copy
|
178
|
+
self.ids = dashboard.current.services.filter.ids = _.without(self.ids,id);
|
179
|
+
_f.idQueue.unshift(id);
|
180
|
+
_f.idQueue.sort(function(v,k){return v-k;});
|
181
|
+
return true;
|
182
|
+
} else {
|
183
|
+
return false;
|
184
|
+
}
|
185
|
+
};
|
186
|
+
|
187
|
+
|
188
|
+
var nextId = function() {
|
189
|
+
if(_f.idQueue.length > 0) {
|
190
|
+
return _f.idQueue.shift();
|
191
|
+
} else {
|
192
|
+
return self.ids.length;
|
193
|
+
}
|
194
|
+
};
|
195
|
+
|
196
|
+
// Now init
|
197
|
+
self.init();
|
198
|
+
});
|
199
|
+
|
200
|
+
});
|
@@ -0,0 +1,101 @@
|
|
1
|
+
define([
|
2
|
+
'angular',
|
3
|
+
'underscore',
|
4
|
+
'config',
|
5
|
+
'moment'
|
6
|
+
],
|
7
|
+
function (angular, _, config, moment) {
|
8
|
+
'use strict';
|
9
|
+
|
10
|
+
var module = angular.module('kibana.services');
|
11
|
+
|
12
|
+
module.service('kbnIndex', function($http, alertSrv) {
|
13
|
+
// returns a promise containing an array of all indices matching the index
|
14
|
+
// pattern that exist in a given range
|
15
|
+
this.indices = function(from,to,pattern,interval) {
|
16
|
+
var possible = [];
|
17
|
+
_.each(expand_range(fake_utc(from),fake_utc(to),interval),function(d){
|
18
|
+
possible.push(d.format(pattern));
|
19
|
+
});
|
20
|
+
|
21
|
+
return all_indices().then(function(p) {
|
22
|
+
var indices = _.intersection(possible,p);
|
23
|
+
indices.reverse();
|
24
|
+
return indices;
|
25
|
+
});
|
26
|
+
};
|
27
|
+
|
28
|
+
// returns a promise containing an array of all indices in an elasticsearch
|
29
|
+
// cluster
|
30
|
+
function all_indices() {
|
31
|
+
var something = $http({
|
32
|
+
url: config.elasticsearch + "/_aliases",
|
33
|
+
method: "GET"
|
34
|
+
}).error(function(data, status) {
|
35
|
+
if(status === 0) {
|
36
|
+
alertSrv.set('Error',"Could not contact Elasticsearch at "+config.elasticsearch+
|
37
|
+
". Please ensure that Elasticsearch is reachable from your system." ,'error');
|
38
|
+
} else {
|
39
|
+
alertSrv.set('Error',"Could not reach "+config.elasticsearch+"/_aliases. If you"+
|
40
|
+
" are using a proxy, ensure it is configured correctly",'error');
|
41
|
+
}
|
42
|
+
});
|
43
|
+
|
44
|
+
return something.then(function(p) {
|
45
|
+
var indices = [];
|
46
|
+
_.each(p.data, function(v,k) {
|
47
|
+
indices.push(k);
|
48
|
+
// Also add the aliases. Could be expensive on systems with a lot of them
|
49
|
+
_.each(v.aliases, function(v, k) {
|
50
|
+
indices.push(k);
|
51
|
+
});
|
52
|
+
});
|
53
|
+
return indices;
|
54
|
+
});
|
55
|
+
}
|
56
|
+
|
57
|
+
// this is stupid, but there is otherwise no good way to ensure that when
|
58
|
+
// I extract the date from an object that I get the UTC date. Stupid js.
|
59
|
+
// I die a little inside every time I call this function.
|
60
|
+
// Update: I just read this again. I died a little more inside.
|
61
|
+
// Update2: More death.
|
62
|
+
function fake_utc(date) {
|
63
|
+
date = moment(date).clone().toDate();
|
64
|
+
return moment(new Date(date.getTime() + date.getTimezoneOffset() * 60000));
|
65
|
+
}
|
66
|
+
|
67
|
+
// Create an array of date objects by a given interval
|
68
|
+
function expand_range(start, end, interval) {
|
69
|
+
if(_.contains(['hour','day','week','month','year'],interval)) {
|
70
|
+
var range;
|
71
|
+
start = moment(start).clone();
|
72
|
+
range = [];
|
73
|
+
while (start.isBefore(end)) {
|
74
|
+
range.push(start.clone());
|
75
|
+
switch (interval) {
|
76
|
+
case 'hour':
|
77
|
+
start.add('hours',1);
|
78
|
+
break;
|
79
|
+
case 'day':
|
80
|
+
start.add('days',1);
|
81
|
+
break;
|
82
|
+
case 'week':
|
83
|
+
start.add('weeks',1);
|
84
|
+
break;
|
85
|
+
case 'month':
|
86
|
+
start.add('months',1);
|
87
|
+
break;
|
88
|
+
case 'year':
|
89
|
+
start.add('years',1);
|
90
|
+
break;
|
91
|
+
}
|
92
|
+
}
|
93
|
+
range.push(moment(end).clone());
|
94
|
+
return range;
|
95
|
+
} else {
|
96
|
+
return false;
|
97
|
+
}
|
98
|
+
}
|
99
|
+
});
|
100
|
+
|
101
|
+
});
|
@@ -0,0 +1,83 @@
|
|
1
|
+
define([
|
2
|
+
'angular',
|
3
|
+
'underscore'
|
4
|
+
],
|
5
|
+
function (angular, _) {
|
6
|
+
'use strict';
|
7
|
+
|
8
|
+
var module = angular.module('kibana.services');
|
9
|
+
|
10
|
+
module.service('panelMove', function(dashboard, $rootScope, alertSrv) {
|
11
|
+
|
12
|
+
/* each of these can take event,ui,data parameters */
|
13
|
+
|
14
|
+
var notices = [];
|
15
|
+
|
16
|
+
this.onStart = function() {
|
17
|
+
dashboard.panelDragging = true;
|
18
|
+
notices.push(alertSrv.set('Moving','Drop this panel into an available space, or on top of another panel','info'));
|
19
|
+
$rootScope.$apply();
|
20
|
+
};
|
21
|
+
|
22
|
+
this.onOver = function() {
|
23
|
+
notices.push(alertSrv.set('Add panel',
|
24
|
+
'Drop to add panel to this row. Panel will use row height, but retain their span','success'));
|
25
|
+
$rootScope.$apply();
|
26
|
+
};
|
27
|
+
|
28
|
+
this.onOut = function() {
|
29
|
+
clearNotices({severity:'success'});
|
30
|
+
$rootScope.$apply();
|
31
|
+
};
|
32
|
+
|
33
|
+
/*
|
34
|
+
Use our own drop logic. the $parent.$parent this is ugly.
|
35
|
+
*/
|
36
|
+
this.onDrop = function(event,ui,data) {
|
37
|
+
var
|
38
|
+
dragRow = data.draggableScope.$parent.$parent.row.panels,
|
39
|
+
dropRow = data.droppableScope.$parent.$parent.row.panels,
|
40
|
+
dragIndex = data.dragSettings.index,
|
41
|
+
dropIndex = data.dropSettings.index;
|
42
|
+
|
43
|
+
|
44
|
+
// Remove panel from source row
|
45
|
+
dragRow.splice(dragIndex,1);
|
46
|
+
|
47
|
+
// Add to destination row
|
48
|
+
if(!_.isUndefined(dropRow)) {
|
49
|
+
dropRow.splice(dropIndex,0,data.dragItem);
|
50
|
+
}
|
51
|
+
|
52
|
+
dashboard.panelDragging = false;
|
53
|
+
// Cleanup nulls/undefined left behind
|
54
|
+
cleanup();
|
55
|
+
$rootScope.$apply();
|
56
|
+
$rootScope.$broadcast('render');
|
57
|
+
};
|
58
|
+
|
59
|
+
this.onStop = function() {
|
60
|
+
dashboard.panelDragging = false;
|
61
|
+
cleanup();
|
62
|
+
$rootScope.$apply();
|
63
|
+
};
|
64
|
+
|
65
|
+
var cleanup = function () {
|
66
|
+
_.each(notices, function(n){
|
67
|
+
alertSrv.clear(n);
|
68
|
+
});
|
69
|
+
_.each(dashboard.current.rows, function(row) {
|
70
|
+
row.panels = _.without(row.panels,{});
|
71
|
+
row.panels = _.compact(row.panels);
|
72
|
+
});
|
73
|
+
};
|
74
|
+
|
75
|
+
var clearNotices = function(options) {
|
76
|
+
_.each(_.where(notices,options), function(n) {
|
77
|
+
alertSrv.clear(n);
|
78
|
+
});
|
79
|
+
};
|
80
|
+
|
81
|
+
});
|
82
|
+
|
83
|
+
});
|