Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Timefilter Auto Refresh - Closes "Support for auto-refresh #1845" #2196

Merged
merged 95 commits into from
Dec 30, 2014
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
f6d05dd
Adding autorefresh using courier and timefilter
grouma Dec 9, 2014
f0359af
Adding tests for refresh interval feature
grouma Dec 11, 2014
d725327
Added more tests to refresh interval feature. Adding better error che…
grouma Dec 15, 2014
083b63a
Merge branch 'master' of https://github.com/elasticsearch/kibana into…
grouma Dec 15, 2014
67df143
Prevent refresh of data when "off" refresh interval is selected
grouma Dec 16, 2014
8ae871c
moved segmented search into a courier fetch strategy
Dec 16, 2014
e6df20d
[fetch] check for #getIncompleteRequests when strategies complete the…
Dec 16, 2014
40cc3cb
[courier/fetchThese] reformatted and teased a bit
Dec 16, 2014
710581b
[discover/segmentedFetch] disabled the tests for now
Dec 16, 2014
c23525a
[courier/segmentedSearch] expose the #mergeResponse method
Dec 16, 2014
eb3d904
Merge branch 'TimefilterAutoRefresh' of github.com:grouma/kibana into…
Dec 16, 2014
90aed85
Merge pull request #1 from spenceralger/segment_in_courier
grouma Dec 16, 2014
11aa394
Simplifying the refresh UI
grouma Dec 16, 2014
776a1b8
[timepicker] slight modification to navbar css
Dec 16, 2014
2c8c48b
Merge pull request #2 from spenceralger/TimefilterAutoRefresh
grouma Dec 16, 2014
b5debf2
[discover] improve style of discover vis overlay that has been busted…
Dec 16, 2014
5a2a605
Merge branch 'TimefilterAutoRefresh' of github.com:grouma/kibana into…
Dec 16, 2014
09c3fd1
Refresh interval is now saved in session storage. Corresponding tests…
grouma Dec 17, 2014
1a15a78
Fixing issues with refresh interval session storage. Removing unecess…
grouma Dec 17, 2014
dab0dc4
Merge branch 'configure_private' into TimefilterAutoRefresh
Dec 17, 2014
5215fd1
[courier/fetch/segmented] proxy the strategy method to SegmentedState
Dec 17, 2014
735d455
[courier/segmentedState] ensure that events will always emit in order
Dec 17, 2014
7162728
[courier/fetch] broke fetchThese into more manageable pieces
Dec 17, 2014
2e14260
[courier/fetch/segmented] added tests and fixed discovered bugs
Dec 18, 2014
2f3ef3c
Merge branch 'master' into TimefilterAutoRefresh
Dec 18, 2014
f137a65
Merge pull request #3 from spenceralger/TimefilterAutoRefresh
grouma Dec 18, 2014
e8b23c8
[notifier] stop the courier on fatal errors
Dec 18, 2014
e3b50fb
[timepicker] fix invalid html entity
Dec 18, 2014
ad025a2
Merge branch 'master' into TimefilterAutoRefresh
Dec 18, 2014
03f0e51
[timepicker] HTMLPrettify'd that thang
Dec 18, 2014
32be3c3
[courier] warn when refresh interval is too damn high
Dec 18, 2014
be7e9f2
[courier] restart the looper on #fetch(), don't trigger. Fetch direct…
Dec 18, 2014
64b9d7f
Cleaning up refresh interval options.
grouma Dec 18, 2014
8a8526d
[courier] refactored request queue, allowing requests to be restarted
Dec 19, 2014
61537df
[courier/segmentedRequest] only init state at request time
Dec 19, 2014
0a07e71
[courier/looper] track loop completion and rejected promises
Dec 19, 2014
bea6d12
[courier] shorter request class names +1
Dec 19, 2014
f5bfcfe
[courier] restart in progress requests on fetch()
Dec 19, 2014
59db253
[events] update tests to use callbacks
Dec 19, 2014
08f2136
[events] always emit in the same order that emit was called
Dec 19, 2014
5875b37
[errors] default to no error for RequestFailure
Dec 19, 2014
5a3e3a9
[courier/requestQueue] simplify pending request logic
Dec 19, 2014
0260b26
[courier] only call fetch, not both fetch and looper
Dec 19, 2014
288ffe0
[courier/fetch] tease and simplify fetch, added restartable requests
Dec 19, 2014
34d7b70
Merge branch 'TimefilterAutoRefresh' of github.com:grouma/kibana into…
Dec 19, 2014
dd66001
[courier/looper] allow preventing fetch on restart
Dec 19, 2014
3b7ad9c
[timepicker] fix bag merge
Dec 19, 2014
ca7f216
[timepicker] readability improvments
Dec 19, 2014
7d90ce4
Merge branch 'master' into TimefilterAutoRefresh
Dec 19, 2014
12bc607
[courier/fetch] remove fetch method for removed segmented strategy
Dec 19, 2014
2496036
[courier/source] update method used to cancel requests
Dec 19, 2014
a1977a3
[courier] fix moved method
Dec 19, 2014
103297a
[courier/fetch] use ABORT to id canceled es request
Dec 19, 2014
7fcab33
[courier/fetch] added comments
Dec 19, 2014
668b5cf
[kibana] remove debug code
Dec 19, 2014
1fdf755
[courier/fetch/segmented] infer the totalSize from the flattened sear…
Dec 19, 2014
591a3a3
Merge pull request #4 from spenceralger/TimefilterAutoRefresh
grouma Dec 19, 2014
5f49c28
Merge branch 'master' of https://github.com/elasticsearch/kibana into…
Dec 19, 2014
a96f260
[courier/looper] prevent looper from starting until told to
Dec 19, 2014
45b9f00
[courier/DocRequest] cleanup
Dec 19, 2014
f530db2
[indexPatterns] get as many ids as possible
Dec 19, 2014
dcabba8
[tests] reanable all and clear storage before running
Dec 19, 2014
6cd1ab2
[docTitle] fixed test
Dec 19, 2014
2684435
[timepicker] updated tests for new style
Dec 19, 2014
859f56a
[courier] properly abort requests on close
Dec 19, 2014
e186ed1
[courier/fetch] always ignore unavailable indices
Dec 19, 2014
be22579
[courier/fetch] allow requests to filter the errors that cause rejection
Dec 19, 2014
e2c9ae5
[courier] deleted tests for now
Dec 20, 2014
ffe9252
[courier] move fatal callback into Courier to magically fix issue (th…
Dec 20, 2014
fd7f75c
Merge branch 'master' of https://github.com/elasticsearch/kibana into…
Dec 20, 2014
e432638
Merge pull request #5 from spenceralger/TimefilterAutoRefresh
grouma Dec 20, 2014
34d42a1
[courier/looper] convert to kbn Class style
Dec 24, 2014
c86e32b
[courier/looper] only fetch inactive requests
Dec 24, 2014
ee7ab28
[courier/looper] schedule once the previous run is complete
Dec 24, 2014
b030caa
[discover] restart the courier.searchLooper when fetch is complete
Dec 24, 2014
577d92f
remove unused deps
Dec 24, 2014
5a84841
Merge branch 'master' of https://github.com/elasticsearch/kibana into…
Dec 24, 2014
5c4dec6
[courier/fetch] reset the searchLooper after fetching
Dec 24, 2014
424e5ee
use courier.fetch() rather than .fetchQueued()
Dec 24, 2014
3f0bcf2
remove extra reassignment
Dec 24, 2014
cacb033
removed debugging assignment
Dec 24, 2014
98a2cbc
Merge pull request #6 from spenceralger/TimefilterAutoRefresh
grouma Dec 26, 2014
6cb601f
apply 6e7cf2d
Dec 29, 2014
c016970
implement 92d206c
Dec 29, 2014
084dbda
[courier/looper] manage the loopers timer a bit more closely, fixes h…
Dec 29, 2014
c779d01
[courier/fetch/segmented] don't call the initFn until start
Dec 29, 2014
17a0e5a
[discover] always catch errors that are returned
Dec 29, 2014
65e0a87
[discover] update the time on each request
Dec 29, 2014
b139243
Merge branch 'master' of https://github.com/elasticsearch/kibana into…
Dec 29, 2014
844d381
[promises] ensure that Promise.map doesn't throw
Dec 29, 2014
a65b547
[courier/docSource] use courier/fetch to fake responses to requests
Dec 29, 2014
0cb8c09
[courier/fetch/segmented] first emit is for first segment with rows, …
Dec 30, 2014
e83dc4f
[disocver] rely on guaranteed event order
Dec 30, 2014
ba32f62
[discover] only overlay before first results
Dec 30, 2014
8af2ffd
[discover] vertically center the throbber
Dec 30, 2014
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions src/kibana/components/courier/courier.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
define(function (require) {
var errors = require('errors');

var _ = require('lodash');

require('services/es');
require('services/promises');
require('components/index_patterns/index_patterns');

require('modules').get('kibana/courier')
.service('courier', function ($rootScope, Private, Promise, indexPatterns) {
.service('courier', function ($rootScope, Private, Promise, indexPatterns, timefilter) {
function Courier() {
var self = this;

Expand Down Expand Up @@ -114,6 +115,13 @@ define(function (require) {
throw new Error('Aborting all pending requests failed.');
}
};

// Listen for refreshInterval changes
$rootScope.$watch('timefilter.refreshInterval', function () {
if (!_.isUndefined(timefilter.refreshInterval)) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While I realize what this check accomplishes, I'd prefer if this was a falsy check, or a check that refreshInterval is infact a valid interval, rather than checking if it is one of the many things it might be.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I will add a check to ensure the refreshInterval contains a numeric value property.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds like a good plan. What do you think about implementing the default value here? if $scope.timefilter.refreshInterval isn't a valid interval then assign the default?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That makes sense. Defaulting it to 0 will turn off the auto refresh.

self.fetchInterval(timefilter.refreshInterval.value);
}
});
}

return new Courier();
Expand Down
240 changes: 130 additions & 110 deletions src/kibana/components/timepicker/timepicker.html
Original file line number Diff line number Diff line change
Expand Up @@ -13,132 +13,152 @@
padding: 0px 15px;
}

.kbn-refresh-list {
padding: 0px 15px;
}

.kbn-timepicket-alert {
width: 100px;
}
</style>

<div class="row">
<div class="col-md-2">
<ul class="nav nav-pills nav-stacked kbn-timepicker-modes">
<li ng-class="{active: mode=='quick'}"><a ng-click="setMode('quick')" >quick</a></li>
<li ng-class="{active: mode=='relative'}"><a ng-click="setMode('relative')" >relative</a></li>
<li ng-class="{active: mode=='absolute'}"><a ng-click="setMode('absolute')" >absolute</a></li>
</ul>
</div>

<div class="col-md-10">
<div ng-switch on="mode" class="container-fluid">
<div ng-switch-when="quick" bindonce>

<div ng-repeat="list in quickLists" class="kbn-timepicker-section">
<ul class="list-unstyled">
<li ng-repeat="option in list"><a ng-click="setQuick(option.from, option.to)" bo-text="option.display"></a></li>
<ul class="nav nav-tabs" role="tablist" ng-init="tab = 'filter'">
<li ng-class="{active:tab== 'filter'}" ><a href ng-click="tab = 'filter'">Time Filter</a></li>
<li ng-class="{active:tab== 'interval'}"><a href ng-click="tab = 'interval'">Refresh Interval</a></li>
</ul>

<div class="tab-content">
<!-- Filters -->
<div ng-show="tab == 'filter'" role="tabpanel" class="tab-pane active">
</br>
<div class="row">
<div class="col-md-2">
<ul class="nav nav-pills nav-stacked kbn-timepicker-modes">
<li ng-class="{active: mode=='quick'}"><a ng-click="setMode('quick')" >quick</a></li>
<li ng-class="{active: mode=='relative'}"><a ng-click="setMode('relative')" >relative</a></li>
<li ng-class="{active: mode=='absolute'}"><a ng-click="setMode('absolute')" >absolute</a></li>
</ul>
</div>

<!-- TODO: Add a section for custom intervals -->
</div>
<div ng-switch-when="relative">

<form
ng-submit="applyRelative()"
class="form-inline"
name="relativeTime">

<div class="kbn-timepicker-section">
<label>
From:
<span ng-show="relative.preview">{{relative.preview}}</span><span ng-hide="relative.preview"><i>Invalid Expression</i></span>
</label><br>
<div class="form-group">
<input type="number" class="form-control" required
ng-model="relative.count"
ng-change="formatRelative()">
</div>
<div class="form-group">
<select class="form-control col-xs-2"
ng-model="relative.unit"
ng-options="opt.value as opt.text for opt in relativeOptions"
ng-change="formatRelative()">
</select>
</div>
<br>
<div class="small">
<input type="checkbox"
ng-model="relative.round"
ng-checked="relative.round"
ng-change="formatRelative()"/> round to the {{units[relative.unit]}}
</div>
<div class="col-md-10">
<div ng-switch on="mode" class="container-fluid">
<div ng-switch-when="quick" bindonce>

</div>
<div ng-repeat="list in quickLists" class="kbn-timepicker-section">
<ul class="list-unstyled">
<li ng-repeat="option in list"><a ng-click="setQuick(option.from, option.to)" bo-text="option.display"></a></li>
</ul>
</div>

<div class="kbn-timepicker-section">
<label>
To: Now
</label><br>
<div class="form-group">
<input type="text" disabled class="form-control" value="Now">
<!-- TODO: Add a section for custom intervals -->
</div>
</div>
<div ng-switch-when="relative">

<form
ng-submit="applyRelative()"
class="form-inline"
name="relativeTime">

<div class="kbn-timepicker-section">
<label>
From:
<span ng-show="relative.preview">{{relative.preview}}</span><span ng-hide="relative.preview"><i>Invalid Expression</i></span>
</label><br>
<div class="form-group">
<input type="number" class="form-control" required
ng-model="relative.count"
ng-change="formatRelative()">
</div>
<div class="form-group">
<select class="form-control col-xs-2"
ng-model="relative.unit"
ng-options="opt.value as opt.text for opt in relativeOptions"
ng-change="formatRelative()">
</select>
</div>
<br>
<div class="small">
<input type="checkbox"
ng-model="relative.round"
ng-checked="relative.round"
ng-change="formatRelative()"/> round to the {{units[relative.unit]}}
</div>

</div>

<div class="kbn-timepicker-section">
<label>
To: Now
</label><br>
<div class="form-group">
<input type="text" disabled class="form-control" value="Now">
</div>
</div>

<div class="kbn-timepicker-section">
<label>&nbsp;</label><br>
<div class="form-group">
<button
type="submit"
class="btn btn-primary kbn-timepicker-go"
ng-disabled="!relative.preview">
Go
</button>
</div>
</div>
</form>

<div class="kbn-timepicker-section">
<label>&nbsp;</label><br>
<div class="form-group">
<button
type="submit"
class="btn btn-primary kbn-timepicker-go"
ng-disabled="!relative.preview">
Go
</button>
</div>
</div>
</form>

</div>

<div ng-switch-when="absolute">

<form name="absoluteTime" ng-submit="applyAbsolute()">

<div class="kbn-timepicker-section">
<div>
<label class="small">From: <span ng-show="!absolute.from"><i>Invalid Date</i></span></label>
<input type="text" required class="form-control" input-datetime="{{format}}" ng-model="absolute.from">
</div>
<div>
<datepicker ng-model="absolute.from" max="absolute.to" show-weeks="false"></datepicker>
</div>
</div>

<div class="kbn-timepicker-section">
<div>
<label class="small">To: <span ng-show="!absolute.to"><i>Invalid Date</i></span></label>
<input type="text" required class="form-control" input-datetime="{{format}}" ng-model="absolute.to">
</div>
<div>
<datepicker ng-model="absolute.to" min="absolute.from" show-weeks="false"></datepicker>
<div ng-switch-when="absolute">

<form name="absoluteTime" ng-submit="applyAbsolute()">

<div class="kbn-timepicker-section">
<div>
<label class="small">From: <span ng-show="!absolute.from"><i>Invalid Date</i></span></label>
<input type="text" required class="form-control" input-datetime="{{format}}" ng-model="absolute.from">
</div>
<div>
<datepicker ng-model="absolute.from" max="absolute.to" show-weeks="false"></datepicker>
</div>
</div>

<div class="kbn-timepicker-section">
<div>
<label class="small">To: <span ng-show="!absolute.to"><i>Invalid Date</i></span></label>
<input type="text" required class="form-control" input-datetime="{{format}}" ng-model="absolute.to">
</div>
<div>
<datepicker ng-model="absolute.to" min="absolute.from" show-weeks="false"></datepicker>
</div>
</div>

<div class="kbn-timepicker-section kbn-timepicker-alert">
<label>&nbsp</label>
<div class="form-group">
<button
class="btn btn-primary kbn-timepicker-go"
ng-disabled="absolute.from > absolute.to || !absolute.from || !absolute.to"
type="submit">
Go
</button>
<span class="small" ng-show="absolute.from > absolute.to"><strong>From</strong> must occur before <strong>To</strong></span>
</div>
</div>
</form>
</div>
</div>

<div class="kbn-timepicker-section kbn-timepicker-alert">
<label>&nbsp</label>
<div class="form-group">
<button
class="btn btn-primary kbn-timepicker-go"
ng-disabled="absolute.from > absolute.to || !absolute.from || !absolute.to"
type="submit">
Go
</button>
<span class="small" ng-show="absolute.from > absolute.to"><strong>From</strong> must occur before <strong>To</strong></span>
</div>
</div>
</form>


</div>
</div>
</div>
<!-- Refresh Intervals -->
<div ng-show="tab == 'interval'" role="tabpanel" class="tab-pane active">
</br>
<ul class="list-unstyled kbn-refresh-list">
<li ng-repeat="interval in refreshIntervals"><a ng-click="setRefreshInterval(interval)">{{interval.display}}</a></li>
</ul>
</div>
</div>
</div>

</div>
</div>
</div>
22 changes: 20 additions & 2 deletions src/kibana/components/timepicker/timepicker.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ define(function (require) {
require('components/timepicker/quick_ranges');
require('components/timepicker/time_units');


module.directive('kbnTimepicker', function (quickRanges, timeUnits) {
return {
restrict: 'E',
scope: {
from: '=',
to: '=',
mode: '='
mode: '=',
interval: '='
},
template: html,
controller: function ($scope) {
Expand All @@ -33,6 +33,20 @@ define(function (require) {
return _.filter(quickRanges, {section: section});
});

$scope.refreshIntervals = [
{ value : 0, display: 'Off'},
{ value : 5000, display: '5 seconds'},
{ value : 10000, display: '10 seconds'},
{ value : 30000, display: '30 seconds'},
{ value : 60000, display: '1 minute'},
{ value : 300000, display: '5 minutes'},
{ value : 900000, display: '15 minutes'},
{ value : 1800000, display: '30 minutes'},
{ value : 3600000, display: '1 hour'},
{ value : 7200000, display: '2 hour'},
{ value : 86400000, display: '1 day'}
];

$scope.relative = {
count: 1,
unit: 'm',
Expand Down Expand Up @@ -131,6 +145,10 @@ define(function (require) {
$scope.to = moment($scope.absolute.to);
};

$scope.setRefreshInterval = function (interval) {
$scope.interval = interval;
};

init();
}
};
Expand Down
3 changes: 2 additions & 1 deletion src/kibana/plugins/kibana/_timepicker.html
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<kbn-timepicker
from="timefilter.time.from"
to="timefilter.time.to"
mode="timefilter.time.mode">
mode="timefilter.time.mode"
interval="timefilter.refreshInterval">
</kbn-timepicker>
1 change: 1 addition & 0 deletions src/kibana/plugins/kibana/_timepicker.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ define(function (require) {

$scope.notifList = notify._notifs;
$scope.timefilter = timefilter;
$scope.timefilter.refreshInterval = { value : 0, display: 'Off'};

$scope.$listen(timefilter, 'update', function (newVal, oldVal) {
globalState.time = _.clone(timefilter.time);
Expand Down
3 changes: 2 additions & 1 deletion src/kibana/plugins/kibana/kibana.html
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
<!-- Full navbar -->
<div collapse="!showCollapsed" class="navbar-collapse" id="kibana-primary-navbar">
<ul class="nav navbar-nav">
<li ng-repeat="app in apps.inOrder | filter:{show: true}" ng-class="{active: activeApp === app}">
<li ng-repeat="app in apps.inOrder" ng-class="{active: activeApp === app}">
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The | filter: {show: true} needs to stay in there

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will fix.

<a ng-href="#{{app.lastPath}}" bo-text="app.name"></a>
</li>
</ul>
Expand All @@ -30,6 +30,7 @@
</li>
<li ng-if="setupComplete" ng-show="timefilter.enabled" class="navbar-timepicker-display">
<a ng-click="toggleTimepicker()">
Refresh: {{timefilter.refreshInterval.display}} - Filter:
<pretty-duration from="timefilter.time.from" to="timefilter.time.to"></pretty-duration>
&nbsp;
<i class="fa fa-clock-o"></i>
Expand Down
Loading