You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by mc...@apache.org on 2016/04/04 18:28:40 UTC

[04/18] nifi git commit: NIFI-1563: - Federate requests and merge responses from nodes instead of storing bulletins and stats at NCM - Updating UI to support restructured status history DTO. - Return 'Insufficient History' message if aggregate stats don'

http://git-wip-us.apache.org/repos/asf/nifi/blob/0d3bd2c4/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/summary/nf-summary-table.js
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/summary/nf-summary-table.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/summary/nf-summary-table.js
index a48758a..49ad85b 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/summary/nf-summary-table.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/summary/nf-summary-table.js
@@ -29,12 +29,6 @@ nf.SummaryTable = (function () {
         urls: {
             status: '../nifi-api/controller/process-groups/root/status',
             processGroups: '../nifi-api/controller/process-groups/',
-            clusterProcessor: '../nifi-api/cluster/processors/',
-            clusterConnection: '../nifi-api/cluster/connections/',
-            clusterProcessGroup: '../nifi-api/cluster/process-groups/',
-            clusterInputPort: '../nifi-api/cluster/input-ports/',
-            clusterOutputPort: '../nifi-api/cluster/output-ports/',
-            clusterRemoteProcessGroup: '../nifi-api/cluster/remote-process-groups/',
             systemDiagnostics: '../nifi-api/system-diagnostics',
             controllerConfig: '../nifi-api/controller/config',
             d3Script: 'js/d3/d3.min.js',
@@ -364,11 +358,7 @@ nf.SummaryTable = (function () {
                 }
 
                 if (nf.Common.SUPPORTS_SVG) {
-                    if (isClustered) {
-                        markup += '<img src="images/iconChart.png" title="Show History" class="pointer show-cluster-processor-status-history" style="margin-top: 2px;"/>&nbsp;';
-                    } else {
-                        markup += '<img src="images/iconChart.png" title="Show History" class="pointer show-processor-status-history" style="margin-top: 2px;"/>&nbsp;';
-                    }
+                    markup += '<img src="images/iconChart.png" title="Show History" class="pointer show-processor-status-history" style="margin-top: 2px;"/>&nbsp;';
                 }
 
                 if (isClustered) {
@@ -432,13 +422,11 @@ nf.SummaryTable = (function () {
             if (processorsGrid.getColumns()[args.cell].id === 'actions') {
                 if (target.hasClass('go-to')) {
                     goTo(item.groupId, item.id);
-                } else if (target.hasClass('show-cluster-processor-status-history')) {
-                    nf.StatusHistory.showClusterProcessorChart(item.groupId, item.id);
                 } else if (target.hasClass('show-processor-status-history')) {
-                    nf.StatusHistory.showStandaloneProcessorChart(item.groupId, item.id);
+                    nf.StatusHistory.showProcessorChart(item.groupId, item.id);
                 } else if (target.hasClass('show-cluster-processor-summary')) {
                     // load the cluster processor summary
-                    loadClusterProcessorSummary(item.id);
+                    loadClusterProcessorSummary(item.groupId, item.id);
 
                     // hide the summary loading indicator
                     $('#summary-loading-container').hide();
@@ -526,7 +514,7 @@ nf.SummaryTable = (function () {
         
         // cluster processor refresh
         nf.Common.addHoverEffect('#cluster-processor-refresh-button', 'button-refresh', 'button-refresh-hover').click(function () {
-            loadClusterProcessorSummary($('#cluster-processor-id').text());
+            loadClusterProcessorSummary($('#cluster-processor-group-id').text(), $('#cluster-processor-id').text());
         });
 
         // initialize the cluster processor column model
@@ -616,11 +604,7 @@ nf.SummaryTable = (function () {
                 }
 
                 if (nf.Common.SUPPORTS_SVG) {
-                    if (isClustered) {
-                        markup += '<img src="images/iconChart.png" title="Show History" class="pointer show-cluster-connection-status-history" style="margin-top: 2px;"/>&nbsp;';
-                    } else {
-                        markup += '<img src="images/iconChart.png" title="Show History" class="pointer show-connection-status-history" style="margin-top: 2px;"/>&nbsp;';
-                    }
+                    markup += '<img src="images/iconChart.png" title="Show History" class="pointer show-connection-status-history" style="margin-top: 2px;"/>&nbsp;';
                 }
 
                 if (isClustered) {
@@ -684,13 +668,11 @@ nf.SummaryTable = (function () {
             if (connectionsGrid.getColumns()[args.cell].id === 'actions') {
                 if (target.hasClass('go-to')) {
                     goTo(item.groupId, item.id);
-                } else if (target.hasClass('show-cluster-connection-status-history')) {
-                    nf.StatusHistory.showClusterConnectionChart(item.groupId, item.id);
                 } else if (target.hasClass('show-connection-status-history')) {
-                    nf.StatusHistory.showStandaloneConnectionChart(item.groupId, item.id);
+                    nf.StatusHistory.showConnectionChart(item.groupId, item.id);
                 } else if (target.hasClass('show-cluster-connection-summary')) {
                     // load the cluster processor summary
-                    loadClusterConnectionSummary(item.id);
+                    loadClusterConnectionSummary(item.groupId, item.id);
 
                     // hide the summary loading indicator
                     $('#summary-loading-container').hide();
@@ -750,7 +732,7 @@ nf.SummaryTable = (function () {
         
         // cluster connection refresh
         nf.Common.addHoverEffect('#cluster-connection-refresh-button', 'button-refresh', 'button-refresh-hover').click(function () {
-            loadClusterConnectionSummary($('#cluster-connection-id').text());
+            loadClusterConnectionSummary($('#cluster-connection-group-id').text(), $('#cluster-connection-id').text());
         });
 
         // initialize the cluster processor column model
@@ -848,11 +830,7 @@ nf.SummaryTable = (function () {
                 }
 
                 if (nf.Common.SUPPORTS_SVG) {
-                    if (isClustered) {
-                        markup += '<img src="images/iconChart.png" title="Show History" class="pointer show-cluster-process-group-status-history" style="margin-top: 2px;"/>&nbsp;';
-                    } else {
-                        markup += '<img src="images/iconChart.png" title="Show History" class="pointer show-process-group-status-history" style="margin-top: 2px;"/>&nbsp;';
-                    }
+                    markup += '<img src="images/iconChart.png" title="Show History" class="pointer show-process-group-status-history" style="margin-top: 2px;"/>&nbsp;';
                 }
 
                 if (isClustered) {
@@ -919,10 +897,8 @@ nf.SummaryTable = (function () {
                         parent.nf.CanvasUtils.enterGroup(item.id);
                         parent.$('#shell-close-button').click();
                     }
-                } else if (target.hasClass('show-cluster-process-group-status-history')) {
-                    nf.StatusHistory.showClusterProcessGroupChart(item.groupId, item.id);
                 } else if (target.hasClass('show-process-group-status-history')) {
-                    nf.StatusHistory.showStandaloneProcessGroupChart(item.groupId, item.id);
+                    nf.StatusHistory.showProcessGroupChart(item.groupId, item.id);
                 } else if (target.hasClass('show-cluster-process-group-summary')) {
                     // load the cluster processor summary
                     loadClusterProcessGroupSummary(item.id);
@@ -1151,7 +1127,7 @@ nf.SummaryTable = (function () {
                     goTo(item.groupId, item.id);
                 } else if (target.hasClass('show-cluster-input-port-summary')) {
                     // load the cluster processor summary
-                    loadClusterInputPortSummary(item.id);
+                    loadClusterInputPortSummary(item.groupId, item.id);
 
                     // hide the summary loading indicator
                     $('#summary-loading-container').hide();
@@ -1235,7 +1211,7 @@ nf.SummaryTable = (function () {
         
         // cluster input port refresh
         nf.Common.addHoverEffect('#cluster-input-port-refresh-button', 'button-refresh', 'button-refresh-hover').click(function () {
-            loadClusterInputPortSummary($('#cluster-input-port-id').text());
+            loadClusterInputPortSummary($('#cluster-input-port-group-id').text(), $('#cluster-input-port-id').text());
         });
 
         // initialize the cluster input port column model
@@ -1373,7 +1349,7 @@ nf.SummaryTable = (function () {
                     goTo(item.groupId, item.id);
                 } else if (target.hasClass('show-cluster-output-port-summary')) {
                     // load the cluster processor summary
-                    loadClusterOutputPortSummary(item.id);
+                    loadClusterOutputPortSummary(item.groupId, item.id);
 
                     // hide the summary loading indicator
                     $('#summary-loading-container').hide();
@@ -1457,7 +1433,7 @@ nf.SummaryTable = (function () {
         
         // cluster output port refresh
         nf.Common.addHoverEffect('#cluster-output-port-refresh-button', 'button-refresh', 'button-refresh-hover').click(function () {
-            loadClusterOutputPortSummary($('#cluster-output-port-id').text());
+            loadClusterOutputPortSummary($('#cluster-output-port-group-id').text(), $('#cluster-output-port-id').text());
         });
 
         // initialize the cluster output port column model
@@ -1563,11 +1539,7 @@ nf.SummaryTable = (function () {
                 }
 
                 if (nf.Common.SUPPORTS_SVG) {
-                    if (isClustered) {
-                        markup += '<img src="images/iconChart.png" title="Show History" class="pointer show-cluster-remote-process-group-status-history" style="margin-top: 2px;"/>&nbsp;';
-                    } else {
-                        markup += '<img src="images/iconChart.png" title="Show History" class="pointer show-remote-process-group-status-history" style="margin-top: 2px;"/>&nbsp;';
-                    }
+                    markup += '<img src="images/iconChart.png" title="Show History" class="pointer show-remote-process-group-status-history" style="margin-top: 2px;"/>&nbsp;';
                 }
 
                 if (isClustered) {
@@ -1631,13 +1603,11 @@ nf.SummaryTable = (function () {
             if (remoteProcessGroupsGrid.getColumns()[args.cell].id === 'actions') {
                 if (target.hasClass('go-to')) {
                     goTo(item.groupId, item.id);
-                } else if (target.hasClass('show-cluster-remote-process-group-status-history')) {
-                    nf.StatusHistory.showClusterRemoteProcessGroupChart(item.groupId, item.id);
                 } else if (target.hasClass('show-remote-process-group-status-history')) {
-                    nf.StatusHistory.showStandaloneRemoteProcessGroupChart(item.groupId, item.id);
+                    nf.StatusHistory.showRemoteProcessGroupChart(item.groupId, item.id);
                 } else if (target.hasClass('show-cluster-remote-process-group-summary')) {
                     // load the cluster processor summary
-                    loadClusterRemoteProcessGroupSummary(item.id);
+                    loadClusterRemoteProcessGroupSummary(item.groupId, item.id);
 
                     // hide the summary loading indicator
                     $('#summary-loading-container').hide();
@@ -1721,7 +1691,7 @@ nf.SummaryTable = (function () {
         
         // cluster remote process group refresh
         nf.Common.addHoverEffect('#cluster-remote-process-group-refresh-button', 'button-refresh', 'button-refresh-hover').click(function () {
-            loadClusterRemoteProcessGroupSummary($('#cluster-remote-process-group-id').text());
+            loadClusterRemoteProcessGroupSummary($('#cluster-remote-process-group-group-id').text(), $('#cluster-remote-process-group-id').text());
         });
 
         // initialize the cluster remote process group column model
@@ -1987,67 +1957,81 @@ nf.SummaryTable = (function () {
      * Refreshes the system diagnostics.
      */
     var refreshSystemDiagnostics = function () {
+        var systemDiagnosticsUri = config.urls.systemDiagnostics;
+
+        // add the parameter if appropriate
+        var parameters = {};
+        if (!nf.Common.isNull(clusterNodeId)) {
+            parameters['clusterNodeId'] = clusterNodeId;
+        }
+
+        // update the status uri if appropriate
+        if (!$.isEmptyObject(parameters)) {
+            systemDiagnosticsUri += '?' + $.param(parameters);
+        }
+
         return $.ajax({
             type: 'GET',
-            url: nf.SummaryTable.systemDiagnosticsUrl,
+            url: systemDiagnosticsUri,
             dataType: 'json'
         }).done(function (response) {
             var systemDiagnostics = response.systemDiagnostics;
+            var aggregateSnapshot = systemDiagnostics.aggregateSnapshot;
 
             // heap
-            $('#max-heap').text(systemDiagnostics.maxHeap);
-            $('#total-heap').text(systemDiagnostics.totalHeap);
-            $('#used-heap').text(systemDiagnostics.usedHeap);
-            $('#free-heap').text(systemDiagnostics.freeHeap);
+            $('#max-heap').text(aggregateSnapshot.maxHeap);
+            $('#total-heap').text(aggregateSnapshot.totalHeap);
+            $('#used-heap').text(aggregateSnapshot.usedHeap);
+            $('#free-heap').text(aggregateSnapshot.freeHeap);
 
             // ensure the heap utilization could be calculated
-            if (nf.Common.isDefinedAndNotNull(systemDiagnostics.heapUtilization)) {
-                $('#utilization-heap').text('(' + systemDiagnostics.heapUtilization + ')');
+            if (nf.Common.isDefinedAndNotNull(aggregateSnapshot.heapUtilization)) {
+                $('#utilization-heap').text('(' + aggregateSnapshot.heapUtilization + ')');
             } else {
                 $('#utilization-heap').text('');
             }
 
             // non heap
-            $('#max-non-heap').text(systemDiagnostics.maxNonHeap);
-            $('#total-non-heap').text(systemDiagnostics.totalNonHeap);
-            $('#used-non-heap').text(systemDiagnostics.usedNonHeap);
-            $('#free-non-heap').text(systemDiagnostics.freeNonHeap);
+            $('#max-non-heap').text(aggregateSnapshot.maxNonHeap);
+            $('#total-non-heap').text(aggregateSnapshot.totalNonHeap);
+            $('#used-non-heap').text(aggregateSnapshot.usedNonHeap);
+            $('#free-non-heap').text(aggregateSnapshot.freeNonHeap);
 
             // enure the non heap utilization could be calculated
-            if (nf.Common.isDefinedAndNotNull(systemDiagnostics.nonHeapUtilization)) {
-                $('#utilization-non-heap').text('(' + systemDiagnostics.nonHeapUtilization + ')');
+            if (nf.Common.isDefinedAndNotNull(aggregateSnapshot.nonHeapUtilization)) {
+                $('#utilization-non-heap').text('(' + aggregateSnapshot.nonHeapUtilization + ')');
             } else {
                 $('#utilization-non-heap').text('');
             }
 
             // garbage collection
             var garbageCollectionContainer = $('#garbage-collection-table tbody').empty();
-            $.each(systemDiagnostics.garbageCollection, function (_, garbageCollection) {
+            $.each(aggregateSnapshot.garbageCollection, function (_, garbageCollection) {
                 addGarbageCollection(garbageCollectionContainer, garbageCollection);
             });
 
             // available processors
-            $('#available-processors').text(systemDiagnostics.availableProcessors);
+            $('#available-processors').text(aggregateSnapshot.availableProcessors);
 
             // load
-            if (nf.Common.isDefinedAndNotNull(systemDiagnostics.processorLoadAverage)) {
-                $('#processor-load-average').text(nf.Common.formatFloat(systemDiagnostics.processorLoadAverage));
+            if (nf.Common.isDefinedAndNotNull(aggregateSnapshot.processorLoadAverage)) {
+                $('#processor-load-average').text(nf.Common.formatFloat(aggregateSnapshot.processorLoadAverage));
             } else {
-                $('#processor-load-average').html(nf.Common.formatValue(systemDiagnostics.processorLoadAverage));
+                $('#processor-load-average').html(nf.Common.formatValue(aggregateSnapshot.processorLoadAverage));
             }
 
             // database storage usage
             var flowFileRepositoryStorageUsageContainer = $('#flow-file-repository-storage-usage-container').empty();
-            addStorageUsage(flowFileRepositoryStorageUsageContainer, systemDiagnostics.flowFileRepositoryStorageUsage);
+            addStorageUsage(flowFileRepositoryStorageUsageContainer, aggregateSnapshot.flowFileRepositoryStorageUsage);
 
             // database storage usage
             var contentRepositoryUsageContainer = $('#content-repository-storage-usage-container').empty();
-            $.each(systemDiagnostics.contentRepositoryStorageUsage, function (_, contentRepository) {
+            $.each(aggregateSnapshot.contentRepositoryStorageUsage, function (_, contentRepository) {
                 addStorageUsage(contentRepositoryUsageContainer, contentRepository);
             });
 
             // update the stats last refreshed timestamp
-            $('#system-diagnostics-last-refreshed').text(systemDiagnostics.statsLastRefreshed);
+            $('#system-diagnostics-last-refreshed').text(aggregateSnapshot.statsLastRefreshed);
         }).fail(nf.Common.handleAjaxError);
     };
 
@@ -2106,39 +2090,39 @@ nf.SummaryTable = (function () {
      * @argument {array} inputPortItems                 The input port data
      * @argument {array} outputPortItems                The input port data
      * @argument {array} remoteProcessGroupItems        The remote process group data
-     * @argument {object} processGroupStatus            The process group status
+     * @argument {object} aggregateSnapshot            The process group status
      */
-    var populateProcessGroupStatus = function (processorItems, connectionItems, processGroupItems, inputPortItems, outputPortItems, remoteProcessGroupItems, processGroupStatus) {
+    var populateProcessGroupStatus = function (processorItems, connectionItems, processGroupItems, inputPortItems, outputPortItems, remoteProcessGroupItems, aggregateSnapshot) {
         // add the processors to the summary grid
-        $.each(processGroupStatus.processorStatus, function (i, procStatus) {
+        $.each(aggregateSnapshot.processorStatusSnapshots, function (i, procStatus) {
             processorItems.push(procStatus);
         });
 
         // add the processors to the summary grid
-        $.each(processGroupStatus.connectionStatus, function (i, connStatus) {
+        $.each(aggregateSnapshot.connectionStatusSnapshots, function (i, connStatus) {
             connectionItems.push(connStatus);
         });
 
         // add the input ports to the summary grid
-        $.each(processGroupStatus.inputPortStatus, function (i, portStatus) {
+        $.each(aggregateSnapshot.inputPortStatusSnapshots, function (i, portStatus) {
             inputPortItems.push(portStatus);
         });
 
         // add the input ports to the summary grid
-        $.each(processGroupStatus.outputPortStatus, function (i, portStatus) {
+        $.each(aggregateSnapshot.outputPortStatusSnapshots, function (i, portStatus) {
             outputPortItems.push(portStatus);
         });
 
         // add the input ports to the summary grid
-        $.each(processGroupStatus.remoteProcessGroupStatus, function (i, rpgStatus) {
+        $.each(aggregateSnapshot.remoteProcessGroupStatusSnapshots, function (i, rpgStatus) {
             remoteProcessGroupItems.push(rpgStatus);
         });
         
         // add the process group status as well
-        processGroupItems.push(processGroupStatus);
+        processGroupItems.push(aggregateSnapshot);
 
         // add any child group's status
-        $.each(processGroupStatus.processGroupStatus, function (i, childProcessGroup) {
+        $.each(aggregateSnapshot.processGroupStatusSnapshots, function (i, childProcessGroup) {
             populateProcessGroupStatus(processorItems, connectionItems, processGroupItems, inputPortItems, outputPortItems, remoteProcessGroupItems, childProcessGroup);
         });
     };
@@ -2169,21 +2153,22 @@ nf.SummaryTable = (function () {
 
     /**
      * Loads  the cluster processor details dialog for the specified processor.
-     * 
-     * @argument {string} rowId     The row id
+     *
+     * @argument {string} groupId         The group id
+     * @argument {string} processorId     The processor id
      */
-    var loadClusterProcessorSummary = function (rowId) {
+    var loadClusterProcessorSummary = function (groupId, processorId) {
         // get the summary
         $.ajax({
             type: 'GET',
-            url: config.urls.clusterProcessor + encodeURIComponent(rowId) + '/status',
+            url: config.urls.processGroups + encodeURIComponent(groupId) + '/processors/' + encodeURIComponent(processorId) + '/status',
             data: {
-                verbose: true
+                nodewise: true
             },
             dataType: 'json'
         }).done(function (response) {
-            if (nf.Common.isDefinedAndNotNull(response.clusterProcessorStatus)) {
-                var clusterProcessorStatus = response.clusterProcessorStatus;
+            if (nf.Common.isDefinedAndNotNull(response.processorStatus)) {
+                var processorStatus = response.processorStatus;
 
                 var clusterProcessorsGrid = $('#cluster-processor-summary-table').data('gridInstance');
                 var clusterProcessorsData = clusterProcessorsGrid.getData();
@@ -2191,18 +2176,19 @@ nf.SummaryTable = (function () {
                 var clusterProcessors = [];
 
                 // populate the table
-                $.each(clusterProcessorStatus.nodeProcessorStatus, function (i, nodeProcessorStatus) {
+                $.each(processorStatus.nodeSnapshots, function (i, nodeSnapshot) {
+                    var snapshot = nodeSnapshot.statusSnapshot;
                     clusterProcessors.push({
-                        id: nodeProcessorStatus.node.nodeId,
-                        node: nodeProcessorStatus.node.address + ':' + nodeProcessorStatus.node.apiPort,
-                        runStatus: nodeProcessorStatus.processorStatus.runStatus,
-                        activeThreadCount: nodeProcessorStatus.processorStatus.activeThreadCount,
-                        input: nodeProcessorStatus.processorStatus.input,
-                        read: nodeProcessorStatus.processorStatus.read,
-                        written: nodeProcessorStatus.processorStatus.written,
-                        output: nodeProcessorStatus.processorStatus.output,
-                        tasks: nodeProcessorStatus.processorStatus.tasks,
-                        tasksDuration: nodeProcessorStatus.processorStatus.tasksDuration
+                        id: nodeSnapshot.nodeId,
+                        node: nodeSnapshot.address + ':' + nodeSnapshot.apiPort,
+                        runStatus: snapshot.runStatus,
+                        activeThreadCount: snapshot.activeThreadCount,
+                        input: snapshot.input,
+                        read: snapshot.read,
+                        written: snapshot.written,
+                        output: snapshot.output,
+                        tasks: snapshot.tasks,
+                        tasksDuration: snapshot.tasksDuration
                     });
                 });
 
@@ -2212,32 +2198,34 @@ nf.SummaryTable = (function () {
                 clusterProcessorsGrid.invalidate();
 
                 // populate the processor details
-                $('#cluster-processor-name').text(clusterProcessorStatus.processorName).ellipsis();
-                $('#cluster-processor-id').text(clusterProcessorStatus.processorId);
+                $('#cluster-processor-name').text(processorStatus.name).ellipsis();
+                $('#cluster-processor-id').text(processorStatus.id);
+                $('#cluster-processor-group-id').text(processorStatus.groupId);
 
                 // update the stats last refreshed timestamp
-                $('#cluster-processor-summary-last-refreshed').text(clusterProcessorStatus.statsLastRefreshed);
+                $('#cluster-processor-summary-last-refreshed').text(processorStatus.statsLastRefreshed);
             }
         }).fail(nf.Common.handleAjaxError);
     };
 
     /**
      * Loads the cluster connection details dialog for the specified processor.
-     * 
-     * @argument {string} rowId     The row id
+     *
+     * @argument {string} groupId   The group id
+     * @argument {string} connectionId     The connection id
      */
-    var loadClusterConnectionSummary = function (rowId) {
+    var loadClusterConnectionSummary = function (groupId, connectionId) {
         // get the summary
         $.ajax({
             type: 'GET',
-            url: config.urls.clusterConnection + encodeURIComponent(rowId) + '/status',
+            url: config.urls.processGroups + encodeURIComponent(groupId) + '/connections/' + encodeURIComponent(connectionId) + '/status',
             data: {
-                verbose: true
+                nodewise: true
             },
             dataType: 'json'
         }).done(function (response) {
-            if (nf.Common.isDefinedAndNotNull(response.clusterConnectionStatus)) {
-                var clusterConnectionStatus = response.clusterConnectionStatus;
+            if (nf.Common.isDefinedAndNotNull(response.connectionStatus)) {
+                var connectionStatus = response.connectionStatus;
 
                 var clusterConnectionsGrid = $('#cluster-connection-summary-table').data('gridInstance');
                 var clusterConnectionsData = clusterConnectionsGrid.getData();
@@ -2245,15 +2233,16 @@ nf.SummaryTable = (function () {
                 var clusterConnections = [];
 
                 // populate the table
-                $.each(clusterConnectionStatus.nodeConnectionStatus, function (i, nodeConnectionStatus) {
+                $.each(connectionStatus.nodeSnapshots, function (i, nodeSnapshot) {
+                    var snapshot = nodeSnapshot.statusSnapshot;
                     clusterConnections.push({
-                        id: nodeConnectionStatus.node.nodeId,
-                        node: nodeConnectionStatus.node.address + ':' + nodeConnectionStatus.node.apiPort,
-                        input: nodeConnectionStatus.connectionStatus.input,
-                        queued: nodeConnectionStatus.connectionStatus.queued,
-                        queuedCount: nodeConnectionStatus.connectionStatus.queuedCount,
-                        queuedSize: nodeConnectionStatus.connectionStatus.queuedSize,
-                        output: nodeConnectionStatus.connectionStatus.output
+                        id: nodeSnapshot.nodeId,
+                        node: nodeSnapshot.address + ':' + nodeSnapshot.apiPort,
+                        input: snapshot.input,
+                        queued: snapshot.queued,
+                        queuedCount: snapshot.queuedCount,
+                        queuedSize: snapshot.queuedSize,
+                        output: snapshot.output
                     });
                 });
 
@@ -2263,11 +2252,12 @@ nf.SummaryTable = (function () {
                 clusterConnectionsGrid.invalidate();
 
                 // populate the processor details
-                $('#cluster-connection-name').text(clusterConnectionStatus.connectionName).ellipsis();
-                $('#cluster-connection-id').text(clusterConnectionStatus.connectionId);
+                $('#cluster-connection-name').text(connectionStatus.name).ellipsis();
+                $('#cluster-connection-id').text(connectionStatus.id);
+                $('#cluster-connection-group-id').text(connectionStatus.groupId);
 
                 // update the stats last refreshed timestamp
-                $('#cluster-connection-summary-last-refreshed').text(clusterConnectionStatus.statsLastRefreshed);
+                $('#cluster-connection-summary-last-refreshed').text(connectionStatus.statsLastRefreshed);
             }
         }).fail(nf.Common.handleAjaxError);
     };
@@ -2275,20 +2265,21 @@ nf.SummaryTable = (function () {
     /**
      * Loads the cluster input port details dialog for the specified processor.
      * 
-     * @argument {string} rowId     The row id
+     * @argument {string} processGroupId     The process group id
      */
-    var loadClusterProcessGroupSummary = function (rowId) {
+    var loadClusterProcessGroupSummary = function (processGroupId) {
         // get the summary
         $.ajax({
             type: 'GET',
-            url: config.urls.clusterProcessGroup + encodeURIComponent(rowId) + '/status',
+            url: config.urls.processGroups + encodeURIComponent(processGroupId) + '/status',
             data: {
-                verbose: true
+                nodewise: true,
+                recursive: false
             },
             dataType: 'json'
         }).done(function (response) {
-            if (nf.Common.isDefinedAndNotNull(response.clusterProcessGroupStatus)) {
-                var clusterProcessGroupStatus = response.clusterProcessGroupStatus;
+            if (nf.Common.isDefinedAndNotNull(response.processGroupStatus)) {
+                var processGroupStatus = response.processGroupStatus;
 
                 var clusterProcessGroupsGrid = $('#cluster-process-group-summary-table').data('gridInstance');
                 var clusterProcessGroupsData = clusterProcessGroupsGrid.getData();
@@ -2296,21 +2287,22 @@ nf.SummaryTable = (function () {
                 var clusterProcessGroups = [];
 
                 // populate the table
-                $.each(clusterProcessGroupStatus.nodeProcessGroupStatus, function (i, nodeProcessGroupStatus) {
+                $.each(processGroupStatus.nodeSnapshots, function (i, nodeSnapshot) {
+                    var snapshot = nodeSnapshot.statusSnapshot;
                     clusterProcessGroups.push({
-                        id: nodeProcessGroupStatus.node.nodeId,
-                        node: nodeProcessGroupStatus.node.address + ':' + nodeProcessGroupStatus.node.apiPort,
-                        activeThreadCount: nodeProcessGroupStatus.processGroupStatus.activeThreadCount,
-                        transferred: nodeProcessGroupStatus.processGroupStatus.transferred,
-                        input: nodeProcessGroupStatus.processGroupStatus.input,
-                        queued: nodeProcessGroupStatus.processGroupStatus.queued,
-                        queuedCount: nodeProcessGroupStatus.processGroupStatus.queuedCount,
-                        queuedSize: nodeProcessGroupStatus.processGroupStatus.queuedSize,
-                        output: nodeProcessGroupStatus.processGroupStatus.output,
-                        read: nodeProcessGroupStatus.processGroupStatus.read,
-                        written: nodeProcessGroupStatus.processGroupStatus.written,
-                        sent: nodeProcessGroupStatus.processGroupStatus.sent,
-                        received: nodeProcessGroupStatus.processGroupStatus.received
+                        id: nodeSnapshot.nodeId,
+                        node: nodeSnapshot.address + ':' + nodeSnapshot.apiPort,
+                        activeThreadCount: snapshot.activeThreadCount,
+                        transferred: snapshot.transferred,
+                        input: snapshot.input,
+                        queued: snapshot.queued,
+                        queuedCount: snapshot.queuedCount,
+                        queuedSize: snapshot.queuedSize,
+                        output: snapshot.output,
+                        read: snapshot.read,
+                        written: snapshot.written,
+                        sent: snapshot.sent,
+                        received: snapshot.received
                     });
                 });
 
@@ -2320,32 +2312,33 @@ nf.SummaryTable = (function () {
                 clusterProcessGroupsGrid.invalidate();
 
                 // populate the input port details
-                $('#cluster-process-group-name').text(clusterProcessGroupStatus.processGroupName).ellipsis();
-                $('#cluster-process-group-id').text(clusterProcessGroupStatus.processGroupId);
+                $('#cluster-process-group-name').text(processGroupStatus.name).ellipsis();
+                $('#cluster-process-group-id').text(processGroupStatus.id);
 
                 // update the stats last refreshed timestamp
-                $('#cluster-process-group-summary-last-refreshed').text(clusterProcessGroupStatus.statsLastRefreshed);
+                $('#cluster-process-group-summary-last-refreshed').text(processGroupStatus.statsLastRefreshed);
             }
         }).fail(nf.Common.handleAjaxError);
     };
 
     /**
      * Loads the cluster input port details dialog for the specified processor.
-     * 
-     * @argument {string} rowId     The row id
+     *
+     * @argument {string} groupId         The group id
+     * @argument {string} inputPortId     The input port id
      */
-    var loadClusterInputPortSummary = function (rowId) {
+    var loadClusterInputPortSummary = function (groupId, inputPortId) {
         // get the summary
         $.ajax({
             type: 'GET',
-            url: config.urls.clusterInputPort + encodeURIComponent(rowId) + '/status',
+            url: config.urls.processGroups + encodeURIComponent(groupId) + '/input-ports/' + encodeURIComponent(inputPortId) + '/status',
             data: {
-                verbose: true
+                nodewise: true
             },
             dataType: 'json'
         }).done(function (response) {
-            if (nf.Common.isDefinedAndNotNull(response.clusterPortStatus)) {
-                var clusterInputPortStatus = response.clusterPortStatus;
+            if (nf.Common.isDefinedAndNotNull(response.portStatus)) {
+                var inputPortStatus = response.portStatus;
 
                 var clusterInputPortsGrid = $('#cluster-input-port-summary-table').data('gridInstance');
                 var clusterInputPortsData = clusterInputPortsGrid.getData();
@@ -2353,13 +2346,14 @@ nf.SummaryTable = (function () {
                 var clusterInputPorts = [];
 
                 // populate the table
-                $.each(clusterInputPortStatus.nodePortStatus, function (i, nodeInputPortStatus) {
+                $.each(inputPortStatus.nodeSnapshots, function (i, nodeSnapshot) {
+                    var snapshot = nodeSnapshot.statusSnapshot;
                     clusterInputPorts.push({
-                        id: nodeInputPortStatus.node.nodeId,
-                        node: nodeInputPortStatus.node.address + ':' + nodeInputPortStatus.node.apiPort,
-                        runStatus: nodeInputPortStatus.portStatus.runStatus,
-                        activeThreadCount: nodeInputPortStatus.portStatus.activeThreadCount,
-                        output: nodeInputPortStatus.portStatus.output
+                        id: nodeSnapshot.nodeId,
+                        node: nodeSnapshot.address + ':' + nodeSnapshot.apiPort,
+                        runStatus: snapshot.runStatus,
+                        activeThreadCount: snapshot.activeThreadCount,
+                        output: snapshot.output
                     });
                 });
 
@@ -2369,32 +2363,34 @@ nf.SummaryTable = (function () {
                 clusterInputPortsGrid.invalidate();
 
                 // populate the input port details
-                $('#cluster-input-port-name').text(clusterInputPortStatus.portName).ellipsis();
-                $('#cluster-input-port-id').text(clusterInputPortStatus.portId);
+                $('#cluster-input-port-name').text(inputPortStatus.name).ellipsis();
+                $('#cluster-input-port-id').text(inputPortStatus.id);
+                $('#cluster-input-port-group-id').text(inputPortStatus.groupId);
 
                 // update the stats last refreshed timestamp
-                $('#cluster-input-port-summary-last-refreshed').text(clusterInputPortStatus.statsLastRefreshed);
+                $('#cluster-input-port-summary-last-refreshed').text(inputPortStatus.statsLastRefreshed);
             }
         }).fail(nf.Common.handleAjaxError);
     };
 
     /**
      * Loads the cluster output port details dialog for the specified processor.
-     * 
-     * @argument {string} rowId     The row id
+     *
+     * @argument {string} groupId          The group id
+     * @argument {string} outputPortId     The row id
      */
-    var loadClusterOutputPortSummary = function (rowId) {
+    var loadClusterOutputPortSummary = function (groupId, outputPortId) {
         // get the summary
         $.ajax({
             type: 'GET',
-            url: config.urls.clusterOutputPort + encodeURIComponent(rowId) + '/status',
+            url: config.urls.processGroups + encodeURIComponent(groupId) + '/output-ports/' + encodeURIComponent(outputPortId) + '/status',
             data: {
-                verbose: true
+                nodewise: true
             },
             dataType: 'json'
         }).done(function (response) {
-            if (nf.Common.isDefinedAndNotNull(response.clusterPortStatus)) {
-                var clusterOutputPortStatus = response.clusterPortStatus;
+            if (nf.Common.isDefinedAndNotNull(response.portStatus)) {
+                var outputPortStatus = response.portStatus;
 
                 var clusterOutputPortsGrid = $('#cluster-output-port-summary-table').data('gridInstance');
                 var clusterOutputPortsData = clusterOutputPortsGrid.getData();
@@ -2402,13 +2398,14 @@ nf.SummaryTable = (function () {
                 var clusterOutputPorts = [];
 
                 // populate the table
-                $.each(clusterOutputPortStatus.nodePortStatus, function (i, nodeOutputPortStatus) {
+                $.each(outputPortStatus.nodeSnapshots, function (i, nodeSnapshot) {
+                    var snapshot = nodeSnapshot.statusSnapshot;
                     clusterOutputPorts.push({
-                        id: nodeOutputPortStatus.node.nodeId,
-                        node: nodeOutputPortStatus.node.address + ':' + nodeOutputPortStatus.node.apiPort,
-                        runStatus: nodeOutputPortStatus.portStatus.runStatus,
-                        activeThreadCount: nodeOutputPortStatus.portStatus.activeThreadCount,
-                        input: nodeOutputPortStatus.portStatus.input
+                        id: nodeSnapshot.nodeId,
+                        node: nodeSnapshot.address + ':' + nodeSnapshot.apiPort,
+                        runStatus: snapshot.runStatus,
+                        activeThreadCount: snapshot.activeThreadCount,
+                        input: snapshot.input
                     });
                 });
 
@@ -2418,32 +2415,34 @@ nf.SummaryTable = (function () {
                 clusterOutputPortsGrid.invalidate();
 
                 // populate the output port details
-                $('#cluster-output-port-name').text(clusterOutputPortStatus.portName).ellipsis();
-                $('#cluster-output-port-id').text(clusterOutputPortStatus.portId);
+                $('#cluster-output-port-name').text(outputPortStatus.name).ellipsis();
+                $('#cluster-output-port-id').text(outputPortStatus.id);
+                $('#cluster-output-port-group-id').text(outputPortStatus.groupId);
 
                 // update the stats last refreshed timestamp
-                $('#cluster-output-port-summary-last-refreshed').text(clusterOutputPortStatus.statsLastRefreshed);
+                $('#cluster-output-port-summary-last-refreshed').text(outputPortStatus.statsLastRefreshed);
             }
         }).fail(nf.Common.handleAjaxError);
     };
 
     /**
      * Loads the cluster remote process group details dialog for the specified processor.
-     * 
-     * @argument {string} rowId     The row id
+     *
+     * @argument {string} groupId   The group id
+     * @argument {string} remoteProcessGroupId     The remote process group id
      */
-    var loadClusterRemoteProcessGroupSummary = function (rowId) {
+    var loadClusterRemoteProcessGroupSummary = function (groupId, remoteProcessGroupId) {
         // get the summary
         $.ajax({
             type: 'GET',
-            url: config.urls.clusterRemoteProcessGroup + encodeURIComponent(rowId) + '/status',
+            url: config.urls.processGroups + encodeURIComponent(groupId) + '/remote-process-groups/' + encodeURIComponent(remoteProcessGroupId) + '/status',
             data: {
-                verbose: true
+                nodewise: true
             },
             dataType: 'json'
         }).done(function (response) {
-            if (nf.Common.isDefinedAndNotNull(response.clusterRemoteProcessGroupStatus)) {
-                var clusterRemoteProcessGroupStatus = response.clusterRemoteProcessGroupStatus;
+            if (nf.Common.isDefinedAndNotNull(response.remoteProcessGroupStatus)) {
+                var remoteProcessGroupStatus = response.remoteProcessGroupStatus;
 
                 var clusterRemoteProcessGroupsGrid = $('#cluster-remote-process-group-summary-table').data('gridInstance');
                 var clusterRemoteProcessGroupsData = clusterRemoteProcessGroupsGrid.getData();
@@ -2451,16 +2450,17 @@ nf.SummaryTable = (function () {
                 var clusterRemoteProcessGroups = [];
 
                 // populate the table
-                $.each(clusterRemoteProcessGroupStatus.nodeRemoteProcessGroupStatus, function (i, nodeRemoteProcessGroupStatus) {
+                $.each(remoteProcessGroupStatus.nodeSnapshots, function (i, nodeSnapshot) {
+                    var snapshot = nodeSnapshot.statusSnapshot;
                     clusterRemoteProcessGroups.push({
-                        id: nodeRemoteProcessGroupStatus.node.nodeId,
-                        node: nodeRemoteProcessGroupStatus.node.address + ':' + nodeRemoteProcessGroupStatus.node.apiPort,
-                        targetUri: nodeRemoteProcessGroupStatus.remoteProcessGroupStatus.targetUri,
-                        transmissionStatus: nodeRemoteProcessGroupStatus.remoteProcessGroupStatus.transmissionStatus,
-                        sent: nodeRemoteProcessGroupStatus.remoteProcessGroupStatus.sent,
-                        received: nodeRemoteProcessGroupStatus.remoteProcessGroupStatus.received,
-                        activeThreadCount: nodeRemoteProcessGroupStatus.remoteProcessGroupStatus.activeThreadCount,
-                        authorizationIssues: nodeRemoteProcessGroupStatus.remoteProcessGroupStatus.authorizationIssues
+                        id: nodeSnapshot.nodeId,
+                        node: nodeSnapshot.address + ':' + nodeSnapshot.apiPort,
+                        targetUri: snapshot.targetUri,
+                        transmissionStatus: snapshot.transmissionStatus,
+                        sent: snapshot.sent,
+                        received: snapshot.received,
+                        activeThreadCount: snapshot.activeThreadCount,
+                        authorizationIssues: snapshot.authorizationIssues
                     });
                 });
 
@@ -2470,37 +2470,26 @@ nf.SummaryTable = (function () {
                 clusterRemoteProcessGroupsGrid.invalidate();
 
                 // populate the remote process group details
-                $('#cluster-remote-process-group-name').text(clusterRemoteProcessGroupStatus.remoteProcessGroupName).ellipsis();
-                $('#cluster-remote-process-group-id').text(clusterRemoteProcessGroupStatus.remoteProcessGroupId);
+                $('#cluster-remote-process-group-name').text(remoteProcessGroupStatus.name).ellipsis();
+                $('#cluster-remote-process-group-id').text(remoteProcessGroupStatus.id);
+                $('#cluster-remote-process-group-group-id').text(remoteProcessGroupStatus.groupId);
 
                 // update the stats last refreshed timestamp
-                $('#cluster-remote-process-group-summary-last-refreshed').text(clusterRemoteProcessGroupStatus.statsLastRefreshed);
+                $('#cluster-remote-process-group-summary-last-refreshed').text(remoteProcessGroupStatus.statsLastRefreshed);
             }
         }).fail(nf.Common.handleAjaxError);
     };
 
+    var clusterNodeId = null;
+
     return {
         
         /**
-         * URL for loading system diagnostics.
-         */
-        systemDiagnosticsUrl: null,
-        
-        /**
-         * URL for loading the summary.
-         */
-        url: null,
-        
-        /**
          * Initializes the status table.
          * 
          * @argument {boolean} isClustered Whether or not this NiFi is clustered.
          */
         init: function (isClustered) {
-            // initialize the summary urls
-            nf.SummaryTable.url = config.urls.status;
-            nf.SummaryTable.systemDiagnosticsUrl = config.urls.systemDiagnostics;
-
             return $.Deferred(function (deferred) {
                 loadChartCapabilities().done(function () {
                     // initialize the processor/connection details dialog
@@ -2514,7 +2503,16 @@ nf.SummaryTable = (function () {
                 });
             }).promise();
         },
-        
+
+        /**
+         * Sets the cluster node id which will only show status from this node on subsequent reloads.
+         *
+         * @param nodeId
+         */
+        setClusterNodeId: function (nodeId) {
+            clusterNodeId = nodeId;
+        },
+
         /**
          * Update the size of the grid based on its container's current size.
          */
@@ -2551,20 +2549,34 @@ nf.SummaryTable = (function () {
         },
         
         /**
-         * Load the processor status table.
+         * Load the summary table.
          */
-        loadProcessorSummaryTable: function () {
+        loadSummaryTable: function () {
+            var statusUri = config.urls.status;
+
+            // add the parameter if appropriate
+            var parameters = {};
+            if (!nf.Common.isNull(clusterNodeId)) {
+                parameters['clusterNodeId'] = clusterNodeId;
+            }
+
+            // update the status uri if appropriate
+            if (!$.isEmptyObject(parameters)) {
+                statusUri += '?' + $.param(parameters);
+            }
+
             return $.ajax({
                 type: 'GET',
-                url: nf.SummaryTable.url,
+                url: statusUri,
                 data: {
                     recursive: true
                 },
                 dataType: 'json'
             }).done(function (response) {
                 var processGroupStatus = response.processGroupStatus;
+                var aggregateSnapshot = processGroupStatus.aggregateSnapshot;
 
-                if (nf.Common.isDefinedAndNotNull(processGroupStatus)) {
+                if (nf.Common.isDefinedAndNotNull(aggregateSnapshot)) {
                     // remove any tooltips from the processor table
                     var processorsGridElement = $('#processor-summary-table');
                     nf.Common.cleanUpTooltips(processorsGridElement, 'img.has-bulletins');
@@ -2617,7 +2629,7 @@ nf.SummaryTable = (function () {
                     var remoteProcessGroupItems = [];
 
                     // populate the tables
-                    populateProcessGroupStatus(processorItems, connectionItems, processGroupItems, inputPortItems, outputPortItems, remoteProcessGroupItems, processGroupStatus);
+                    populateProcessGroupStatus(processorItems, connectionItems, processGroupItems, inputPortItems, outputPortItems, remoteProcessGroupItems, aggregateSnapshot);
 
                     // update the processors
                     processorsData.setItems(processorItems);

http://git-wip-us.apache.org/repos/asf/nifi/blob/0d3bd2c4/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/summary/nf-summary.js
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/summary/nf-summary.js b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/summary/nf-summary.js
index 4f06662..c16a670 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/summary/nf-summary.js
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/summary/nf-summary.js
@@ -70,7 +70,7 @@ nf.Summary = (function () {
     var initializeSummaryPage = function () {
         // define mouse over event for the refresh buttons
         nf.Common.addHoverEffect('#refresh-button', 'button-refresh', 'button-refresh-hover').click(function () {
-            nf.SummaryTable.loadProcessorSummaryTable();
+            nf.SummaryTable.loadSummaryTable();
         });
 
         // return a deferred for page initialization
@@ -133,7 +133,7 @@ nf.Summary = (function () {
             // intialize the summary table
             initializeSummaryTable().done(function () {
                 // load the table
-                nf.SummaryTable.loadProcessorSummaryTable().done(function () {
+                nf.SummaryTable.loadSummaryTable().done(function () {
                     // once the table is initialized, finish initializing the page
                     initializeSummaryPage().done(function () {
                         // configure the initial grid height