Changed histogram legend to scale better, fixed parallel query bug

This commit is contained in:
Rashid Khan 2013-04-01 15:12:07 -07:00
parent 0aacb86688
commit 86254db78c
3 changed files with 91 additions and 71 deletions

View File

@ -6,5 +6,11 @@
<a class='small' ng-click='zoom(0.5)'><i class='icon-zoom-in'></i> Zoom In</a> <a class='small' ng-click='zoom(0.5)'><i class='icon-zoom-in'></i> Zoom In</a>
<a class='small' ng-click='zoom(2)'><i class='icon-zoom-out'></i> Zoom Out</a> <a class='small' ng-click='zoom(2)'><i class='icon-zoom-out'></i> Zoom Out</a>
</center> </center>
<div>
<span ng-repeat='series in legend' style='display:inline-block;padding-right:5px'>
<div style="display:inline-block;background:{{series.color}};height:10px;width:10px"></div>
<div class='small' style='display:inline-block'>{{series.label}} / {{panel.interval}}</div>
</span>
</div>
<div histogram params="{{panel}}" style="height:{{panel.height || row.height}};position:relative"></div> <div histogram params="{{panel}}" style="height:{{panel.height || row.height}};position:relative"></div>
</kibana-panel> </kibana-panel>

View File

@ -47,7 +47,7 @@ angular.module('kibana.histogram', [])
$scope.get_data(); $scope.get_data();
} }
$scope.get_data = function(segment) { $scope.get_data = function(segment,query_id) {
// Make sure we have everything for the request to complete // Make sure we have everything for the request to complete
if(_.isUndefined($scope.panel.index) || _.isUndefined($scope.time)) if(_.isUndefined($scope.panel.index) || _.isUndefined($scope.time))
return return
@ -87,40 +87,47 @@ angular.module('kibana.histogram', [])
results.then(function(results) { results.then(function(results) {
$scope.panel.loading = false; $scope.panel.loading = false;
$scope.hits = results.hits.total; $scope.hits = results.hits.total;
if(_segment == 0) if(_segment == 0) {
$scope.data = []; $scope.data = [];
query_id = $scope.query_id = new Date().getTime();
}
_.each(results.facets, function(v, k) { if($scope.query_id === query_id) {
// Null values at each end of the time range ensure we see entire range _.each(results.facets, function(v, k) {
if(_.isUndefined($scope.data[k]) || _segment == 0) { // Null values at each end of the time range ensure we see entire range
var data = [[$scope.time.from.getTime(), null],[$scope.time.to.getTime(), null]]; if(_.isUndefined($scope.data[k]) || _segment == 0) {
} else { var data = [[$scope.time.from.getTime(), null],[$scope.time.to.getTime(), null]];
var data = $scope.data[k].data } else {
} var data = $scope.data[k].data
}
var segment_data = []; var segment_data = [];
_.each(v.entries, function(v, k) { _.each(v.entries, function(v, k) {
segment_data.push([v['time'],v['count']]) segment_data.push([v['time'],v['count']])
});
data.splice.apply(data,[1,0].concat(segment_data))
var series = {
data: {
label: $scope.panel.query[k].label || k,
data: data,
},
};
if (!(_.isUndefined($scope.panel.query[k].color)))
series.data.color = $scope.panel.query[k].color;
$scope.data[k] = series.data
}); });
data.splice.apply(data,[1,0].concat(segment_data)) $scope.$emit('render')
if(_segment < $scope.panel.index.length-1) {
var series = { $scope.get_data(_segment+1,query_id)
data: { }
label: $scope.panel.query[k].label || k,
data: data, }
},
};
if (!(_.isUndefined($scope.panel.query[k].color)))
series.data.color = $scope.panel.query[k].color;
$scope.data[k] = series.data
});
$scope.$emit('render')
if(_segment < $scope.panel.index.length-1)
$scope.get_data(_segment+1)
}); });
} }
@ -155,8 +162,13 @@ angular.module('kibana.histogram', [])
restrict: 'A', restrict: 'A',
link: function(scope, elem, attrs, ctrl) { link: function(scope, elem, attrs, ctrl) {
var height = scope.panel.height || scope.row.height;
elem.html('<center><img src="common/img/load_big.gif"></center>') elem.html(
'<div class="legend_container"></div>'+
'<div class="chart" style="height:'+height+'">'+
'<center><img src="common/img/load_big.gif"></center>'+
'</div>')
// Receive render events // Receive render events
scope.$on('render',function(){ scope.$on('render',function(){
@ -195,45 +207,46 @@ angular.module('kibana.histogram', [])
// Populate element. Note that jvectormap appends, does not replace. // Populate element. Note that jvectormap appends, does not replace.
scripts.wait(function(){ scripts.wait(function(){
// Populate element // Populate element
try { $.plot(elem, scope.data, { try {
legend: { var plot = $.plot($('.chart',elem), scope.data, {
show: show.legend, legend: {
position: "nw", show: false,
labelFormatter: function(label, series) { },
return '<span class="legend">' + label + ' / ' + series: {
scope.panel.interval + '</span>'; stack: show.stack,
} lines: { show: show.lines, fill: scope.panel.fill/10 },
}, bars: { show: show.bars, fill: 1, barWidth: barwidth/1.8 },
series: { points: { show: show.points, fill: 1, fillColor: false},
stack: show.stack, shadowSize: 1
lines: { show: show.lines, fill: scope.panel.fill/10 }, },
bars: { show: show.bars, fill: 1, barWidth: barwidth/1.8 }, yaxis: { show: show['y-axis'], min: 0, color: "#000" },
points: { show: show.points }, xaxis: {
shadowSize: 1 timezone: scope.panel.timezone,
}, show: show['x-axis'],
yaxis: { show: show['y-axis'], min: 0, color: "#000" }, mode: "time",
xaxis: { timeformat: time_format(scope.panel.interval),
timezone: scope.panel.timezone, label: "Datetime",
show: show['x-axis'], color: "#000",
mode: "time", },
timeformat: time_format(scope.panel.interval), selection: {
label: "Datetime", mode: "x"
color: "#000", },
}, grid: {
selection: { backgroundColor: '#fff',
mode: "x" borderWidth: 0,
}, borderColor: '#eee',
grid: { color: "#eee",
backgroundColor: '#fff', hoverable: true,
borderWidth: 0, },
borderColor: '#eee', colors: ['#EB6841','#00A0B0','#6A4A3C','#EDC951','#CC333F']
color: "#eee", })
hoverable: true,
}, scope.legend = [];
colors: ['#EB6841','#00A0B0','#6A4A3C','#EDC951','#CC333F'] _.each(plot.getData(),function(series) {
}) scope.legend.push(_.pick(series,'label','color'))
})
} catch(e) { } catch(e) {
console.log(e) elem.text(e)
} }
}) })
} }

View File

@ -105,6 +105,7 @@ angular.module('kibana.table', [])
$scope.panel.loading = false; $scope.panel.loading = false;
if(_segment === 0) { if(_segment === 0) {
$scope.hits = 0;
$scope.data = []; $scope.data = [];
query_id = $scope.query_id = new Date().getTime() query_id = $scope.query_id = new Date().getTime()
} }
@ -114,8 +115,6 @@ angular.module('kibana.table', [])
return; return;
} }
$scope.panel.error = false; $scope.panel.error = false;
$scope.hits = results.hits.total;
// Check that we're still on the same query, if not stop // Check that we're still on the same query, if not stop
if($scope.query_id === query_id) { if($scope.query_id === query_id) {
@ -123,6 +122,8 @@ angular.module('kibana.table', [])
return flatten_json(hit['_source']); return flatten_json(hit['_source']);
})); }));
$scope.hits += results.hits.total;
// Sort the data // Sort the data
$scope.data = _.sortBy($scope.data, function(v){ $scope.data = _.sortBy($scope.data, function(v){
return v[$scope.panel.sort[0]] return v[$scope.panel.sort[0]]