Coverage Report - kg.apc.jmeter.vizualizers.ThreadsStateOverTimeGui
 
Classes in this File Line Coverage Branch Coverage Complexity
ThreadsStateOverTimeGui
52%
32/61
25%
7/28
2.5
 
 1  
 package kg.apc.jmeter.vizualizers;
 2  
 
 3  
 import java.awt.Color;
 4  
 import java.util.Iterator;
 5  
 import kg.apc.charting.AbstractGraphPanelChartElement;
 6  
 import kg.apc.charting.AbstractGraphRow;
 7  
 import kg.apc.charting.elements.GraphPanelChartSimpleElement;
 8  
 import kg.apc.charting.rows.GraphRowSimple;
 9  
 import kg.apc.jmeter.JMeterPluginsUtils;
 10  
 import kg.apc.jmeter.graphs.AbstractOverTimeVisualizer;
 11  
 import org.apache.jmeter.samplers.SampleResult;
 12  
 import org.apache.jorphan.logging.LoggingManager;
 13  
 import org.apache.log.Logger;
 14  
 
 15  
 public class ThreadsStateOverTimeGui
 16  
         extends AbstractOverTimeVisualizer {
 17  
 
 18  1
     private static final Logger log = LoggingManager.getLoggerForClass();
 19  12
     private long lastAggUpdateTime = 0;
 20  
 
 21  
     /**
 22  
      *
 23  
      */
 24  
     public ThreadsStateOverTimeGui() {
 25  12
         super();
 26  12
         graphPanel.getGraphObject().setYAxisLabel("Number of active threads");
 27  12
     }
 28  
 
 29  
     @Override
 30  
     protected void setExtraChartSettings() {
 31  13
         graphPanel.getGraphObject().getChartSettings().enableDrawFinalZeroingLines();
 32  13
     }
 33  
 
 34  
     private double getAllThreadCount(long time) {
 35  0
         double ret = 0;
 36  0
         Iterator<AbstractGraphRow> rowsIter = model.values().iterator();
 37  0
         while (rowsIter.hasNext()) {
 38  0
             AbstractGraphRow row = rowsIter.next();
 39  
 
 40  
             //if the tg finished, last value = 0, else we take last known value
 41  0
             if (time <= (row.getMaxX() + row.getGranulationValue())) {
 42  0
                 AbstractGraphPanelChartElement element = row.getElement(time);
 43  
 
 44  0
                 if (element == null) {
 45  0
                     element = row.getLowerElement(time);
 46  
                 }
 47  0
                 if (element != null) {
 48  0
                     ret += element.getValue();
 49  
                 }
 50  
             }
 51  0
         }
 52  
 
 53  0
         return ret;
 54  
     }
 55  
 
 56  
     //perf fix: only process elements between time and last processed - sampler duration
 57  
     private void rebuildAggRow(GraphRowSimple row, long time, long duration) {
 58  0
         long key = row.getHigherKey(lastAggUpdateTime - duration - 1);
 59  0
         while (key < time && key != -1) {
 60  0
             GraphPanelChartSimpleElement elt = (GraphPanelChartSimpleElement) row.getElement(key);
 61  0
             elt.add(getAllThreadCount(key));
 62  
 
 63  0
             Long nextKey = row.getHigherKey(key);
 64  0
             if (nextKey != null) {
 65  0
                 key = nextKey;
 66  
             } else {
 67  0
                 key = -1;
 68  
             }
 69  0
         }
 70  0
     }
 71  
 
 72  
     private void addThreadGroupRecord(String threadGroupName, long time, int numThreads, long duration) {
 73  2
         String labelAgg = "Overall Active Threads";
 74  2
         AbstractGraphRow row = model.get(threadGroupName);
 75  2
         AbstractGraphRow rowAgg = modelAggregate.get(labelAgg);
 76  
 
 77  2
         if (row == null) {
 78  1
             row = getNewRow(model, AbstractGraphRow.ROW_AVERAGES, threadGroupName, AbstractGraphRow.MARKER_SIZE_SMALL, false, false, false, true, true);
 79  
         }
 80  2
         if (rowAgg == null) {
 81  1
             rowAgg = getNewRow(modelAggregate, AbstractGraphRow.ROW_SIMPLE, labelAgg, AbstractGraphRow.MARKER_SIZE_SMALL, false, false, false, true, Color.RED, true);
 82  
         }
 83  
 
 84  2
         row.add(time, numThreads);
 85  
 
 86  
         //rebuild is a heavy process, avoided if possible
 87  2
         if (model.size() == 1) {
 88  2
             log.debug(row.toString());
 89  2
             log.debug(row.getElement(time).toString());
 90  2
             rowAgg.add(time, row.getElement(time).getValue());
 91  
         } else {
 92  0
             rowAgg.add(time, getAllThreadCount(time));
 93  
 
 94  
             //handle 3rd and more jtl reload, the time are reset to start time, so we
 95  
             //invalidate lastAggUpdateTime
 96  0
             if (time < lastAggUpdateTime) {
 97  0
                 lastAggUpdateTime = time - duration;
 98  
             }
 99  
 
 100  0
             if (time != lastAggUpdateTime) {
 101  0
                 rebuildAggRow((GraphRowSimple) rowAgg, time, duration);
 102  
             }
 103  
 
 104  0
             lastAggUpdateTime = time;
 105  
         }
 106  2
     }
 107  
 
 108  
     @Override
 109  
     public String getLabelResource() {
 110  1
         return this.getClass().getSimpleName();
 111  
     }
 112  
 
 113  
     @Override
 114  
     public String getStaticLabel() {
 115  25
         return JMeterPluginsUtils.prefixLabel("Active Threads Over Time");
 116  
     }
 117  
 
 118  
     @Override
 119  
     public void add(SampleResult res) {
 120  2
         if (!isSampleIncluded(res)) {
 121  0
             return;
 122  
         }
 123  2
         super.add(res);
 124  2
         String threadName = res.getThreadName();
 125  
         // SUBString to extract thread group name from thread name
 126  2
         threadName = threadName.lastIndexOf(" ") >= 0 ? threadName.substring(0, threadName.lastIndexOf(" ")) : threadName;
 127  
 
 128  
         //fix response to fast can miss points
 129  2
         long timeForAgg = Math.max(getGranulation(), res.getTime());
 130  2
         addThreadGroupRecord(threadName, normalizeTime(res.getEndTime()), res.getGroupThreads(), timeForAgg);
 131  2
         updateGui(null);
 132  2
     }
 133  
 
 134  
     @Override
 135  
     protected JSettingsPanel createSettingsPanel() {
 136  14
         return new JSettingsPanel(this,
 137  
                 JSettingsPanel.TIMELINE_OPTION
 138  
                 | JSettingsPanel.GRADIENT_OPTION
 139  
                 | JSettingsPanel.FINAL_ZEROING_OPTION
 140  
                 | JSettingsPanel.LIMIT_POINT_OPTION
 141  
                 | JSettingsPanel.AGGREGATE_OPTION
 142  
                 | JSettingsPanel.RELATIVE_TIME_OPTION
 143  
                 | JSettingsPanel.MAXY_OPTION
 144  
                 | JSettingsPanel.MARKERS_OPTION);
 145  
     }
 146  
 
 147  
     @Override
 148  
     public String getWikiPage() {
 149  13
         return "ActiveThreadsOverTime";
 150  
     }
 151  
 }