Repository: incubator-eagle Updated Branches: refs/heads/master 162aac84f -> dd9cd7c51
[EAGLE-831] UI alert support time range select * alert list support time range * policy detail page display alert template Author: zombieJ <smith3...@gmail.com> Closes #723 from zombieJ/831. Project: http://git-wip-us.apache.org/repos/asf/incubator-eagle/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-eagle/commit/dd9cd7c5 Tree: http://git-wip-us.apache.org/repos/asf/incubator-eagle/tree/dd9cd7c5 Diff: http://git-wip-us.apache.org/repos/asf/incubator-eagle/diff/dd9cd7c5 Branch: refs/heads/master Commit: dd9cd7c51cd5454fd201cd27377f22eb2d60d9ec Parents: 162aac8 Author: zombieJ <smith3...@gmail.com> Authored: Thu Dec 8 17:35:38 2016 +0800 Committer: Hao Chen <h...@apache.org> Committed: Thu Dec 8 17:35:38 2016 +0800 ---------------------------------------------------------------------- eagle-server/src/main/webapp/app/dev/index.html | 9 +++- .../webapp/app/dev/partials/alert/list.html | 14 +----- .../app/dev/partials/alert/policyDetail.html | 47 +++++++++++++------ .../src/main/webapp/app/dev/public/js/app.js | 8 +++- .../webapp/app/dev/public/js/ctrls/alertCtrl.js | 48 +++++++++----------- .../app/dev/public/js/services/timeSrv.js | 37 ++++++++++++++- 6 files changed, 104 insertions(+), 59 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/dd9cd7c5/eagle-server/src/main/webapp/app/dev/index.html ---------------------------------------------------------------------- diff --git a/eagle-server/src/main/webapp/app/dev/index.html b/eagle-server/src/main/webapp/app/dev/index.html index 93018b4..47e1b76 100644 --- a/eagle-server/src/main/webapp/app/dev/index.html +++ b/eagle-server/src/main/webapp/app/dev/index.html @@ -66,7 +66,7 @@ <ul class="nav navbar-nav"> <li class="dropdown time-picker" ng-if="Time.pickerType === Time.TIME_RANGE_PICKER"> <a data-toggle="dropdown" aria-expanded="false"> - <i class="fa fa-calendar"></i> + <span class="fa fa-{{Time.autoRefresh ? 'refresh' : 'calendar'}}"></span> {{Time.format("startTime", Time.SHORT_FORMAT)}} ~ {{Time.format("endTime", Time.SHORT_FORMAT)}} </a> <ul class="dropdown-menu"> @@ -75,6 +75,13 @@ <li><a ng-click="setLastDuration(12)"><i class="fa fa-clock-o"></i>Last 12 Hours</a></li> <li><a ng-click="setLastDuration(24)"><i class="fa fa-clock-o"></i>Last 24 Hours</a></li> <li><a ng-click="customizeTimeRange()"><i class="fa fa-clock-o"></i>Customize</a></li> + <li role="separator" class="divider"></li> + <li uib-tooltip="Enable will keep fetching latest data. Interval: every minute" tooltip-placement="left" tooltip-append-to-body="true"> + <a ng-click="updateTimeAutoRefresh()"> + <span class="fa" ng-class="Time.autoRefresh ? 'fa-check-square-o' : 'fa-square-o'"></span> + Auto Refresh + </a> + </li> </ul> </li> <li class="hover-dropdown"> http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/dd9cd7c5/eagle-server/src/main/webapp/app/dev/partials/alert/list.html ---------------------------------------------------------------------- diff --git a/eagle-server/src/main/webapp/app/dev/partials/alert/list.html b/eagle-server/src/main/webapp/app/dev/partials/alert/list.html index 806234d..d06b41f 100644 --- a/eagle-server/src/main/webapp/app/dev/partials/alert/list.html +++ b/eagle-server/src/main/webapp/app/dev/partials/alert/list.html @@ -22,18 +22,6 @@ <h3 class="box-title"> Alert List </h3> - <div class="box-tools pull-right" > - <div class="btn-group"> - <button class="btn btn-default btn-sm" ng-class="{active: displayType === 'raw'}" - tooltip-append-to-body="true" uib-tooltip="raw data" ng-click="displayType = 'raw'"> - <i class="fa fa-keyboard-o"></i> - </button> - <button class="btn btn-default btn-sm" ng-class="{active: displayType === 'format'}" - tooltip-append-to-body="true" uib-tooltip="format data" ng-click="displayType = 'format'"> - <i class="fa fa-list"></i> - </button> - </div> - </div> </div> <div class="box-body"> <div sort-table="alertList" is-sorting="isSorting"> @@ -42,7 +30,7 @@ <tr> <th sortpath="alertTimestamp" width="135"> Time - <span class="fa fa-refresh fa-spin no-animate" ng-show="!alertList._done || isSorting"></span> + <span class="fa fa-refresh fa-spin no-animate" ng-show="loading || isSorting"></span> </th> <th sortpath="tags.severity" width="85">Severity</th> <th sortpath="tags.siteId" width="75">Site</th> http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/dd9cd7c5/eagle-server/src/main/webapp/app/dev/partials/alert/policyDetail.html ---------------------------------------------------------------------- diff --git a/eagle-server/src/main/webapp/app/dev/partials/alert/policyDetail.html b/eagle-server/src/main/webapp/app/dev/partials/alert/policyDetail.html index e21b91d..c0ff80a 100644 --- a/eagle-server/src/main/webapp/app/dev/partials/alert/policyDetail.html +++ b/eagle-server/src/main/webapp/app/dev/partials/alert/policyDetail.html @@ -57,26 +57,15 @@ <!--li><a href="#statistic" data-toggle="tab">Statistic</a></li--> <li class="active"><a href="#setting" data-toggle="tab" ng-click="setTab('setting')">Setting</a></li> <li><a href="#assignments" data-toggle="tab" ng-click="setTab('assignments')">Assignments</a></li> - <li><a href="#alerts" data-toggle="tab" ng-click="setTab('alerts')">Alerts</a></li> - <li class="pull-right box-tools" ng-show="tab === 'alerts'"> - <div class="btn-group"> - <button class="btn btn-default btn-sm" ng-class="{active: displayType === 'raw'}" - tooltip-append-to-body="true" uib-tooltip="raw data" ng-click="displayType = 'raw'"> - <i class="fa fa-keyboard-o"></i> - </button> - <button class="btn btn-default btn-sm" ng-class="{active: displayType === 'format'}" - tooltip-append-to-body="true" uib-tooltip="format data" ng-click="displayType = 'format'"> - <i class="fa fa-list"></i> - </button> - </div> - </li> + <li><a href="#definition" data-toggle="tab" ng-click="setTab('definition')">Alert Definition</a></li> + <li><a href="#alerts" data-toggle="tab" ng-click="setTab('alerts')">Alert List</a></li> </ul> <div class="tab-content"> <div class="tab-pane active" id="setting"> <table class="table"> <tbody> <tr> - <th>Parallelism Hint</th> + <th class="text-no-break">Parallelism Hint</th> <td>{{policy.parallelismHint}}</td> </tr> <tr> @@ -146,8 +135,10 @@ </tbody> </table> </div> + <div class="tab-pane" id="statistic">statistic </div> + <div class="tab-pane" id="assignments"> <table class="table"> <tbody> @@ -175,6 +166,34 @@ </tbody> </table> </div> + + <div class="tab-pane" id="definition"> + <table class="table"> + <tbody> + <tr> + <th width="15%">Category</th> + <td>{{policy.alertDefinition.category}}</td> + </tr> + <tr> + <th>Severity</th> + <td> + <span class="label label-{{Policy.getSeverityClass(policy.alertDefinition.severity)}}"> + {{policy.alertDefinition.severity}} + </span> + </td> + </tr> + <tr> + <th>Alert Subject</th> + <td>{{policy.alertDefinition.subject}}</td> + </tr> + <tr> + <th>Alert Body</th> + <td><pre>{{policy.alertDefinition.body}}</pre></td> + </tr> + </tbody> + </table> + </div> + <div class="tab-pane" id="alerts"> <div sort-table="alertList"> <table class="table table-bordered"> http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/dd9cd7c5/eagle-server/src/main/webapp/app/dev/public/js/app.js ---------------------------------------------------------------------- diff --git a/eagle-server/src/main/webapp/app/dev/public/js/app.js b/eagle-server/src/main/webapp/app/dev/public/js/app.js index 1eb833f..87cae11 100644 --- a/eagle-server/src/main/webapp/app/dev/public/js/app.js +++ b/eagle-server/src/main/webapp/app/dev/public/js/app.js @@ -118,10 +118,10 @@ var app = {}; }) // ================================= Alerts ================================= .state('alertList', { - url: "/alerts", + url: "/alerts?startTime&endTime", templateUrl: "partials/alert/list.html?_=" + window._TRS(), controller: "alertListCtrl", - resolve: routeResolve() + resolve: routeResolve({ time: { autoRefresh: true } }) }) .state('policyList', { url: "/policies", @@ -328,6 +328,10 @@ var app = {}; $("#eagleTimeRangeMDL").modal(); }; + $scope.updateTimeAutoRefresh = function () { + Time.autoRefresh = !Time.autoRefresh; + }; + $scope.setLastDuration = function (hours) { var endTime = new Time(); var startTime = endTime.clone().subtract(hours, "hours"); http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/dd9cd7c5/eagle-server/src/main/webapp/app/dev/public/js/ctrls/alertCtrl.js ---------------------------------------------------------------------- diff --git a/eagle-server/src/main/webapp/app/dev/public/js/ctrls/alertCtrl.js b/eagle-server/src/main/webapp/app/dev/public/js/ctrls/alertCtrl.js index 02852f4..4ddff52 100644 --- a/eagle-server/src/main/webapp/app/dev/public/js/ctrls/alertCtrl.js +++ b/eagle-server/src/main/webapp/app/dev/public/js/ctrls/alertCtrl.js @@ -24,23 +24,35 @@ // ====================================================================================== // = Alert = // ====================================================================================== - eagleControllers.controller('alertListCtrl', function ($scope, $wrapState, $interval, PageConfig, CompatibleEntity, Time) { + eagleControllers.controller('alertListCtrl', function ($scope, $wrapState, PageConfig, CompatibleEntity, Time) { PageConfig.title = "Alerts"; - $scope.displayType = "raw"; - $scope.alertList = CompatibleEntity.query("LIST", { - query: "AlertService", - startTime: new Time().subtract(7, 'day'), - endTime: new Time() - }); + $scope.alertList = []; + $scope.loading = false; + + function loadAlerts() { + $scope.loading = true; + var list = CompatibleEntity.query("LIST", { + query: "AlertService", + startTime: new Time('startTime'), + endTime: new Time('endTime') + }); + list._then(function () { + $scope.alertList = list; + $scope.loading = false; + }); + } + loadAlerts(); + + Time.onReload(loadAlerts, $scope); // ================================================================ // = Sync = // ================================================================ - var refreshInterval = $interval($scope.alertList._refresh, 1000 * 10); + /* var refreshInterval = $interval($scope.alertList._refresh, 1000 * 10); $scope.$on('$destroy', function() { $interval.cancel(refreshInterval); - }); + }); */ }); eagleControllers.controller('alertDetailCtrl', function ($sce, $scope, $wrapState, PageConfig, CompatibleEntity) { @@ -137,7 +149,6 @@ ]; $scope.tab = "setting"; - $scope.displayType = "raw"; $scope.setTab = function (tab) { $scope.tab = tab; @@ -180,23 +191,6 @@ } updatePolicy(); - /* - $scope.streamList = []; - Entity.queryMetadata("streams")._then(function (res) { - $scope.streamList = $.map(res.data, function (stream) { - var application = Application.findProvider(stream.dataSource); - return $.extend({application: application}, stream); - }); - }); - - $scope.dataSources = {}; - Entity.queryMetadata("datasources")._then(function(res) { - $.each(res.data, function (i, dataSource) { - $scope.dataSources[dataSource.name] = dataSource; - }); - }); - */ - var streams = {}; Entity.queryMetadata("datasources")._then(function(res) { var dataSources = {}; http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/dd9cd7c5/eagle-server/src/main/webapp/app/dev/public/js/services/timeSrv.js ---------------------------------------------------------------------- diff --git a/eagle-server/src/main/webapp/app/dev/public/js/services/timeSrv.js b/eagle-server/src/main/webapp/app/dev/public/js/services/timeSrv.js index c8f367d..2c8e168 100644 --- a/eagle-server/src/main/webapp/app/dev/public/js/services/timeSrv.js +++ b/eagle-server/src/main/webapp/app/dev/public/js/services/timeSrv.js @@ -26,6 +26,7 @@ ["seconds", "s", "s"] ]; + var autoGenerateTime = false; var keepTime = false; var serviceModule = angular.module('eagle.service'); @@ -96,6 +97,7 @@ $Time.TIME_RANGE_PICKER = "timeRange"; $Time.pickerType = null; + $Time.autoRefresh = false; $Time._reloadListenerList = reloadListenerList; // TODO: time zone @@ -236,12 +238,21 @@ $Time.getPromise = function (config, state, param) { var deferred = $q.defer(); + var timeConfig = typeof config.time === true ? {} : config.time; + + // Ignore time update if customise time set. if(keepTime) { + // Update auto refresh mark if time is generated from promise + if(autoGenerateTime && timeConfig) { + $Time.autoRefresh = timeConfig.autoRefresh; + } + + autoGenerateTime = false; keepTime = false; deferred.resolve($Time); } else { - if (config.time === true) { - $Time.pickerType = $Time.TIME_RANGE_PICKER; + if (timeConfig) { + $Time.pickerType = timeConfig.type || $Time.TIME_RANGE_PICKER; startTime = $Time.verifyTime(param.startTime); endTime = $Time.verifyTime(param.endTime); @@ -250,6 +261,7 @@ endTime = $Time(); startTime = endTime.clone().subtract(2, "hour"); + autoGenerateTime = true; keepTime = true; $Time._innerSearch = { startTime: $Time.format(startTime), @@ -259,6 +271,7 @@ } else { $Time._innerSearch = null; $Time.pickerType = null; + $Time.autoRefresh = false; } deferred.resolve($Time); } @@ -266,6 +279,26 @@ return deferred.promise; }; + // Interval update + setInterval(function () { + if(!$Time.autoRefresh) return; + + var interval = $Time.diff($Time('startTime'), $Time('endTime')); + var endTime = $Time(); + var startTime = endTime.clone().subtract(interval, "ms"); + $Time.timeRange(startTime, endTime); + }, 1000 * 60); + + if(window.sessionStorage) { + $Time.autoRefresh = sessionStorage.getItem("timeAutoRefresh") === "true"; + } + + $(window).unload(function(){ + if(window.sessionStorage) { + sessionStorage.setItem("timeAutoRefresh", $Time.autoRefresh); + } + }); + return $Time; }); })();