package net.java.visualvm.modules.glassfish.dataview; import com.sun.appserv.management.monitor.ConnectionQueueMonitor; import com.sun.appserv.management.monitor.FileCacheMonitor; import com.sun.appserv.management.monitor.HTTPServiceMonitor; import com.sun.appserv.management.monitor.KeepAliveMonitor; import com.sun.appserv.management.monitor.statistics.KeepAliveStats; import com.sun.tools.visualvm.application.Application; import com.sun.tools.visualvm.charts.ChartFactory; import com.sun.tools.visualvm.charts.SimpleXYChartDescriptor; import com.sun.tools.visualvm.charts.SimpleXYChartSupport; import com.sun.tools.visualvm.core.scheduler.Quantum; import com.sun.tools.visualvm.core.scheduler.ScheduledTask; import com.sun.tools.visualvm.core.scheduler.Scheduler; import com.sun.tools.visualvm.core.scheduler.SchedulerTask; import com.sun.tools.visualvm.core.ui.DataSourceView; import com.sun.tools.visualvm.core.ui.components.DataViewComponent; import com.sun.tools.visualvm.uisupport.HTMLTextArea; import java.lang.reflect.UndeclaredThrowableException; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import org.openide.util.ImageUtilities; class HTTPServiceView extends DataSourceView { private static final String ICON_PATH = "net/java/visualvm/modules/glassfish/resources/logviewer_icon.png"; private static final Logger LOGGER = Logger.getLogger(HTTPServiceView.class.getName()); private DataViewComponent dvc; private HTTPServiceMonitor monitor; private ScheduledTask queueRefreshTask; private ScheduledTask cacheRefreshTask; private ScheduledTask kaRefreshTask; public HTTPServiceView(Application app, HTTPServiceMonitor monitor) { super(app, "HTTP Service", new ImageIcon(ImageUtilities.loadImage(ICON_PATH, true)).getImage(), POSITION_AT_THE_END, false); this.monitor = monitor; initComponents(); } @Override public DataViewComponent createComponent() { return dvc; } private SimpleXYChartSupport connectionQueueChart; private void configureConnectionQueueVisualizer() { final ConnectionQueueMonitor cqm = monitor.getConnectionQueueMonitor(); SimpleXYChartDescriptor desc = SimpleXYChartDescriptor.decimal(10, true, 500); desc.addLineItems("1min","5min","15min"); connectionQueueChart = ChartFactory.createSimpleXYChart(desc); // ConnectionQueuePanel cqp = new ConnectionQueuePanel(); // final ConnectionQueuePanel.Model model = new ConnectionQueuePanel.Model() { // // ConnectionQueueMonitor queueMonitor = null; // { // if (monitor != null) { // queueMonitor = monitor.getConnectionQueueMonitor(); // } // } // // @Override // public RangedLong getUtilization() { // if (queueMonitor == null) { // return RangedLong.ZERO; // } // ConnectionQueueStats stats = queueMonitor.getConnectionQueueStats(); // long max = stats.getMaxQueued().getCount(); // long current = stats.getCountQueued().getCount(); // return new RangedLong(0L, max, current); // } // // @Override // public int getRefusalRate() { // if (queueMonitor == null) { // return 0; // } // ConnectionQueueStats stats = queueMonitor.getConnectionQueueStats(); // // if (stats.getCountTotalQueued().getCount() == 0) { // return 0; // } // // return Math.round(((float) stats.getCountOverflows().getCount() / (float) stats.getCountTotalConnections().getCount()) * 100.0F); // } // // @Override // public long getAverage1min() { // if (queueMonitor == null) { // return 0L; // } // ConnectionQueueStats stats = queueMonitor.getConnectionQueueStats(); // // return stats.getCountQueued1MinuteAverage().getCount(); // } // // @Override // public long getAverage5min() { // if (queueMonitor == null) { // return 0L; // } // ConnectionQueueStats stats = queueMonitor.getConnectionQueueStats(); // // return stats.getCountQueued5MinuteAverage().getCount(); // } // // @Override // public long getAverage15min() { // if (queueMonitor == null) { // return 0L; // } // ConnectionQueueStats stats = queueMonitor.getConnectionQueueStats(); // // return stats.getCountQueued15MinuteAverage().getCount(); // } // }; // cqp.setModel(model); queueRefreshTask = Scheduler.sharedInstance().schedule(new SchedulerTask() { @Override public void onSchedule(long timeStamp) { try { connectionQueueChart.addValues(timeStamp, new long[] {cqm.getConnectionQueueStats().getCountQueued1MinuteAverage().getCount(), cqm.getConnectionQueueStats().getCountQueued5MinuteAverage().getCount(), cqm.getConnectionQueueStats().getCountQueued15MinuteAverage().getCount()}); } catch (Exception e) { if (!(e instanceof UndeclaredThrowableException)) { LOGGER.log(Level.INFO,"onSchedule",e); } else { Scheduler.sharedInstance().unschedule(queueRefreshTask); queueRefreshTask = null; } } } }, Quantum.seconds(1)); dvc.configureDetailsArea(new DataViewComponent.DetailsAreaConfiguration("Connection Queue", true), DataViewComponent.TOP_LEFT); dvc.addDetailsView(new DataViewComponent.DetailsView("Connection Queue", null, 10, connectionQueueChart.getChart(), null), DataViewComponent.TOP_LEFT); } private SimpleXYChartSupport fileCacheChart; private void configureFileCacheVisualizer() { SimpleXYChartDescriptor desc = SimpleXYChartDescriptor.decimal(10, false, 500); desc.addLineFillItems("Min"); desc.addLineItems("Max","Current"); fileCacheChart = ChartFactory.createSimpleXYChart(desc); final FileCacheMonitor fcm = monitor.getFileCacheMonitor(); // FileCachePanel fcp = new FileCachePanel(); // final FileCachePanel.Model model = new FileCachePanel.Model() { // // FileCacheMonitor cacheMonitor = null; // { // if (monitor != null) { // cacheMonitor = monitor.getFileCacheMonitor(); // } // } // // @Override // public RangedLong getUtilizationHeap() { // if (cacheMonitor == null) { // return RangedLong.ZERO; // } // FileCacheStats stats = cacheMonitor.getFileCacheStats(); // return new RangedLong(0L, stats.getMaxHeapCacheSize().getCount(), stats.getSizeHeapCache().getCount()); // } // // @Override // public RangedLong getUtilizationAll() { // if (cacheMonitor == null) { // return RangedLong.ZERO; // } // FileCacheStats stats = cacheMonitor.getFileCacheStats(); // return new RangedLong(0L, stats.getMaxEntries().getCount(), stats.getMaxEntries().getCount()); // } // // @Override // public RangedLong getUtilizationOpen() { // if (cacheMonitor == null) { // return RangedLong.ZERO; // } // FileCacheStats stats = cacheMonitor.getFileCacheStats(); // return new RangedLong(0L, stats.getMaxOpenEntries().getCount(), stats.getCountOpenEntries().getCount()); // } // // @Override // public RangedLong getHitRatio() { // if (cacheMonitor == null) { // return RangedLong.ZERO; // } // FileCacheStats stats = cacheMonitor.getFileCacheStats(); // // long hits = stats.getCountContentHits().getCount(); // long misses = stats.getCountContentMisses().getCount(); // return new RangedLong(0L, hits + misses, misses); // } // }; // // fcp.setModel(model); final long[] minmax = new long[]{Long.MAX_VALUE, 0L}; cacheRefreshTask = Scheduler.sharedInstance().schedule(new SchedulerTask() { @Override public void onSchedule(long timeStamp) { try { long hits = fcm.getFileCacheStats().getCountContentHits().getCount(); long misses = fcm.getFileCacheStats().getCountContentMisses().getCount(); long percent = (hits + misses > 0) ? (hits * 100) / (hits + misses) : 0L; if (percent > minmax[1]) { minmax[1] = percent; } if (percent < minmax[0]) { minmax[0] = percent; } fileCacheChart.addValues(timeStamp, new long[] { minmax[0], minmax[1], percent }); } catch (Exception e) { if (!(e instanceof UndeclaredThrowableException)) { LOGGER.log(Level.INFO,"onSchedule",e); } else { Scheduler.sharedInstance().unschedule(cacheRefreshTask); cacheRefreshTask = null; } } } }, Quantum.seconds(1)); dvc.configureDetailsArea(new DataViewComponent.DetailsAreaConfiguration("File Cache", true), DataViewComponent.BOTTOM_LEFT); dvc.addDetailsView(new DataViewComponent.DetailsView("File Cache Hits", null, 10, fileCacheChart.getChart(), null), DataViewComponent.BOTTOM_LEFT); } private void configureHttpServiceVisualizer() { configureConnectionQueueVisualizer(); configureFileCacheVisualizer(); configureKeepAliveVisualizer(); } private SimpleXYChartSupport keepAliveChart; private void configureKeepAliveVisualizer() { final KeepAliveMonitor kaMonitor = monitor.getKeepAliveMonitor(); SimpleXYChartDescriptor desc = SimpleXYChartDescriptor.decimal(10, false, 500); desc.addLineItems("Refused","Flushed","Timed Out"); keepAliveChart = ChartFactory.createSimpleXYChart(desc); kaRefreshTask = Scheduler.sharedInstance().schedule(new SchedulerTask() { @Override public void onSchedule(long timeStamp) { try { KeepAliveStats stats = kaMonitor.getKeepAliveStats(); keepAliveChart.addValues(timeStamp, new long[] {stats.getCountRefusals().getCount(), stats.getCountFlushes().getCount(), stats.getCountTimeouts().getCount()}); } catch (Exception e) { if (!(e instanceof UndeclaredThrowableException)) { LOGGER.log(Level.INFO,"onSchedule",e); } else { Scheduler.sharedInstance().unschedule(kaRefreshTask); kaRefreshTask = null; } } } }, Quantum.seconds(1)); dvc.configureDetailsArea(new DataViewComponent.DetailsAreaConfiguration("Keep Alive", true), DataViewComponent.BOTTOM_RIGHT); dvc.addDetailsView(new DataViewComponent.DetailsView("Keep Alive", null, 10, keepAliveChart.getChart(), null), DataViewComponent.BOTTOM_RIGHT); } private void initComponents() { HTMLTextArea generalDataArea = new HTMLTextArea(); generalDataArea.setBorder(BorderFactory.createEmptyBorder(14, 8, 14, 8)); // DisplayArea monitoringDisplayArea = new DisplayArea(); // monitoringDisplayArea.setClosable(true); DataViewComponent.MasterView monitoringMasterView = new DataViewComponent.MasterView("", null, generalDataArea); DataViewComponent.MasterViewConfiguration monitoringMasterConfiguration = new DataViewComponent.MasterViewConfiguration(false); dvc = new DataViewComponent(monitoringMasterView, monitoringMasterConfiguration); configureHttpServiceVisualizer(); } }