Fixed a bug where polling would stop if a non-200 response was received and added a UI logging module
Project: http://git-wip-us.apache.org/repos/asf/incubator-blur/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-blur/commit/d71f322a Tree: http://git-wip-us.apache.org/repos/asf/incubator-blur/tree/d71f322a Diff: http://git-wip-us.apache.org/repos/asf/incubator-blur/diff/d71f322a Branch: refs/heads/apache-blur-0.2 Commit: d71f322a50f36123b072abb65d896249f5a7f1f6 Parents: 55ac45b Author: Chris Rohr <[email protected]> Authored: Sat May 24 15:46:06 2014 -0400 Committer: Chris Rohr <[email protected]> Committed: Sat May 24 15:46:06 2014 -0400 ---------------------------------------------------------------------- contrib/blur-console/src/main/webapp/index.html | 14 ++-- .../src/main/webapp/js/blurconsole.data.js | 55 +++++++++---- .../src/main/webapp/js/blurconsole.logging.js | 85 ++++++++++++++++++++ .../src/main/webapp/js/blurconsole.model.js | 61 ++++++++++---- .../src/main/webapp/js/blurconsole.shell.js | 14 ++++ .../src/main/webapp/sass/blurconsole.shell.scss | 16 ++-- 6 files changed, 200 insertions(+), 45 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/d71f322a/contrib/blur-console/src/main/webapp/index.html ---------------------------------------------------------------------- diff --git a/contrib/blur-console/src/main/webapp/index.html b/contrib/blur-console/src/main/webapp/index.html index 5f82068..455671a 100644 --- a/contrib/blur-console/src/main/webapp/index.html +++ b/contrib/blur-console/src/main/webapp/index.html @@ -36,7 +36,12 @@ under the License. <body> <nav class="navbar navbar-inverse navbar-fixed-top"> <a class="navbar-brand" href="#">Blur Console</a> - + <div class="pull-right"> + <button type="button" id="view_logging_trigger" class="btn btn-default btn-sm"> + Logs + <span class="badge badge-warning"></span> + </button> + </div> </nav> <nav class="side-nav"> <ul> @@ -60,16 +65,10 @@ under the License. <script src="js/utils/jquery.uriAnchor.js"></script> <script src="js/utils/jquery.event.gevent.js"></script> - <!-- <script src="bower_components/twbs-bootstrap-sass/vendor/assets/javascripts/bootstrap/affix.js"></script> - <script src="bower_components/twbs-bootstrap-sass/vendor/assets/javascripts/bootstrap/alert.js"></script> - <script src="bower_components/twbs-bootstrap-sass/vendor/assets/javascripts/bootstrap/dropdown.js"></script> --> <script src="libs/twbs-bootstrap-sass/vendor/assets/javascripts/bootstrap/tooltip.js"></script> <script src="libs/twbs-bootstrap-sass/vendor/assets/javascripts/bootstrap/modal.js"></script> <script src="libs/twbs-bootstrap-sass/vendor/assets/javascripts/bootstrap/transition.js"></script> - <!-- <script src="bower_components/twbs-bootstrap-sass/vendor/assets/javascripts/bootstrap/button.js"></script> --> <script src="libs/twbs-bootstrap-sass/vendor/assets/javascripts/bootstrap/popover.js"></script> - <!-- <script src="bower_components/twbs-bootstrap-sass/vendor/assets/javascripts/bootstrap/carousel.js"></script> - <script src="bower_components/twbs-bootstrap-sass/vendor/assets/javascripts/bootstrap/scrollspy.js"></script> --> <script src="libs/twbs-bootstrap-sass/vendor/assets/javascripts/bootstrap/collapse.js"></script> <script src="libs/twbs-bootstrap-sass/vendor/assets/javascripts/bootstrap/tab.js"></script> <script src="libs/flot/jquery.flot.js"></script> @@ -81,6 +80,7 @@ under the License. <script src="js/blurconsole.utils.js"></script> <script src="js/blurconsole.b_utils.js"></script> <script src="js/blurconsole.shell.js"></script> + <script src="js/blurconsole.logging.js"></script> <script src="js/blurconsole.dashboard.js"></script> <script src="js/blurconsole.tables.js"></script> <script src="js/blurconsole.queries.js"></script> http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/d71f322a/contrib/blur-console/src/main/webapp/js/blurconsole.data.js ---------------------------------------------------------------------- diff --git a/contrib/blur-console/src/main/webapp/js/blurconsole.data.js b/contrib/blur-console/src/main/webapp/js/blurconsole.data.js index 003e791..54a1024 100644 --- a/contrib/blur-console/src/main/webapp/js/blurconsole.data.js +++ b/contrib/blur-console/src/main/webapp/js/blurconsole.data.js @@ -20,22 +20,31 @@ under the License. /*global blurconsole:false */ blurconsole.data = (function() { 'use strict'; - var getTableList, getNodeList, getQueryPerformance, getQueries, cancelQuery, disableTable, enableTable, deleteTable, getSchema, findTerms, sendSearch; + var getTableList, getNodeList, getQueryPerformance, getQueries, cancelQuery, disableTable, enableTable, deleteTable, getSchema, findTerms, sendSearch, + logError; getTableList = function(callback) { - $.getJSON('/service/tables', callback); + $.getJSON('/service/tables', callback).fail(function(xhr) { + logError(xhr.responseText, xhr.status, 'tables', callback); + }); }; getNodeList = function(callback) { - $.getJSON('/service/nodes', callback); + $.getJSON('/service/nodes', callback).fail(function(xhr) { + logError(xhr.responseText, xhr.status, 'tables', callback); + }); }; getQueryPerformance = function(callback) { - $.getJSON('/service/queries/performance', callback); + $.getJSON('/service/queries/performance', callback).fail(function(xhr) { + logError(xhr.responseText, xhr.status, 'tables', callback); + }); }; getQueries = function(callback) { - $.getJSON('/service/queries', callback); + $.getJSON('/service/queries', callback).fail(function(xhr) { + logError(xhr.responseText, xhr.status, 'tables', callback); + }); }; cancelQuery = function(table, uuid) { @@ -43,24 +52,24 @@ blurconsole.data = (function() { data: { table: table }, - error: function(xhr, msg) { - $.gevent.publish('query-cancel-error', uuid, msg); + error: function(xhr) { + logError(xhr.responseText, xhr.status, 'tables'); } }); }; disableTable = function(table) { $.ajax('/service/tables/' + table + '/disable', { - error: function(xhr, msg) { - $.gevent.publish('table-disable-error', table, msg); + error: function(xhr) { + logError(xhr.responseText, xhr.status, 'tables'); } }); }; enableTable = function(table) { $.ajax('/service/tables/' + table + '/enable', { - error: function(xhr, msg) { - $.gevent.publish('table-enable-error', table, msg); + error: function(xhr) { + logError(xhr.responseText, xhr.status, 'tables'); } }); }; @@ -70,18 +79,22 @@ blurconsole.data = (function() { data: { includeFiles: includeFiles }, - error: function(xhr, msg) { - $.gevent.publish('table-delete-error', table, msg); + error: function(xhr) { + logError(xhr.responseText, xhr.status, 'tables'); } }); }; getSchema = function(table, callback) { - $.getJSON('/service/tables/' + table + '/schema', callback); + $.getJSON('/service/tables/' + table + '/schema', callback).fail(function(xhr) { + logError(xhr.responseText, xhr.status, 'tables'); + }); }; findTerms = function(table, family, column, startsWith, callback) { - $.getJSON('/service/tables/' + table + '/' + family + '/' + column + '/terms', {startsWith: startsWith}, callback); + $.getJSON('/service/tables/' + table + '/' + family + '/' + column + '/terms', {startsWith: startsWith}, callback).fail(function(xhr) { + logError(xhr.responseText, xhr.status, 'tables'); + }); }; sendSearch = function(query, table, args, callback) { @@ -89,10 +102,20 @@ blurconsole.data = (function() { $.ajax('/service/search', { 'type': 'POST', 'data': params, - 'success': callback + 'success': callback, + 'error': function(xhr) { + logError(xhr.responseText, xhr.status, 'tables'); + } }); }; + logError = function(errorMsg, status, module, callback) { + blurconsole.model.logs.logError(status + ' - ' + errorMsg, module); + if (callback) { + callback('error'); + } + }; + return { getTableList : getTableList, getNodeList : getNodeList, http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/d71f322a/contrib/blur-console/src/main/webapp/js/blurconsole.logging.js ---------------------------------------------------------------------- diff --git a/contrib/blur-console/src/main/webapp/js/blurconsole.logging.js b/contrib/blur-console/src/main/webapp/js/blurconsole.logging.js new file mode 100644 index 0000000..00afb8f --- /dev/null +++ b/contrib/blur-console/src/main/webapp/js/blurconsole.logging.js @@ -0,0 +1,85 @@ +/* + +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +*/ + +/*global blurconsole:false */ +blurconsole.logging = (function () { + 'use strict'; + var configMap = { + emptyLogMsg: 'No Errors! Yay!', + mainHtml: '<div class="log_display"></div>', + buttons: [ + { 'classes': 'btn-default', 'id': 'clear-log-button', 'label': 'Clear Logs' }, + { 'classes': 'btn-primary', 'id': 'close-logs', 'label': 'Close', 'data': {'dismiss':'modal'} } + ] + }, + jqueryMap = { + modal: null + }, + initModule, showLogging, clearLogging, drawLogs; + + initModule = function() { + $.gevent.subscribe($(document), 'show-logging', showLogging); + $.gevent.subscribe($(document), 'logging-updated', drawLogs); + }; + + showLogging = function() { + if (jqueryMap.modal === null) { + jqueryMap.modal = $(blurconsole.browserUtils.modal('error_log_modal', 'Error Logs', configMap.mainHtml, configMap.buttons, 'large')); + jqueryMap.modal.modal() + .on('shown.bs.modal', function(){ + jqueryMap.logHolder = $('.log_display', jqueryMap.modal); + console.log(jqueryMap.logHolder); + drawLogs(); + }) + .on('click', '#clear-log-button', clearLogging); + } else { + jqueryMap.modal.modal('show'); + } + }; + + clearLogging = function() { + jqueryMap.logHolder.html(configMap.emptyLogMsg); + blurconsole.model.logs.clearErrors(); + }; + + drawLogs = function() { + var errors = blurconsole.model.logs.getLogs(); + + if (jqueryMap.logHolder) { + if (errors.length === 0) { + jqueryMap.logHolder.html(configMap.emptyLogMsg); + } else { + var errorList = '<ul>'; + errors.sort(function(a, b) { + return a.timestamp.getTime() > b.timestamp.getTime(); + }); + $.each(errors, function(i, error){ + errorList += '<li><strong>' + error.error + ' (' + error.module + ')</strong><div class="pull-right"><em>' + error.timestamp.toTimeString() + '</em></div></li>'; + }); + errorList += '</ul>'; + jqueryMap.logHolder.html(errorList); + } + } + }; + + return { + initModule : initModule + }; +}()); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/d71f322a/contrib/blur-console/src/main/webapp/js/blurconsole.model.js ---------------------------------------------------------------------- diff --git a/contrib/blur-console/src/main/webapp/js/blurconsole.model.js b/contrib/blur-console/src/main/webapp/js/blurconsole.model.js index 0420e65..9e8fc41 100644 --- a/contrib/blur-console/src/main/webapp/js/blurconsole.model.js +++ b/contrib/blur-console/src/main/webapp/js/blurconsole.model.js @@ -29,9 +29,10 @@ blurconsole.model = (function() { currentClusters: [], nodeMap : null, queryPerformance : [], - queries : {} + queries : {}, + errors: [] }, - tables, metrics, nodes, queries, search, initModule, nodePoller, updateNodes, tablePoller, updateTables, queryPerformancePoller, updateQueryPerformance, queryPoller, updateQueries; + tables, metrics, nodes, queries, search, logs, initModule, nodePoller, updateNodes, tablePoller, updateTables, queryPerformancePoller, updateQueryPerformance, queryPoller, updateQueries; tables = (function() { var getClusters, getEnabledTables, getDisabledTables, isDataLoaded, disableTable, enableTable, deleteTable, getSchema, findTerms, getAllEnabledTables, getFamilies; @@ -425,12 +426,37 @@ blurconsole.model = (function() { }; }()); + logs = (function() { + var logError, clearErrors, getLogs; + + logError = function(error, module) { + stateMap.errors.push({error: error, module: module, timestamp: new Date()}); + $.gevent.publish('logging-updated'); + }; + + clearErrors = function() { + delete stateMap.errors; + stateMap.errors = []; + $.gevent.publish('logging-updated'); + }; + + getLogs = function() { + return stateMap.errors; + }; + + return { + logError: logError, + clearErrors: clearErrors, + getLogs: getLogs + }; + }()); + nodePoller = function() { configMap.poller.getNodeList(updateNodes); }; updateNodes = function(nodes) { - if (!blurconsole.utils.equals(nodes, stateMap.nodeMap)) { + if (nodes !== 'error' && !blurconsole.utils.equals(nodes, stateMap.nodeMap)) { stateMap.nodeMap = nodes; $.gevent.publish('node-status-updated'); } @@ -442,11 +468,13 @@ blurconsole.model = (function() { }; updateTables = function(data) { - var tables = data.tables, clusters = data.clusters; - if (!blurconsole.utils.equals(tables, stateMap.currentTables) || !blurconsole.utils.equals(clusters, stateMap.currentClusters)) { - stateMap.currentTables = tables; - stateMap.currentClusters = clusters; - $.gevent.publish('tables-updated'); + if (data !== 'error') { + var tables = data.tables, clusters = data.clusters; + if (!blurconsole.utils.equals(tables, stateMap.currentTables) || !blurconsole.utils.equals(clusters, stateMap.currentClusters)) { + stateMap.currentTables = tables; + stateMap.currentClusters = clusters; + $.gevent.publish('tables-updated'); + } } setTimeout(tablePoller, 5000); }; @@ -456,12 +484,14 @@ blurconsole.model = (function() { }; updateQueryPerformance = function(performanceMetric) { - if (stateMap.queryPerformance.length === 100) { - stateMap.queryPerformance.shift(); - } + if (performanceMetric !== 'error') { + if (stateMap.queryPerformance.length === 100) { + stateMap.queryPerformance.shift(); + } - stateMap.queryPerformance.push(performanceMetric); - $.gevent.publish('query-perf-updated'); + stateMap.queryPerformance.push(performanceMetric); + $.gevent.publish('query-perf-updated'); + } setTimeout(queryPerformancePoller, 5000); }; @@ -470,7 +500,7 @@ blurconsole.model = (function() { }; updateQueries = function(queries) { - if (!blurconsole.utils.equals(queries, stateMap.queries)) { + if (queries !== 'error' && !blurconsole.utils.equals(queries, stateMap.queries)) { stateMap.queries = queries; $.gevent.publish('queries-updated'); } @@ -492,6 +522,7 @@ blurconsole.model = (function() { metrics: metrics, nodes : nodes, queries : queries, - search : search + search : search, + logs: logs }; }()); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/d71f322a/contrib/blur-console/src/main/webapp/js/blurconsole.shell.js ---------------------------------------------------------------------- diff --git a/contrib/blur-console/src/main/webapp/js/blurconsole.shell.js b/contrib/blur-console/src/main/webapp/js/blurconsole.shell.js index ee19283..ba0572a 100644 --- a/contrib/blur-console/src/main/webapp/js/blurconsole.shell.js +++ b/contrib/blur-console/src/main/webapp/js/blurconsole.shell.js @@ -153,6 +153,11 @@ blurconsole.shell = (function () { setJqueryMap(); blurconsole.schema.initModule(); + blurconsole.logging.initModule(); + + $('#view_logging_trigger').on('click', function() { + $.gevent.publish('show-logging'); + }); $('.side-nav li').tooltip(); @@ -171,6 +176,15 @@ blurconsole.shell = (function () { tab: configMap.defaultTab }); } + + $.gevent.subscribe($(document), 'logging-updated', function() { + var errors = blurconsole.model.logs.getLogs(); + if (errors.length === 0) { + $('#view_logging_trigger .badge').html(''); + } else { + $('#view_logging_trigger .badge').html(errors.length); + } + }); }; return { http://git-wip-us.apache.org/repos/asf/incubator-blur/blob/d71f322a/contrib/blur-console/src/main/webapp/sass/blurconsole.shell.scss ---------------------------------------------------------------------- diff --git a/contrib/blur-console/src/main/webapp/sass/blurconsole.shell.scss b/contrib/blur-console/src/main/webapp/sass/blurconsole.shell.scss index a258fa4..be169ef 100644 --- a/contrib/blur-console/src/main/webapp/sass/blurconsole.shell.scss +++ b/contrib/blur-console/src/main/webapp/sass/blurconsole.shell.scss @@ -18,13 +18,6 @@ specific language governing permissions and limitations under the License. */ -.browsehappy { - margin: 0.2em 0; - background: $silver; - color: $black; - padding: 0.2em 0; -} - .input-group-btn > .btn { height: $input-height-base; } @@ -40,6 +33,10 @@ nav.navbar-fixed-top { .navbar-brand { color: $white; } + #view_logging_trigger { + margin-right: 20px; + margin-top: 14px; + } } /* Side Navigation */ @@ -72,4 +69,9 @@ nav.navbar-fixed-top { } } } +} + +#error_log_modal .modal-body { + height: 400px; + overflow: auto; } \ No newline at end of file
