1 | |
|
2 | |
|
3 | |
package kg.apc.jmeter.reporters; |
4 | |
|
5 | |
import java.io.PrintStream; |
6 | |
import java.io.Serializable; |
7 | |
import org.apache.jmeter.JMeter; |
8 | |
import org.apache.jmeter.engine.event.LoopIterationEvent; |
9 | |
import org.apache.jmeter.engine.util.NoThreadClone; |
10 | |
import org.apache.jmeter.reporters.AbstractListenerElement; |
11 | |
import org.apache.jmeter.samplers.SampleEvent; |
12 | |
import org.apache.jmeter.samplers.SampleListener; |
13 | |
import org.apache.jmeter.samplers.SampleResult; |
14 | |
import org.apache.jmeter.testelement.TestListener; |
15 | |
import org.apache.jmeter.testelement.TestStateListener; |
16 | |
import org.apache.jmeter.threads.JMeterContextService; |
17 | |
import org.apache.jorphan.logging.LoggingManager; |
18 | |
import org.apache.log.Logger; |
19 | |
|
20 | 12 | public class ConsoleStatusLogger extends AbstractListenerElement |
21 | |
implements SampleListener, Serializable, |
22 | |
NoThreadClone, TestStateListener { |
23 | |
|
24 | 1 | private static final Logger log = LoggingManager.getLoggerForClass(); |
25 | |
private PrintStream out; |
26 | 9 | private long cur = 0; |
27 | |
private int count; |
28 | |
private int threads; |
29 | |
private int sumRTime; |
30 | |
private int sumLatency; |
31 | |
private int errors; |
32 | |
private long begin; |
33 | |
|
34 | 9 | private static class JMeterLoggerOutputStream extends PrintStream { |
35 | |
|
36 | |
public JMeterLoggerOutputStream(Logger log) { |
37 | 3 | super(System.out); |
38 | 3 | } |
39 | |
|
40 | |
@Override |
41 | |
public void println(String msg) { |
42 | 3 | log.info(msg); |
43 | 3 | } |
44 | |
} |
45 | |
|
46 | |
@Override |
47 | |
public synchronized void sampleOccurred(SampleEvent se) { |
48 | |
|
49 | 6 | long sec = System.currentTimeMillis() / 1000; |
50 | 6 | if (sec != cur && count > 0) { |
51 | 3 | if (cur == 0) { |
52 | 1 | begin = sec; |
53 | |
} |
54 | |
|
55 | 3 | log.debug(cur + " " + begin); |
56 | 3 | flush(sec - begin); |
57 | 3 | cur = sec; |
58 | |
} |
59 | 6 | SampleResult res = se.getResult(); |
60 | |
|
61 | 6 | count++; |
62 | 6 | sumRTime += res.getTime(); |
63 | 6 | sumLatency += res.getLatency(); |
64 | 6 | errors += res.isSuccessful() ? 0 : 1; |
65 | 6 | threads = res.getAllThreads(); |
66 | 6 | } |
67 | |
|
68 | |
private void flush(long sec) { |
69 | 3 | String msg = '#' + Long.toString(sec) + '\t'; |
70 | 3 | msg += "Threads: " + threads + '/' + JMeterContextService.getTotalThreads() + '\t'; |
71 | 3 | msg += "Samples: " + count + '\t'; |
72 | 3 | msg += "Latency: " + sumLatency / (count > 0 ? count : 1) + '\t'; |
73 | 3 | msg += "Resp.Time: " + sumRTime / (count > 0 ? count : 1) + '\t'; |
74 | 3 | msg += "Errors: " + errors; |
75 | 3 | out.println(msg); |
76 | |
|
77 | 3 | count = 0; |
78 | 3 | sumRTime = 0; |
79 | 3 | sumLatency = 0; |
80 | 3 | errors = 0; |
81 | 3 | } |
82 | |
|
83 | |
@Override |
84 | |
public void sampleStarted(SampleEvent se) { |
85 | 1 | } |
86 | |
|
87 | |
@Override |
88 | |
public void sampleStopped(SampleEvent se) { |
89 | 1 | } |
90 | |
|
91 | |
@Override |
92 | |
public void testStarted() { |
93 | 3 | if (JMeter.isNonGUI()) { |
94 | 0 | out = System.out; |
95 | |
} else { |
96 | 3 | out = new JMeterLoggerOutputStream(log); |
97 | |
} |
98 | 3 | cur = 0; |
99 | 3 | } |
100 | |
|
101 | |
@Override |
102 | |
public void testStarted(String string) { |
103 | 1 | testStarted(); |
104 | 1 | } |
105 | |
|
106 | |
@Override |
107 | |
public void testEnded() { |
108 | 1 | } |
109 | |
|
110 | |
@Override |
111 | |
public void testEnded(String string) { |
112 | 1 | } |
113 | |
} |