diff --git a/src/www/qserv/css/QservWorkerFiles.css b/src/www/qserv/css/QservWorkerFiles.css new file mode 100644 index 000000000..6d00c1f38 --- /dev/null +++ b/src/www/qserv/css/QservWorkerFiles.css @@ -0,0 +1,24 @@ +#fwk-qserv-files-controls label { + font-weight: bold; +} +table#fwk-qserv-files caption { + caption-side: top; + text-align: right; + padding-top: 0; +} +table#fwk-qserv-files > thead > tr > th.sticky { + position:sticky; + top:80px; + z-index:2; +} +table#fwk-qserv-files tbody th, +table#fwk-qserv-files tbody td { + vertical-align:middle; +} +table#fwk-qserv-files pre { + padding: 0; + margin: 0; +} +table#fwk-qserv-files caption.updating { + background-color: #ffeeba; +} diff --git a/src/www/qserv/css/QservWorkerResultsFilesystem.css b/src/www/qserv/css/QservWorkerResultsFilesystem.css index 8f1a2669b..37b02f93b 100644 --- a/src/www/qserv/css/QservWorkerResultsFilesystem.css +++ b/src/www/qserv/css/QservWorkerResultsFilesystem.css @@ -22,3 +22,6 @@ table#fwk-qserv-results-filesystem > thead > tr > th.sticky { top:80px; z-index:2; } +table#fwk-qserv-results-filesystem tbody > tr.display-worker-files:hover { + cursor:pointer; +} \ No newline at end of file diff --git a/src/www/qserv/js/Common.js b/src/www/qserv/js/Common.js index cda8f0505..202fb7c8c 100644 --- a/src/www/qserv/js/Common.js +++ b/src/www/qserv/js/Common.js @@ -6,7 +6,7 @@ function(sqlFormatter, _) { class Common { - static RestAPIVersion = 27; + static RestAPIVersion = 28; static query2text(query, expanded) { if (expanded) { return sqlFormatter.format(query, Common._sqlFormatterConfig); @@ -37,6 +37,16 @@ function(sqlFormatter, }, '') + ` `; } + static KB = 1000; + static MB = 1000 * 1000; + static GB = 1000 * 1000 * 1000; + static format_data_rate(v) { + if (v == 0) return v + ""; // as string + else if (v < Common.KB * 10) return v.toFixed(0); + else if (v < Common.MB * 10) return (v / Common.KB).toFixed(0) + " KB"; + else if (v < Common.GB * 10) return (v / Common.MB).toFixed(0) + " MB"; + else return (v / Common.GB).toFixed(0) + " GB"; + } } return Common; }); diff --git a/src/www/qserv/js/QservCzarStatistics.js b/src/www/qserv/js/QservCzarStatistics.js index f61022946..3455f26c6 100644 --- a/src/www/qserv/js/QservCzarStatistics.js +++ b/src/www/qserv/js/QservCzarStatistics.js @@ -269,7 +269,7 @@ function(CSSLoader, if (runTimeSec > 0) { const perf = data.qdisp_stats[counter] / runTimeSec; if (QservCzarStatistics._totals_data_rate.has(counter)) { - that._set_counter_perf('totals', counter, QservCzarStatistics._format_data_rate(perf), '_sum'); + that._set_counter_perf('totals', counter, Common.format_data_rate(perf), '_sum'); } else { that._set_counter_perf('totals', counter, perf.toFixed(0), '_sum'); } @@ -281,7 +281,7 @@ function(CSSLoader, if (deltaT > 0) { const perf = deltaVal / deltaT; if (QservCzarStatistics._totals_data_rate.has(counter)) { - that._set_counter_perf('totals', counter, QservCzarStatistics._format_data_rate(perf)); + that._set_counter_perf('totals', counter, Common.format_data_rate(perf)); } else { that._set_counter_perf('totals', counter, perf.toFixed(0)); } @@ -366,26 +366,16 @@ function(CSSLoader, }, '') + ` `; } - static _KB = 1000; - static _MB = 1000 * 1000; - static _GB = 1000 * 1000 * 1000; static _format_bucket_limit(v, data_rate=false) { if (isNaN(v)) return v; if (data_rate) { - if (v < QservCzarStatistics._KB) return v + " B/s"; - else if (v < QservCzarStatistics._MB) return (v / QservCzarStatistics._KB).toFixed(0) + " KB/s"; - else if (v < QservCzarStatistics._GB) return (v / QservCzarStatistics._MB).toFixed(0) + " MB/s"; - return (v / QservCzarStatistics._GB).toFixed(0) + " GB/s"; + if (v < Common.KB) return v + " B/s"; + else if (v < Common.MB) return (v / Common.KB).toFixed(0) + " KB/s"; + else if (v < Common.GB) return (v / Common.MB).toFixed(0) + " MB/s"; + return (v / Common.GB).toFixed(0) + " GB/s"; } return v.toLocaleString(); } - static _format_data_rate(v) { - if (v == 0) return v + ""; // as string - else if (v < QservCzarStatistics._KB * 10) return v.toFixed(0); - else if (v < QservCzarStatistics._MB * 10) return (v / QservCzarStatistics._KB).toFixed(0) + " KB"; - else if (v < QservCzarStatistics._GB * 10) return (v / QservCzarStatistics._MB).toFixed(0) + " MB"; - else return (v / QservCzarStatistics._GB).toFixed(0) + " GB"; - } /** * @param {Number} seconds diff --git a/src/www/qserv/js/QservMonitoringDashboard.js b/src/www/qserv/js/QservMonitoringDashboard.js index 8e3e3ff03..f8de34858 100644 --- a/src/www/qserv/js/QservMonitoringDashboard.js +++ b/src/www/qserv/js/QservMonitoringDashboard.js @@ -56,6 +56,7 @@ require([ 'qserv/QservWorkerTasks', 'qserv/QservWorkerTaskHist', 'qserv/QservWorkerResultsFilesystem', + 'qserv/QservWorkerFiles', 'qserv/QservWorkerConfig', 'qserv/ReplicationController', 'qserv/ReplicationTools', @@ -101,6 +102,7 @@ function(CSSLoader, QservWorkerTasks, QservWorkerTaskHist, QservWorkerResultsFilesystem, + QservWorkerFiles, QservWorkerConfig, ReplicationController, ReplicationTools, @@ -175,6 +177,7 @@ function(CSSLoader, new QservWorkerTasks('Tasks'), new QservWorkerTaskHist('Task Histograms'), new QservWorkerResultsFilesystem('Results Filesystem'), + new QservWorkerFiles('Files'), new QservWorkerConfig('Config') ] }, diff --git a/src/www/qserv/js/QservWorkerFiles.js b/src/www/qserv/js/QservWorkerFiles.js new file mode 100644 index 000000000..bf8825fcd --- /dev/null +++ b/src/www/qserv/js/QservWorkerFiles.js @@ -0,0 +1,302 @@ +define([ + 'webfwk/CSSLoader', + 'webfwk/Fwk', + 'webfwk/FwkApplication', + 'qserv/Common', + 'underscore'], + +function(CSSLoader, + Fwk, + FwkApplication, + Common, + _) { + + CSSLoader.load('qserv/css/QservWorkerFiles.css'); + + class QservWorkerFiles extends FwkApplication { + + constructor(name) { + super(name); + } + fwk_app_on_show() { + console.log('show: ' + this.fwk_app_name); + this.fwk_app_on_update(); + } + fwk_app_on_hide() { + console.log('hide: ' + this.fwk_app_name); + } + fwk_app_on_update() { + if (this.fwk_app_visible) { + this._init(); + if (this._prev_update_sec === undefined) { + this._prev_update_sec = 0; + } + let now_sec = Fwk.now().sec; + if (now_sec - this._prev_update_sec > this._update_interval_sec()) { + this._prev_update_sec = now_sec; + this._init(); + this._load(); + } + } + } + set_worker(worker) { + this._init(); + this._load(worker); + } + _init() { + if (this._initialized === undefined) this._initialized = false; + if (this._initialized) return; + this._initialized = true; + let html = ` +
QID | ++ | chunk | +job | +attempt | +filename | +size | +s-1 | +created | +modified | +inspected | +
---|
${file.task.chunk_id}
${file.task.job_id}
${file.task.attemptcount}
${file.filename}
${file.size}
${QservWorkerFiles._io_performance(file.size, file.ctime, file.mtime)}
${(new Date(createTime_msec)).toISOString()}
${QservWorkerFiles._timestamps_diff2str(createTime_msec, modifyTime_msec)}
${QservWorkerFiles._timestamp2hhmmss(modifyTime_msec)}
${QservWorkerFiles._timestamps_diff2str(modifyTime_msec, snapshotTime_msec)}
${QservWorkerFiles._timestamp2hhmmss(snapshotTime_msec)}
${queryId}