diff --git a/config/testreport/js/xlt.js b/config/testreport/js/xlt.js index aef903def..849bddd05 100644 --- a/config/testreport/js/xlt.js +++ b/config/testreport/js/xlt.js @@ -591,6 +591,7 @@ var dataMinimum = []; var dataMaximum = []; var dataMaxMinDiff = []; + var dataCountPerSec = []; for (var item of data) { // timestamp and mean value @@ -601,6 +602,8 @@ dataMaximum.push([item[0], item[3]]); // timestamp and diff value dataMaxMinDiff.push([item[0], item[3] - item[2]]); + // timestamp and count/s value + dataCountPerSec.push([item[0], item[4]]); } // set up the chart @@ -784,6 +787,19 @@ show: false, }, }, + { + name: 'Count/s', + type: 'line', + data: dataCountPerSec, + lineStyle: { + opacity: 0, + width: 1, + }, + itemStyle: { + color: '#ffa500' + }, + symbol: 'none', + }, ] }); diff --git a/src/main/java/com/xceptance/xlt/report/providers/BasicTimerDataProcessor.java b/src/main/java/com/xceptance/xlt/report/providers/BasicTimerDataProcessor.java index 2bc4f04d5..b43815561 100644 --- a/src/main/java/com/xceptance/xlt/report/providers/BasicTimerDataProcessor.java +++ b/src/main/java/com/xceptance/xlt/report/providers/BasicTimerDataProcessor.java @@ -147,6 +147,9 @@ public TimerReport createTimerReport(final boolean generateHistogram) final TimeSeries runTimeAverageTimeSeries = JFreeChartUtils.createMovingAverageTimeSeries(runTimeTimeSeries, getMovingAveragePercentage()); + final TimeSeries countPerSecondTimeSeries = JFreeChartUtils.toMinMaxTimeSeries(countPerSecondValueSet.toMinMaxValueSet(minMaxValueSetSize), + "Count/s"); + // create charts asynchronously final TaskManager taskManager = TaskManager.getInstance(); @@ -184,16 +187,14 @@ public void run() @Override public void run() { - final TimeSeries countPerSecondTimeSeries = JFreeChartUtils.toMinMaxTimeSeries(countPerSecondValueSet.toMinMaxValueSet(minMaxValueSetSize), - "Count/s"); - saveCountPerSecondChart(name, countPerSecondTimeSeries); } }); + // create JSON data file asynchronously if (((ReportGeneratorConfiguration) getConfiguration()).dynamicChartsEnabled()) { - taskManager.addTask(() -> saveResponseTimeSeriesAsJson(name, runTimeTimeSeries)); + taskManager.addTask(() -> saveResponseTimeSeriesAsJson(name, runTimeTimeSeries, countPerSecondTimeSeries)); } } @@ -460,15 +461,18 @@ private void saveResponseTimeChart(final String timerName, final TimeSeries resp } /** - * Writes the response time series data to a JSON file in the charts directory. The data in this file is later read + * Writes the passed time series data to a JSON file in the charts directory. The data in this file is later read * from the load test report and forms the basis for interactive charts. * * @param timerName * the name of the timer * @param responseTimeSeries * the response time series + * @param countPerSecondTimeSeries + * the count/s time series */ - private void saveResponseTimeSeriesAsJson(final String timerName, final TimeSeries responseTimeSeries) + private void saveResponseTimeSeriesAsJson(final String timerName, final TimeSeries responseTimeSeries, + TimeSeries countPerSecondTimeSeries) { final int size = responseTimeSeries.getItems().size(); @@ -477,16 +481,22 @@ private void saveResponseTimeSeriesAsJson(final String timerName, final TimeSeri sb.append('['); for (int i = 0; i < size; i++) { - final IntMinMaxTimeSeriesDataItem dataItem = (IntMinMaxTimeSeriesDataItem) responseTimeSeries.getDataItem(i); + final IntMinMaxTimeSeriesDataItem responseTimeDataItem = (IntMinMaxTimeSeriesDataItem) responseTimeSeries.getDataItem(i); + + // get the count/s value that corresponds to the runtime value + // (we cannot use the index as there are potentially more data items in the count/s series) + final IntMinMaxTimeSeriesDataItem countPerSecondDataItem = (IntMinMaxTimeSeriesDataItem) countPerSecondTimeSeries.getDataItem(responseTimeDataItem.getPeriod()); sb.append('['); - sb.append(dataItem.getPeriod().getFirstMillisecond()); + sb.append(responseTimeDataItem.getPeriod().getFirstMillisecond()); + sb.append(','); + sb.append(responseTimeDataItem.getMinMaxValue().getAverageValue()); sb.append(','); - sb.append(dataItem.getMinMaxValue().getAverageValue()); + sb.append(responseTimeDataItem.getMinMaxValue().getMinimumValue()); sb.append(','); - sb.append(dataItem.getMinMaxValue().getMinimumValue()); + sb.append(responseTimeDataItem.getMinMaxValue().getMaximumValue()); sb.append(','); - sb.append(dataItem.getMinMaxValue().getMaximumValue()); + sb.append(countPerSecondDataItem.getMinMaxValue().getAverageValue()); sb.append(']'); if (i < size - 1)