/* * Copyright (C) 2008 Digital Sundhed (SDSD) * * All source code and information supplied as part of chronos * is copyright to its contributers. * * The source code has been released under a dual license - meaning you can * use either licensed version of the library with your code. * * It is released under the Common Public License 1.0, a copy of which can * be found at the link below. * http://www.opensource.org/licenses/cpl.php * * It is released under the LGPL (GNU Lesser General Public License), either * version 2.1 of the License, or (at your option) any later version. A copy * of which can be found at the link below. * http://www.gnu.org/copyleft/lesser.html */ package org.codehaus.mojo.chronos.chart; import java.awt.Color; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ResourceBundle; import org.codehaus.mojo.chronos.history.HistoricSamples; import org.jfree.chart.ChartFactory; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.AxisLocation; import org.jfree.chart.axis.DateAxis; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.plot.XYPlot; import org.jfree.data.time.TimeSeries; import org.jfree.data.time.TimeSeriesCollection; import org.jfree.data.xy.XYDataset; /** * Responsible for generating charts showing historic results. * * @author ksr@lakeside.dk */ public class HistoryChartGenerator { private ChartRenderer renderer; private ResourceBundle bundle; public HistoryChartGenerator(ChartRenderer renderer, ResourceBundle bundle) { this.renderer = renderer; this.bundle = bundle; } /** * create a summary chart of all samples together. * * @param samples * the {@link HistoricSamples} to chart * @param dataId * an id of the current report * @throws IOException * If the chart cannot be written to the filesystem */ /* Merged from Atlassion */ // public final void createResponseSummaryChart(HistoricSamples samples, String dataId) throws IOException { public final void createResponseSummaryChart(HistoricSamples samples, String dataId, double max) throws IOException { String label1 = bundle.getString("chronos.label.average.arrow"); TimeSeries averageSeries = samples.getAverageTime(label1); String label2 = bundle.getString("chronos.label.percentile95.arrow"); TimeSeries percentileseries = samples.getpercentile95(label2); XYDataset dataset = getResponseDataset(averageSeries, percentileseries); /* Merged from Atlassion */ // renderResponseChart(dataset, "history-response-summary-" + dataId); renderResponseChart(dataset, "history-response-summary-" + dataId, max); } public final void createThroughputChart(HistoricSamples samples, String dataId) throws IOException { XYPlot xyplot = newPlot(samples.getThroughput(dataId), "chronos.label.throughput.requests", true); xyplot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_LEFT); xyplot.getRenderer().setSeriesPaint(0, Color.GREEN); String timeLabel = bundle.getString("chronos.label.throughput.historytime"); DateAxis timeAxis = ChartUtil.createTimeAxis(timeLabel, new SimpleDateFormat()); xyplot.setDomainAxis(timeAxis); JFreeChart chart = new JFreeChart(bundle.getString("chronos.label.throughput"), xyplot); renderer.renderChart("history-throughput-" + dataId, chart); } public final void createGcChart(HistoricSamples samples, String dataId) throws IOException { XYPlot xyplot1 = newPlot(samples.getGcRatio(dataId), "chronos.label.gc.ratio", true); xyplot1.setRangeAxisLocation(AxisLocation.BOTTOM_OR_LEFT); xyplot1.getRenderer().setSeriesPaint(0, Color.GREEN); xyplot1.getRangeAxis().setStandardTickUnits(NumberAxis.createStandardTickUnits()); XYPlot xyplot2 = newPlot(samples.getKbCollectedPrSecond(dataId), "chronos.label.gc.kbpersec", true); xyplot2.setRangeAxisLocation(AxisLocation.TOP_OR_LEFT); xyplot2.getRenderer().setSeriesPaint(0, Color.GRAY); xyplot2.getRangeAxis().setStandardTickUnits(NumberAxis.createStandardTickUnits()); String timeLabel = bundle.getString("chronos.label.gc.historytime"); DateAxis timeAxis = ChartUtil.createTimeAxis(timeLabel, new SimpleDateFormat()); XYPlot combinedPlot = ChartUtil.createCombinedPlot(timeAxis, xyplot1, xyplot2); // xyplot1.setDomainAxis( timeAxis ); // XYPlot combinedPlot = xyplot1; JFreeChart chart = new JFreeChart(bundle.getString("chronos.label.gc"), combinedPlot); renderer.renderChart("history-gc-" + dataId, chart); } private XYPlot newPlot(TimeSeries timeSeries, String label, boolean forceIncludeZero) { return ChartUtil.newPlot(timeSeries, bundle.getString(label), forceIncludeZero); } /** * create the response charts for the individual samples. * * @param samples * the {@link HistoricSamples} to chart * @param dataId * an id of the current report * @throws IOException * if the chart cannot be written to the filesystem */ public final void createResponseDetailsChart(HistoricSamples samples, String dataId) throws IOException { // Merged from Atlassion double maxgraphupperbound = 0; String[] groupNames = samples.getGroupNames(); for (int i = 0; i < groupNames.length; i++) { String label1 = bundle.getString("chronos.label.average.arrow"); TimeSeries averageSeries = samples.getAverageTime(label1, groupNames[i]); String label2 = bundle.getString("chronos.label.percentile95.arrow"); TimeSeries percentileseries = samples.getPercentile95(label2, groupNames[i]); XYDataset dataset = getResponseDataset(averageSeries, percentileseries); // Merged from Atlassion // renderResponseChart(dataset, "history-response-" + i + "-" + dataId); renderResponseChart(dataset, "history-response-" + i + "-" + dataId, maxgraphupperbound); } } /* Merged from Atlassion */ // private void renderResponseChart(XYDataset dataset, String name) throws IOException { private void renderResponseChart(XYDataset dataset, String name, double max) throws IOException { String title = bundle.getString("chronos.label.responsetimes"); String xLabel = bundle.getString("chronos.label.responsetimes.historytime"); String yLabel = bundle.getString("chronos.label.responsetimes.responsetime"); JFreeChart chart = ChartFactory.createTimeSeriesChart(title, xLabel, yLabel, dataset, true, true, false); /* Merged from Atlassion */ if(max > 0) { ChartUtil.setUpperBound(chart, max); } ChartUtil.setupXYPlot(chart, new SimpleDateFormat()); renderer.renderChart(name, chart); } private XYDataset getResponseDataset(TimeSeries averageSeries, TimeSeries percentileseries) { TimeSeriesCollection dataset = new TimeSeriesCollection(); dataset.addSeries(averageSeries); dataset.addSeries(percentileseries); return dataset; } }