Mercurial > hg > release > thermostat-1.2
changeset 1603:4c152ea35b79
Make vm-gc tab query less data
PR2019
Reviewed-by: omajid
Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2014-December/012119.html
author | Jie Kang <jkang@redhat.com> |
---|---|
date | Mon, 08 Dec 2014 16:26:44 -0500 |
parents | 68dfab57afda |
children | 673e0738ffbd |
files | storage/core/src/main/java/com/redhat/thermostat/storage/model/IntervalTimeData.java vm-gc/client-core/src/main/java/com/redhat/thermostat/vm/gc/client/core/VmGcView.java vm-gc/client-core/src/main/java/com/redhat/thermostat/vm/gc/client/core/internal/VmGcController.java vm-gc/client-core/src/test/java/com/redhat/thermostat/vm/gc/client/core/internal/VmGcControllerTest.java vm-gc/client-swing/src/main/java/com/redhat/thermostat/vm/gc/client/swing/internal/VmGcPanel.java |
diffstat | 5 files changed, 125 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/storage/core/src/main/java/com/redhat/thermostat/storage/model/IntervalTimeData.java Mon Dec 08 14:19:36 2014 -0500 +++ b/storage/core/src/main/java/com/redhat/thermostat/storage/model/IntervalTimeData.java Mon Dec 08 16:26:44 2014 -0500 @@ -36,6 +36,8 @@ package com.redhat.thermostat.storage.model; +import java.util.Objects; + public class IntervalTimeData<T> { private long start; @@ -60,5 +62,23 @@ return data; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + IntervalTimeData that = (IntervalTimeData) o; + + if (end != that.end) return false; + if (start != that.start) return false; + if (!Objects.equals(data, that.data)) return false; + + return true; + } + + @Override + public int hashCode() { + return Objects.hash(start, end, data); + } }
--- a/vm-gc/client-core/src/main/java/com/redhat/thermostat/vm/gc/client/core/VmGcView.java Mon Dec 08 14:19:36 2014 -0500 +++ b/vm-gc/client-core/src/main/java/com/redhat/thermostat/vm/gc/client/core/VmGcView.java Mon Dec 08 16:26:44 2014 -0500 @@ -37,15 +37,26 @@ package com.redhat.thermostat.vm.gc.client.core; import java.util.List; +import java.util.concurrent.TimeUnit; +import com.redhat.thermostat.client.core.experimental.Duration; import com.redhat.thermostat.client.core.views.BasicView; import com.redhat.thermostat.client.core.views.UIComponent; +import com.redhat.thermostat.common.ActionListener; import com.redhat.thermostat.shared.locale.LocalizedString; import com.redhat.thermostat.storage.model.IntervalTimeData; import com.redhat.thermostat.vm.gc.common.GcCommonNameMapper.CollectorCommonName; public abstract class VmGcView extends BasicView implements UIComponent { + public enum UserAction { + USER_CHANGED_TIME_RANGE, + } + + public abstract void addUserActionListener(ActionListener<UserAction> listener); + + public abstract void removeUserActionListener(ActionListener<UserAction> listener); + public abstract void addChart(String tag, LocalizedString title, String valueUnit); public abstract void removeChart(String tag); @@ -55,5 +66,7 @@ public abstract void clearData(String tag); public abstract void setCommonCollectorName(CollectorCommonName commonName); + + public abstract Duration getUserDesiredDuration(); }
--- a/vm-gc/client-core/src/main/java/com/redhat/thermostat/vm/gc/client/core/internal/VmGcController.java Mon Dec 08 14:19:36 2014 -0500 +++ b/vm-gc/client-core/src/main/java/com/redhat/thermostat/vm/gc/client/core/internal/VmGcController.java Mon Dec 08 16:26:44 2014 -0500 @@ -38,6 +38,7 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -47,6 +48,7 @@ import java.util.concurrent.TimeUnit; import com.redhat.thermostat.client.core.controllers.InformationServiceController; +import com.redhat.thermostat.client.core.experimental.Duration; import com.redhat.thermostat.client.core.views.BasicView.Action; import com.redhat.thermostat.client.core.views.UIComponent; import com.redhat.thermostat.common.ActionEvent; @@ -88,7 +90,7 @@ private final Timer timer; - private long lastSeenTimeStamp = Long.MIN_VALUE; + private long lastSeenTimeStamp; public VmGcController(ApplicationService appSvc, VmMemoryStatDAO vmMemoryStatDao, VmGcStatDAO vmGcStatDao, VmRef ref, VmGcViewProvider provider) { this.ref = ref; @@ -114,6 +116,24 @@ } }); + view.addUserActionListener(new ActionListener<VmGcView.UserAction>() { + @Override + public void actionPerformed(ActionEvent<VmGcView.UserAction> actionEvent) { + switch (actionEvent.getActionId()) { + case USER_CHANGED_TIME_RANGE: + Duration userDuration = view.getUserDesiredDuration(); + lastSeenTimeStamp = System.currentTimeMillis() - userDuration.unit.toMillis(userDuration.value); + doUpdateCollectorData(); + break; + default: + throw new AssertionError("Unhandled action type"); + } + } + }); + + Duration userDuration = view.getUserDesiredDuration(); //Has default of 10 minutes + lastSeenTimeStamp = System.currentTimeMillis() - userDuration.unit.toMillis(userDuration.value); + timer.setAction(new Runnable() { @Override public void run() { @@ -145,7 +165,7 @@ collectorName, generationName); } - private void doUpdateCollectorData() { + private synchronized void doUpdateCollectorData() { CollectorCommonName commonName = getCommonName(); view.setCommonCollectorName(commonName); @@ -162,6 +182,7 @@ } if (lastValueSeen.containsKey(collector)) { if (stat.getTimeStamp() <= lastValueSeen.get(collector).getTimeStamp()) { + //FIXME: algorithm does not handle this condition at the moment System.out.println("new gc collector value is older than previous value"); } VmGcStat last = lastValueSeen.get(collector);
--- a/vm-gc/client-core/src/test/java/com/redhat/thermostat/vm/gc/client/core/internal/VmGcControllerTest.java Mon Dec 08 14:19:36 2014 -0500 +++ b/vm-gc/client-core/src/test/java/com/redhat/thermostat/vm/gc/client/core/internal/VmGcControllerTest.java Mon Dec 08 16:26:44 2014 -0500 @@ -36,6 +36,7 @@ package com.redhat.thermostat.vm.gc.client.core.internal; +import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Matchers.isA; import static org.mockito.Matchers.isNotNull; @@ -54,6 +55,7 @@ import org.junit.Test; import org.mockito.ArgumentCaptor; +import com.redhat.thermostat.client.core.experimental.Duration; import com.redhat.thermostat.common.ActionEvent; import com.redhat.thermostat.common.ActionListener; import com.redhat.thermostat.common.ApplicationService; @@ -106,7 +108,7 @@ // Setup DAO VmGcStatDAO vmGcStatDAO = mock(VmGcStatDAO.class); - when(vmGcStatDAO.getLatestVmGcStats(isA(VmRef.class), eq(Long.MIN_VALUE))).thenReturn(stats); + when(vmGcStatDAO.getLatestVmGcStats(isA(VmRef.class), isA(Long.class))).thenReturn(stats); VmMemoryStatDAO vmMemoryStatDAO = mock(VmMemoryStatDAO.class); when(vmMemoryStatDAO.getLatestMemoryStat(isA(VmRef.class))).thenReturn(memoryStat); // the following set should map to Concurrent Collector @@ -121,6 +123,8 @@ ArgumentCaptor<ActionListener> viewArgumentCaptor = ArgumentCaptor.forClass(ActionListener.class); doNothing().when(view).addActionListener(viewArgumentCaptor.capture()); + when(view.getUserDesiredDuration()).thenReturn(new Duration(1, TimeUnit.MINUTES)); + VmGcViewProvider viewProvider = mock(VmGcViewProvider.class); when(viewProvider.createView()).thenReturn(view);
--- a/vm-gc/client-swing/src/main/java/com/redhat/thermostat/vm/gc/client/swing/internal/VmGcPanel.java Mon Dec 08 14:19:36 2014 -0500 +++ b/vm-gc/client-swing/src/main/java/com/redhat/thermostat/vm/gc/client/swing/internal/VmGcPanel.java Mon Dec 08 16:26:44 2014 -0500 @@ -42,10 +42,13 @@ import java.awt.FlowLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; import javax.swing.BorderFactory; import javax.swing.JLabel; @@ -65,14 +68,17 @@ import org.jfree.data.RangeType; import org.jfree.data.xy.IntervalXYDataset; +import com.redhat.thermostat.client.core.experimental.Duration; import com.redhat.thermostat.client.swing.SwingComponent; import com.redhat.thermostat.client.swing.components.HeaderPanel; -import com.redhat.thermostat.client.swing.components.RecentTimeSeriesChartPanel; import com.redhat.thermostat.client.swing.components.SectionHeader; +import com.redhat.thermostat.client.swing.components.experimental.RecentTimeControlPanel; +import com.redhat.thermostat.client.swing.components.experimental.SingleValueChartPanel; import com.redhat.thermostat.client.swing.experimental.ComponentVisibilityNotifier; import com.redhat.thermostat.client.ui.RecentTimeSeriesChartController; import com.redhat.thermostat.client.ui.SampledDataset; import com.redhat.thermostat.common.ActionListener; +import com.redhat.thermostat.common.ActionNotifier; import com.redhat.thermostat.shared.locale.LocalizedString; import com.redhat.thermostat.shared.locale.Translate; import com.redhat.thermostat.storage.model.IntervalTimeData; @@ -88,6 +94,9 @@ private static final Color WHITE = new Color(255,255,255,0); private static final Color BLACK = new Color(0,0,0,0); private static final float TRANSPARENT = 0.0f; + + private static final int DEFAULT_VALUE = 10; + private static final TimeUnit DEFAULT_UNIT = TimeUnit.MINUTES; private HeaderPanel visiblePanel = new HeaderPanel(); private JPanel chartPanelContainer = new JPanel(); @@ -95,8 +104,12 @@ private JLabel gcAlgoLabelDescr; private JLabel commonNameLabel; + private ActionNotifier<UserAction> userActionNotifier = new ActionNotifier<>(this); + private final Map<String, SampledDataset> dataset = new HashMap<>(); + private final Map<String, List<IntervalTimeData<Double>>> addedData = new HashMap<>(); private final Map<String, JPanel> subPanels = new HashMap<>(); + private final Map<String, Duration> subPanelDurations = new HashMap<>(); private final GridBagConstraints gcPanelConstraints; @@ -115,6 +128,16 @@ } @Override + public void addUserActionListener(ActionListener<UserAction> listener) { + userActionNotifier.addActionListener(listener); + } + + @Override + public void removeUserActionListener(ActionListener<UserAction> listener) { + userActionNotifier.removeActionListener(listener); + } + + @Override public void addActionListener(ActionListener<Action> listener) { notifier.addActionListener(listener); } @@ -169,7 +192,7 @@ return commonPanel; } - private JPanel createCollectorDetailsPanel(IntervalXYDataset collectorData, LocalizedString title, String units) { + private JPanel createCollectorDetailsPanel(IntervalXYDataset collectorData, LocalizedString title, String units, final String tag) { JPanel detailsPanel = new JPanel(); detailsPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); detailsPanel.setLayout(new BorderLayout()); @@ -197,8 +220,10 @@ chart.getPlot().setBackgroundImageAlpha(TRANSPARENT); chart.getPlot().setOutlinePaint(BLACK); - final RecentTimeSeriesChartPanel chartPanel = new RecentTimeSeriesChartPanel(new RecentTimeSeriesChartController(chart)); - + Duration defaultDuration = new Duration(DEFAULT_VALUE, DEFAULT_UNIT); + final RecentTimeSeriesChartController chartController = new RecentTimeSeriesChartController(chart); + final SingleValueChartPanel chartPanel = new SingleValueChartPanel(chart, defaultDuration); + subPanelDurations.put(tag, defaultDuration); chart.addProgressListener(new ChartProgressListener() { @Override @@ -212,6 +237,16 @@ } }); + chartPanel.addPropertyChangeListener(RecentTimeControlPanel.PROPERTY_VISIBLE_TIME_RANGE, new PropertyChangeListener() { + @Override + public void propertyChange(PropertyChangeEvent evt) { + VmGcPanel.this.userActionNotifier.fireAction(UserAction.USER_CHANGED_TIME_RANGE); + Duration duration = (Duration) evt.getNewValue(); + subPanelDurations.put(tag, duration); + chartController.setTime(duration.value, duration.unit); + } + }); + detailsPanel.add(chartPanel, BorderLayout.CENTER); return detailsPanel; @@ -241,7 +276,8 @@ public void run() { SampledDataset newData = new SampledDataset(); dataset.put(tag, newData); - JPanel subPanel = createCollectorDetailsPanel(newData, title, units); + addedData.put(tag, new ArrayList<IntervalTimeData<Double>>()); + JPanel subPanel = createCollectorDetailsPanel(newData, title, units, tag); subPanels.put(tag, subPanel); chartPanelContainer.add(subPanel, gcPanelConstraints); gcPanelConstraints.gridy++; @@ -256,7 +292,9 @@ @Override public void run() { dataset.remove(tag); + addedData.remove(tag); JPanel subPanel = subPanels.remove(tag); + subPanelDurations.remove(tag); chartPanelContainer.remove(subPanel); gcPanelConstraints.gridy--; containerPanel.revalidate(); @@ -271,8 +309,12 @@ @Override public void run() { SampledDataset series = dataset.get(tag); + List<IntervalTimeData<Double>> data = addedData.get(tag); for (IntervalTimeData<Double> timeData: copy) { - series.add(timeData.getStartTimeInMillis(), timeData.getEndTimeInMillis(), timeData.getData()); + if (!data.contains(timeData)) { + data.add(timeData); + series.add(timeData.getStartTimeInMillis(), timeData.getEndTimeInMillis(), timeData.getData()); + } } series.fireSeriesChanged(); } @@ -304,5 +346,21 @@ }); } } + + @Override + public Duration getUserDesiredDuration() { + //Return the greatest duration of all controllers + long timestamp = 0l; + Duration maxDuration = new Duration(10, TimeUnit.MINUTES); //Default of 10 minutes if there are no controllers + + for (Duration duration: subPanelDurations.values()) { + long time = duration.unit.toMillis(duration.value); + if (time > timestamp) { + timestamp = time; + maxDuration = duration; + } + } + return maxDuration; + } }