< prev index next >

application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/pages/SocketIOPage.java

Print this page

        

@@ -67,10 +67,11 @@
 import org.openjdk.jmc.common.item.IItemCollection;
 import org.openjdk.jmc.common.item.IItemFilter;
 import org.openjdk.jmc.common.item.ItemFilters;
 import org.openjdk.jmc.common.unit.IQuantity;
 import org.openjdk.jmc.common.unit.IRange;
+import org.openjdk.jmc.common.unit.QuantitiesToolkit;
 import org.openjdk.jmc.common.unit.UnitLookup;
 import org.openjdk.jmc.common.util.ColorToolkit;
 import org.openjdk.jmc.common.util.StateToolkit;
 import org.openjdk.jmc.flightrecorder.JfrAttributes;
 import org.openjdk.jmc.flightrecorder.jdk.JdkAggregators;

@@ -199,10 +200,11 @@
                 private static final String SECONDARY_SOCKETIO_TABLE_ELEMENT = "secondarySocketTable"; //$NON-NLS-1$
                 private static final String HISTGRAM_TYPE = "histogramType"; //$NON-NLS-1$
 
                 private final ChartCanvas timelineCanvas;
                 private final ChartCanvas durationCanvas;
+                private final ChartCanvas sizeCanvas;
                 private final ItemList itemList;
 
                 private final SashForm sash;
                 private final IPageContainer pageContainer;
                 private final Composite histogramParent;

@@ -216,10 +218,11 @@
                 private FilterComponent eventFilter;
                 private IRange<IQuantity> timeRange;
                 private IItemCollection selectionItems;
                 private XYChart timelineChart;
                 private XYChart durationChart;
+                private XYChart sizeChart;
                 private CTabFolder tabFolder;
                 private FlavorSelector flavorSelector;
 
                 IOPageUi(Composite parent, FormToolkit toolkit, IPageContainer pageContainer, IState state) {
                         this.pageContainer = pageContainer;

@@ -262,27 +265,46 @@
                         DataPageToolkit.setChart(durationCanvas, durationChart, JfrAttributes.DURATION,
                                         pageContainer::showSelection);
                         SelectionStoreActionToolkit.addSelectionStoreActions(pageContainer.getSelectionStore(), durationChart,
                                         JfrAttributes.DURATION, Messages.SocketIOPage_DURATION_SELECTION, durationCanvas.getContextMenu());
 
+                        IQuantity sizeMax = QuantitiesToolkit.maxPresent(socketItems.getAggregate(JdkAggregators.SOCKET_READ_LARGEST),
+                                        socketItems.getAggregate(JdkAggregators.SOCKET_WRITE_LARGEST));
+                        // FIXME: Workaround to make max value included
+                        sizeMax = sizeMax == null ? UnitLookup.BYTE.quantity(64): sizeMax.add(UnitLookup.BYTE.quantity(64));
+                        sizeChart = new XYChart(UnitLookup.BYTE.quantity(0), sizeMax, RendererToolkit.empty(), 180);
+                        sizeChart.setVisibleRange(sizeRange.getStart(), sizeMax);
+                        sizeChart.addVisibleRangeListener(range -> sizeRange = range);
+
                         CTabItem t3 = new CTabItem(tabFolder, SWT.NONE);
-                        t3.setToolTipText(Messages.IO_PAGE_EVENT_LOG_DESCRIPTION);
+                        t3.setToolTipText(Messages.IO_PAGE_SIZE_DESCRIPTION);
+                        sizeCanvas = new ChartCanvas(tabFolder);
+                        t3.setText(Messages.PAGES_SIZE);
+                        t3.setControl(sizeCanvas);
+                        DataPageToolkit.createChartTooltip(sizeCanvas);
+                        DataPageToolkit.setChart(sizeCanvas, sizeChart, JdkAttributes.IO_SIZE,
+                                        pageContainer::showSelection);
+                        SelectionStoreActionToolkit.addSelectionStoreActions(pageContainer.getSelectionStore(), sizeChart,
+                                        JdkAttributes.IO_SIZE, Messages.SocketIOPage_SIZE_SELECTION, sizeCanvas.getContextMenu());
+
+                        CTabItem t4 = new CTabItem(tabFolder, SWT.NONE);
+                        t4.setToolTipText(Messages.IO_PAGE_EVENT_LOG_DESCRIPTION);
                         itemList = LIST.buildWithoutBorder(tabFolder, getTableSettings(state.getChild(LIST_ELEMENT)));
                         MCContextMenuManager itemListMm = MCContextMenuManager
                                         .create(itemList.getManager().getViewer().getControl());
                         ColumnMenusFactory.addDefaultMenus(itemList.getManager(), itemListMm);
                         SelectionStoreActionToolkit.addSelectionStoreActions(pageContainer.getSelectionStore(), itemList,
                                         Messages.SocketIOPage_LOG_SELECTION, itemListMm);
                         itemList.getManager().getViewer().addSelectionChangedListener(
                                         e -> pageContainer.showSelection(ItemCollectionToolkit.build(itemList.getSelection().get())));
-                        t3.setText(Messages.PAGES_EVENT_LOG);
+                        t4.setText(Messages.PAGES_EVENT_LOG);
                         eventFilter = FilterComponent.createFilterComponent(itemList, itemListFilter,
                                         getDataSource().getItems().apply(TABLE_ITEMS), pageContainer.getSelectionStore()::getSelections,
                                         this::onEventFilterChange);
                         itemListMm.add(eventFilter.getShowFilterAction());
                         itemListMm.add(eventFilter.getShowSearchAction());
-                        t3.setControl(eventFilter.getComponent());
+                        t4.setControl(eventFilter.getComponent());
                         eventFilter.loadState(state.getChild(EVENT_FILTER));
                         onEventFilterChange(itemListFilter);
                         itemList.getManager().setSelectionState(itemListSelection);
 
                         tabFolder.setSelection(tabFolderIndex);

@@ -457,33 +479,41 @@
                 private void updateChartAndListDetails(IItemCollection selectedItems) {
                         String hostCount = hostPortCount();
 
                         List<IXDataRenderer> timelineRows = new ArrayList<>();
                         List<IXDataRenderer> durationRows = new ArrayList<>();
+                        List<IXDataRenderer> sizeRows = new ArrayList<>();
                         IItemCollection readItems = selectedItems.apply(JdkFilters.SOCKET_READ);
                         if (readItems.hasItems()) {
                                 timelineRows.add(DataPageToolkit.buildSizeRow(Messages.SocketIOPage_ROW_SOCKET_READ + hostCount,
                                                 JdkAggregators.SOCKET_READ_SIZE.getDescription(), readItems, JdkAggregators.SOCKET_READ_SIZE,
                                                 READ_COLOR, SocketIOPage::getColor));
                                 durationRows
                                                 .add(DataPageToolkit.buildDurationHistogram(Messages.SocketIOPage_ROW_SOCKET_READ + hostCount,
                                                                 JdkAggregators.SOCKET_READ_COUNT.getDescription(), readItems,
                                                                 JdkAggregators.SOCKET_READ_COUNT, READ_COLOR));
+                                sizeRows.add(DataPageToolkit.buildSizeHistogram(Messages.SocketIOPage_ROW_SOCKET_READ + hostCount,
+                                                JdkAggregators.SOCKET_READ_COUNT.getDescription(), readItems,
+                                                JdkAggregators.SOCKET_READ_COUNT, READ_COLOR, JdkAttributes.IO_SOCKET_BYTES_READ));
                         }
                         IItemCollection writeItems = selectedItems.apply(JdkFilters.SOCKET_WRITE);
                         if (writeItems.hasItems()) {
                                 timelineRows.add(DataPageToolkit.buildSizeRow(Messages.SocketIOPage_ROW_SOCKET_WRITE + hostCount,
                                                 JdkAggregators.SOCKET_WRITE_SIZE.getDescription(), writeItems, JdkAggregators.SOCKET_WRITE_SIZE,
                                                 WRITE_COLOR, SocketIOPage::getColor));
                                 durationRows
                                                 .add(DataPageToolkit.buildDurationHistogram(Messages.SocketIOPage_ROW_SOCKET_WRITE + hostCount,
                                                                 JdkAggregators.SOCKET_WRITE_COUNT.getDescription(), writeItems,
                                                                 JdkAggregators.SOCKET_WRITE_COUNT, WRITE_COLOR));
+                                sizeRows.add(DataPageToolkit.buildSizeHistogram(Messages.SocketIOPage_ROW_SOCKET_WRITE + hostCount,
+                                                JdkAggregators.SOCKET_WRITE_COUNT.getDescription(), writeItems,
+                                                JdkAggregators.SOCKET_WRITE_COUNT, WRITE_COLOR, JdkAttributes.IO_SOCKET_BYTES_WRITTEN));
                         }
                         if (timelineCanvas != null) {
                                 timelineCanvas.replaceRenderer(RendererToolkit.uniformRows(timelineRows));
                                 durationCanvas.replaceRenderer(RendererToolkit.uniformRows(durationRows));
+                                sizeCanvas.replaceRenderer(RendererToolkit.uniformRows(sizeRows));
 
                                 itemList.show(selectedItems);
                                 pageContainer.showSelection(selectedItems);
                         }
                 }

@@ -566,10 +596,11 @@
         private Map<HistogramType, IItemFilter> primaryTableFilter;
         private Map<HistogramType, IItemFilter> secondaryTableFilter;
         private IItemFilter itemListFilter;
         private IRange<IQuantity> timelineRange;
         private IRange<IQuantity> durationRange;
+        private IRange<IQuantity> sizeRange;
         private int tabFolderIndex = 0;
         public FlavorSelectorState flavorSelectorState;
 
         public SocketIOPage(IPageDefinition dpd, StreamModel items, IPageContainer editor) {
                 super(dpd, items, editor);

@@ -577,10 +608,11 @@
                 secondaryTableSelection = new HashMap<>();
                 primaryTableFilter = new HashMap<>();
                 secondaryTableFilter = new HashMap<>();
                 timelineRange = editor.getRecordingRange();
                 durationRange = editor.getRecordingRange();
+                sizeRange = DataPageToolkit.buildSizeRange(items.getItems(), true);
         }
 
         @Override
         public IItemFilter getDefaultSelectionFilter() {
                 return TABLE_ITEMS;
< prev index next >