kibana-sinatra 0.0.8 → 3.0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/lib/kibana/assets/app/components/kbn.js +3 -3
  3. data/lib/kibana/assets/app/controllers/dash.js +2 -19
  4. data/lib/kibana/assets/app/dashboards/guided.json +1 -1
  5. data/lib/kibana/assets/app/panels/bettermap/module.html +1 -1
  6. data/lib/kibana/assets/app/panels/bettermap/module.js +11 -4
  7. data/lib/kibana/assets/app/panels/column/module.js +3 -0
  8. data/lib/kibana/assets/app/panels/{pie → goal}/editor.html +1 -25
  9. data/lib/kibana/assets/app/panels/{pie → goal}/module.html +4 -4
  10. data/lib/kibana/assets/app/panels/goal/module.js +252 -0
  11. data/lib/kibana/assets/app/panels/histogram/interval.js +1 -1
  12. data/lib/kibana/assets/app/panels/histogram/module.html +12 -3
  13. data/lib/kibana/assets/app/panels/histogram/module.js +16 -14
  14. data/lib/kibana/assets/app/panels/hits/module.js +7 -3
  15. data/lib/kibana/assets/app/panels/map/module.html +1 -1
  16. data/lib/kibana/assets/app/panels/map/module.js +9 -1
  17. data/lib/kibana/assets/app/panels/query/module.html +1 -1
  18. data/lib/kibana/assets/app/panels/sparklines/interval.js +1 -1
  19. data/lib/kibana/assets/app/panels/sparklines/module.js +5 -1
  20. data/lib/kibana/assets/app/panels/table/editor.html +1 -1
  21. data/lib/kibana/assets/app/panels/table/micropanel.html +3 -3
  22. data/lib/kibana/assets/app/panels/table/module.html +63 -16
  23. data/lib/kibana/assets/app/panels/table/module.js +4 -1
  24. data/lib/kibana/assets/app/panels/terms/module.js +7 -4
  25. data/lib/kibana/assets/app/panels/text/module.js +2 -0
  26. data/lib/kibana/assets/app/panels/timepicker/module.js +9 -1
  27. data/lib/kibana/assets/app/panels/trends/module.js +4 -0
  28. data/lib/kibana/assets/app/partials/dashboard.html +4 -2
  29. data/lib/kibana/assets/app/partials/panelgeneral.html +1 -1
  30. data/lib/kibana/assets/app/services/dashboard.js +9 -7
  31. data/lib/kibana/assets/app/services/fields.js +34 -3
  32. data/lib/kibana/assets/app/services/kbnIndex.js +5 -3
  33. data/lib/kibana/assets/css/bootstrap.dark.min.css +1 -1
  34. data/lib/kibana/assets/css/bootstrap.light.min.css +1 -1
  35. data/lib/kibana/assets/favicon.ico +0 -0
  36. data/lib/kibana/assets/img/annotation-icon.png +0 -0
  37. data/lib/kibana/assets/index.html +14 -9
  38. data/lib/kibana/assets/vendor/bootstrap/less/overrides.less +11 -5
  39. data/lib/kibana/assets/vendor/bootstrap/less/tooltip.less +4 -4
  40. data/lib/kibana/assets/vendor/jquery/jquery.flot.events.js +15 -9
  41. data/lib/kibana/assets/vendor/jquery/jquery.flot.js +154 -77
  42. data/lib/kibana/assets/vendor/jquery/jquery.flot.pie.js +6 -6
  43. data/lib/kibana/sinatra/version.rb +1 -1
  44. data/lib/kibana/views/config.erb +8 -2
  45. metadata +8 -6
  46. data/lib/kibana/assets/app/panels/pie/module.js +0 -334
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3b0ab86a8330f137d771fbb28969b03b700f88fa
4
- data.tar.gz: ebc86b24d4d6bf697114cb8776d37a6ae5a8f3a6
3
+ metadata.gz: 1d9b44942fdaddd855873685bacc3370c477558c
4
+ data.tar.gz: 0b2bc7f6628e4d34158a04292c5578e95b72b504
5
5
  SHA512:
6
- metadata.gz: 72d3a09749d602f4e71f234cb43d62ef619d31e66878a797aac8375de9b252dcd97f8fe70970ed651c9577e19eaff0935e6ecf7b4ef32211e9a1e37a17c94091
7
- data.tar.gz: e41655af7a3c3220abdfb7b4534d51dc2f2e0611260e29bbf7f3386bbb80d7ebec8d60f737c406ab46d91fcd54b5dc4005cad73f09cc8928b7b227e0674e9187
6
+ metadata.gz: 93c52d30d9dc65f8016595114e1688ca75992ac5c5d124e21b0d9f6d30d2dd648b3db86af2793ab68351fd8b3acef95d4f001586ee295188e2a307c35a1d5bd7
7
+ data.tar.gz: 46b16ff2fe63598b93d3c68ab5ff0d66e35fe0242535ad6fdaa225827b53f5d5e8545b8342b0ce329bc24645384066521deaa864be2495e26ce469e6b6b678c3
@@ -228,19 +228,19 @@ function($, _, moment) {
228
228
  return {
229
229
  sec: kbn.intervals_in_seconds[matches[2]],
230
230
  type: matches[2],
231
- count: parseInt(matches[1], 10)
231
+ count: parseFloat(matches[1])
232
232
  };
233
233
  }
234
234
  };
235
235
 
236
236
  kbn.interval_to_ms = function(string) {
237
237
  var info = kbn.describe_interval(string);
238
- return info.sec * 1000 * info.count;
238
+ return Math.ceil(info.sec * 1000 * info.count);
239
239
  };
240
240
 
241
241
  kbn.interval_to_seconds = function (string) {
242
242
  var info = kbn.describe_interval(string);
243
- return info.sec * info.count;
243
+ return Math.ceil(info.sec * info.count);
244
244
  };
245
245
 
246
246
  // This should go away, moment.js can do this
@@ -1,22 +1,3 @@
1
- /** @scratch /index/0
2
- * = Kibana
3
- *
4
- * // Why can't I have a preamble here?
5
- *
6
- * == Introduction
7
- *
8
- * Kibana is an open source (Apache Licensed), browser based analytics and search dashboard for
9
- * ElasticSearch. Kibana is a snap to setup and start using. Written entirely in HTML and Javascript
10
- * it requires only a plain webserver, Kibana requires no fancy server side components.
11
- * Kibana strives to be easy to get started with, while also being flexible and powerful, just like
12
- * Elasticsearch.
13
- *
14
- * include::configuration/config.js.asciidoc[]
15
- *
16
- * include::panels.asciidoc[]
17
- *
18
- */
19
-
20
1
  define([
21
2
  'angular',
22
3
  'config',
@@ -31,6 +12,8 @@ function (angular, config, _) {
31
12
  module.controller('DashCtrl', function(
32
13
  $scope, $route, ejsResource, fields, dashboard, alertSrv, panelMove, esVersion, kbnVersion) {
33
14
 
15
+ $scope.Math = Math;
16
+
34
17
  $scope.editor = {
35
18
  index: 0
36
19
  };
@@ -167,7 +167,7 @@
167
167
  "pages": 5,
168
168
  "offset": 0,
169
169
  "sort": [
170
- "_id",
170
+ "_score",
171
171
  "desc"
172
172
  ],
173
173
  "style": {
@@ -6,6 +6,6 @@
6
6
  </style>
7
7
  <!-- This solution might work well for other panels that have trouble with heights -->
8
8
  <div style="padding-right:10px;padding-top:10px;height:{{panel.height|| row.height}};overflow:hidden">
9
- <div bettermap id='bettermap' params="{{panel}}" style="height:100%"></div>
9
+ <div bettermap id="{{$id}}" params="{{panel}}" style="height:100%"></div>
10
10
  </div>
11
11
  </div>
@@ -1,8 +1,10 @@
1
1
  /** @scratch /panels/5
2
+ *
2
3
  * include::panels/bettermap.asciidoc[]
3
4
  */
4
5
 
5
6
  /** @scratch /panels/bettermap/0
7
+ *
6
8
  * == Bettermap
7
9
  * Status: *Experimental*
8
10
  *
@@ -60,6 +62,7 @@ function (angular, app, _, L, localRequire) {
60
62
  // Set and populate defaults
61
63
  var _d = {
62
64
  /** @scratch /panels/bettermap/3
65
+ *
63
66
  * === Parameters
64
67
  *
65
68
  * field:: The field that contains the coordinates, in geojson format. GeoJSON is
@@ -80,6 +83,7 @@ function (angular, app, _, L, localRequire) {
80
83
  */
81
84
  tooltip : "_id",
82
85
  /** @scratch /panels/bettermap/5
86
+ *
83
87
  * ==== Queries
84
88
  * queries object:: This object describes the queries to use on this panel.
85
89
  * queries.mode::: Of the queries available, which to use. Options: +all, pinned, unpinned, selected+
@@ -205,8 +209,7 @@ function (angular, app, _, L, localRequire) {
205
209
  module.directive('bettermap', function() {
206
210
  return {
207
211
  restrict: 'A',
208
- link: function(scope, elem, attrs) {
209
-
212
+ link: function(scope, elem) {
210
213
  elem.html('<center><img src="img/load_big.gif"></center>');
211
214
 
212
215
  // Receive render events
@@ -224,18 +227,22 @@ function (angular, app, _, L, localRequire) {
224
227
  var map, layerGroup;
225
228
 
226
229
  function render_panel() {
230
+ elem.css({height:scope.row.height});
231
+
227
232
  scope.require(['./leaflet/plugins'], function () {
228
233
  scope.panelMeta.loading = false;
229
234
  L.Icon.Default.imagePath = 'app/panels/bettermap/leaflet/images';
230
235
  if(_.isUndefined(map)) {
231
- map = L.map(attrs.id, {
236
+ map = L.map(scope.$id, {
232
237
  scrollWheelZoom: false,
233
238
  center: [40, -86],
234
239
  zoom: 10
235
240
  });
236
241
 
237
242
  // This could be made configurable?
238
- L.tileLayer('https://ssl_tiles.cloudmade.com/57cbb6ca8cac418dbb1a402586df4528/22677/256/{z}/{x}/{y}.png', {
243
+ L.tileLayer('http://otile1.mqcdn.com/tiles/1.0.0/map/{z}/{x}/{y}.jpg', {
244
+ attribution: '"Data, imagery and map information provided by MapQuest, '+
245
+ 'OpenStreetMap <http://www.openstreetmap.org/copyright> and contributors, ODbL',
239
246
  maxZoom: 18,
240
247
  minZoom: 2
241
248
  }).addTo(map);
@@ -1,8 +1,10 @@
1
1
  /** @scratch /panels/5
2
+ *
2
3
  * include::panels/column.asciidoc[]
3
4
  */
4
5
 
5
6
  /** @scratch /panels/column/0
7
+ *
6
8
  * == Column
7
9
  * Status: *Stable*
8
10
  *
@@ -34,6 +36,7 @@ function (angular, app, _, config) {
34
36
  // Set and populate defaults
35
37
  var _d = {
36
38
  /** @scratch /panels/column/3
39
+ *
37
40
  * === Parameters
38
41
  *
39
42
  * panel:: An array of panel objects
@@ -1,30 +1,6 @@
1
- <div class="editor-row" ng-switch="panel.mode">
1
+ <div class="editor-row">
2
2
 
3
3
  <div class="section">
4
- <h5>Mode</h5>
5
- <div class="editor-option">
6
- <label class="small">Mode</label>
7
- <select class="input-small" ng-change="set_mode(panel.mode);set_refresh(true)" ng-model="panel.mode" ng-options="f for f in ['terms','goal']"></select>
8
- </div>
9
- </div>
10
-
11
- <div class="section" ng-switch-when="terms">
12
- <h5>Parameters</h5>
13
- <div class="editor-option">
14
- <label class="small">Field</label>
15
- <input type="text" class="input-small" bs-typeahead="fields.list" ng-model="panel.query.field" ng-change="set_refresh(true)">
16
- </div>
17
- <div class="editor-option">
18
- <label class="small">Length</label>
19
- <input class="input-mini" type="number" ng-model="panel.size" ng-change="set_refresh(true)">
20
- </div>
21
- <div class="editor-option">
22
- <label class="small">Exclude Terms(s) (comma separated)</label>
23
- <input array-join type="text" ng-model='panel.exclude'></input>
24
- </div>
25
- </div>
26
-
27
- <div class="section" ng-switch-when="goal">
28
4
  <h5>Parameters</h5>
29
5
  <div class="editor-option">
30
6
  <form style="margin-bottom: 0px">
@@ -1,13 +1,13 @@
1
- <div ng-controller='pie' ng-init="init()">
1
+ <div ng-controller='goal' ng-init="init()">
2
2
  <style>
3
- .pieLabel { pointer-events: none }
3
+ .goal-label { pointer-events: none }
4
4
  </style>
5
5
  <div ng-show="panel.legend == 'above'" ng-repeat="query in legend" style="float:left;padding-left: 10px;">
6
6
  <span ng-show="panel.chart != 'none'"><i class="icon-circle" ng-style="{color:query.color}"></i></span><span class="small"> {{query.label}} ({{query.data[0][1]}}) </span></span>
7
- </div><br>
7
+ </div>
8
8
  <div style="clear:both"></div>
9
9
 
10
- <div pie class="pointer" params="{{panel}}" style="position:relative"></div>
10
+ <div goal params="{{panel}}" style="position:relative"></div>
11
11
 
12
12
  <div ng-show="panel.legend == 'below'" ng-repeat="query in legend" style="float:left;padding-left: 10px;">
13
13
  <span ng-show="panel.chart != 'none'"><i class="icon-circle" ng-style="{color:query.color}"></i></span><span class="small"> {{query.label}} ({{query.data[0][1]}}) </span></span>
@@ -0,0 +1,252 @@
1
+ /** @scratch /panels/5
2
+ *
3
+ * include::panels/goal.asciidoc[]
4
+ */
5
+
6
+ /** @scratch /panels/goal/0
7
+ *
8
+ * == Goal
9
+ * Status: *Stable*
10
+ *
11
+ * The goal panel display progress towards a fixed goal on a pie chart
12
+ *
13
+ */
14
+ define([
15
+ 'angular',
16
+ 'app',
17
+ 'lodash',
18
+ 'jquery',
19
+ 'kbn',
20
+ 'config',
21
+ 'chromath'
22
+ ], function (angular, app, _, $, kbn) {
23
+ 'use strict';
24
+
25
+ var module = angular.module('kibana.panels.goal', []);
26
+ app.useModule(module);
27
+
28
+ module.controller('goal', function($scope, $rootScope, querySrv, dashboard, filterSrv) {
29
+
30
+ $scope.panelMeta = {
31
+ editorTabs : [
32
+ {title:'Queries', src:'app/partials/querySelect.html'}
33
+ ],
34
+ modals : [
35
+ {
36
+ description: "Inspect",
37
+ icon: "icon-info-sign",
38
+ partial: "app/partials/inspector.html",
39
+ show: $scope.panel.spyable
40
+ }
41
+ ],
42
+ status : "Stable",
43
+ description : "Displays the progress towards a fixed goal on a pie chart"
44
+ };
45
+
46
+ // Set and populate defaults
47
+ var _d = {
48
+ /** @scratch /panels/goal/3
49
+ *
50
+ * === Parameters
51
+ * donut:: Draw a hole in the middle of the pie, creating a tasty donut.
52
+ */
53
+ donut : true,
54
+ /** @scratch /panels/goal/3
55
+ * tilt:: Tilt the pie back into an oval shape
56
+ */
57
+ tilt : false,
58
+ /** @scratch /panels/goal/3
59
+ * legend:: The location of the legend, above, below or none
60
+ */
61
+ legend : "above",
62
+ /** @scratch /panels/goal/3
63
+ * labels:: Set to false to disable drawing labels inside the pie slices
64
+ */
65
+ labels : true,
66
+ /** @scratch /panels/goal/3
67
+ * spyable:: Set to false to disable the inspect function.
68
+ */
69
+ spyable : true,
70
+ /** @scratch /panels/goal/3
71
+ *
72
+ * ==== Query
73
+ *
74
+ * query object::
75
+ * query.goal::: the fixed goal for goal mode
76
+ */
77
+ query : {goal: 100},
78
+ /** @scratch /panels/goal/5
79
+ *
80
+ * ==== Queries
81
+ *
82
+ * queries object:: This object describes the queries to use on this panel.
83
+ * queries.mode::: Of the queries available, which to use. Options: +all, pinned, unpinned, selected+
84
+ * queries.ids::: In +selected+ mode, which query ids are selected.
85
+ */
86
+ queries : {
87
+ mode : 'all',
88
+ ids : []
89
+ },
90
+ };
91
+ _.defaults($scope.panel,_d);
92
+
93
+ $scope.init = function() {
94
+ $scope.$on('refresh',function(){$scope.get_data();});
95
+ $scope.get_data();
96
+ };
97
+
98
+ $scope.set_refresh = function (state) {
99
+ $scope.refresh = state;
100
+ };
101
+
102
+ $scope.close_edit = function() {
103
+ if($scope.refresh) {
104
+ $scope.get_data();
105
+ }
106
+ $scope.refresh = false;
107
+ $scope.$emit('render');
108
+ };
109
+
110
+ $scope.get_data = function() {
111
+
112
+ // Make sure we have everything for the request to complete
113
+ if(dashboard.indices.length === 0) {
114
+ return;
115
+ }
116
+
117
+
118
+ $scope.panelMeta.loading = true;
119
+ var request = $scope.ejs.Request().indices(dashboard.indices);
120
+
121
+ $scope.panel.queries.ids = querySrv.idsByMode($scope.panel.queries);
122
+ var queries = querySrv.getQueryObjs($scope.panel.queries.ids);
123
+
124
+ // This could probably be changed to a BoolFilter
125
+ var boolQuery = $scope.ejs.BoolQuery();
126
+ _.each(queries,function(q) {
127
+ boolQuery = boolQuery.should(querySrv.toEjsObj(q));
128
+ });
129
+
130
+ var results;
131
+
132
+ request = request
133
+ .query(boolQuery)
134
+ .filter(filterSrv.getBoolFilter(filterSrv.ids))
135
+ .size(0);
136
+
137
+ $scope.inspector = angular.toJson(JSON.parse(request.toString()),true);
138
+
139
+ results = request.doSearch();
140
+
141
+ results.then(function(results) {
142
+ $scope.panelMeta.loading = false;
143
+ var complete = results.hits.total;
144
+ var remaining = $scope.panel.query.goal - complete;
145
+ $scope.data = [
146
+ { label : 'Complete', data : complete, color: querySrv.colors[parseInt($scope.$id, 16)%8] },
147
+ { data : remaining, color: Chromath.lighten(querySrv.colors[parseInt($scope.$id, 16)%8],0.70).toString() }
148
+ ];
149
+ $scope.$emit('render');
150
+ });
151
+ };
152
+
153
+ });
154
+
155
+ module.directive('goal', function(querySrv) {
156
+ return {
157
+ restrict: 'A',
158
+ link: function(scope, elem) {
159
+
160
+ elem.html('<center><img src="img/load_big.gif"></center>');
161
+
162
+ // Receive render events
163
+ scope.$on('render',function(){
164
+ render_panel();
165
+ });
166
+
167
+ // Or if the window is resized
168
+ angular.element(window).bind('resize', function(){
169
+ render_panel();
170
+ });
171
+
172
+ // Function for rendering panel
173
+ function render_panel() {
174
+ // IE doesn't work without this
175
+ elem.css({height:scope.row.height});
176
+
177
+ var label;
178
+
179
+ label = {
180
+ show: scope.panel.labels,
181
+ radius: 0,
182
+ formatter: function(label, series){
183
+ var font = parseInt(scope.row.height.replace('px',''),10)/8 + String('px');
184
+ if(!(_.isUndefined(label))) {
185
+ return '<div style="font-size:'+font+';font-weight:bold;text-align:center;padding:2px;color:#fff;">'+
186
+ Math.round(series.percent)+'%</div>';
187
+ } else {
188
+ return '';
189
+ }
190
+ },
191
+ };
192
+
193
+ var pie = {
194
+ series: {
195
+ pie: {
196
+ innerRadius: scope.panel.donut ? 0.45 : 0,
197
+ tilt: scope.panel.tilt ? 0.45 : 1,
198
+ radius: 1,
199
+ show: true,
200
+ combine: {
201
+ color: '#999',
202
+ label: 'The Rest'
203
+ },
204
+ label: label,
205
+ stroke: {
206
+ width: 0
207
+ }
208
+ }
209
+ },
210
+ //grid: { hoverable: true, clickable: true },
211
+ grid: {
212
+ backgroundColor: null,
213
+ hoverable: true,
214
+ clickable: true
215
+ },
216
+ legend: { show: false },
217
+ colors: querySrv.colors
218
+ };
219
+
220
+ // Populate legend
221
+ if(elem.is(":visible")){
222
+ require(['jquery.flot.pie'], function(){
223
+ scope.legend = $.plot(elem, scope.data, pie).getData();
224
+ if(!scope.$$phase) {
225
+ scope.$apply();
226
+ }
227
+ });
228
+ }
229
+
230
+ }
231
+
232
+ var $tooltip = $('<div>');
233
+ elem.bind('plothover', function (event, pos, item) {
234
+ if (item) {
235
+ $tooltip
236
+ .html([
237
+ kbn.query_color_dot(item.series.color, 15),
238
+ (item.series.label || ''),
239
+ parseFloat(item.series.percent).toFixed(1) + '%'
240
+ ].join(' '))
241
+ .place_tt(pos.pageX, pos.pageY, {
242
+ offset: 10
243
+ });
244
+ } else {
245
+ $tooltip.remove();
246
+ }
247
+ });
248
+
249
+ }
250
+ };
251
+ });
252
+ });