Reputation: 11
I'm using a sample JMeter test using 1 ThreadGroup with 5VUs for 60 seconds: Jmeter Test Plan
I am running JMeter in non-gui, distributed mode. I have one master coordinating the test and one slave running the JMX test plan. I am using the "influxdbMetricsSender" BackendListener to store test data in InfluxDB so that my Grafana dashboard can display real time results to the user.
I am using the Summariser to debug the Master.
I have configured the JMX (via Java code) to use a ResultCollector with a Summariser:
...
HashTree clonedTree = JMeter.convertSubTree(tree, true);
String summariserName = JMeterUtils.getPropDefault("summariser.name", "");
Summariser summariser = new Summariser(summariserName);
ResultCollector resultCollector = new ResultCollector(summariser);
resultCollector.setFilename("<path_to_logfile");
clonedTree.add(clonedTree.getArray()[0], resultCollector);
...
I have also configured a BackendListener (via Java code):
public static void activateInfluxDBListener(HashTree testPlanTree, String scheme) {
SearchByClass<org.apache.jmeter.testelement.TestPlan> ts = new SearchByClass<>(
org.apache.jmeter.testelement.TestPlan.class);
testPlanTree.traverse(ts);
Collection<org.apache.jmeter.testelement.TestPlan> objs = ts.getSearchResults();
if (objs.size() != 1) {
logger.error("Testplans {} found in jmx are more than expeected size of 1", objs.size());
throw new TestPlanJmxMalformedException("TestPlan entries found in jmx must be exactly one");
}
Iterator<org.apache.jmeter.testelement.TestPlan> testPlanIter = objs.iterator();
org.apache.jmeter.testelement.TestPlan theTestPlan = testPlanIter.next();
logger.info("Test Plan {}", theTestPlan);
BackendListener beListener = new BackendListener();
beListener.setProperty(TestElement.TEST_CLASS, BackendListener.class.getName());
beListener.setProperty(TestElement.GUI_CLASS, BackendListenerGui.class.getName());
beListener.setName("InfluxDB Backend Listener");
beListener.setEnabled(true);
Arguments arguments = new Arguments();
arguments.setProperty(TestElement.GUI_CLASS, ArgumentsPanel.class.getName());
arguments.setProperty(TestElement.TEST_CLASS, Arguments.class.getName());
arguments.setEnabled(true);
arguments.addArgument("influxdbMetricsSender",
"org.apache.jmeter.visualizers.backend.influxdb.HttpMetricsSender");
arguments.addArgument("influxdbUrl", scheme + "influx-svc:8086/write?db=jmeterdb", "=");
arguments.addArgument("application", "TestApp", "=");
arguments.addArgument("measurement", "jmeter", "=");
arguments.addArgument("summaryOnly", "false", "=");
arguments.addArgument("samplersRegex", ".*", "=");
arguments.addArgument("percentiles", "90;95;99", "=");
arguments.addArgument("testTitle", "Test name", "=");
arguments.addArgument("eventTags", "", "=");
beListener.setClassname(
org.apache.jmeter.visualizers.backend.influxdb.InfluxdbBackendListenerClient.class.getCanonicalName());
beListener.setArguments(arguments);
testPlanTree.add(theTestPlan, beListener);
logger.info("Registered influx backend listener with url {}",
scheme + "influx-svc:8086/write?db=jmeterdb");
}
When I check the Master logs I get SummariserRunningSample data but not any of the thread counts (Active, Started, and Finished all report 0) so RMI connection between the slave and master is working correctly:
2022-03-03 16:05:30.438 INFO 14 --- [3)-10.240.1.210] org.apache.jmeter.reporters.Summariser : summary + 1002 in 00:00:24 = 42.0/s Avg: 27 Min:
1 Max: 2499 Err: 0 (0.00%) Active: 0 Started: 0 Finished: 0
summary + 1002 in 00:00:24 = 42.0/s Avg: 27 Min: 1 Max: 2499 Err: 0 (0.00%) Active: 0 Started: 0 Finished: 0
2022-03-03 16:06:00.237 INFO 14 --- [3)-10.240.1.210] org.apache.jmeter.reporters.Summariser : summary + 2300 in 00:00:30 = 77.2/s Avg: 7 Min:
1 Max: 352 Err: 0 (0.00%) Active: 0 Started: 0 Finished: 0
summary + 2300 in 00:00:30 = 77.2/s Avg: 7 Min: 1 Max: 352 Err: 0 (0.00%) Active: 0 Started: 0 Finished: 0
2022-03-03 16:06:00.238 INFO 14 --- [3)-10.240.1.210] org.apache.jmeter.reporters.Summariser : summary = 3302 in 00:00:54 = 61.5/s Avg: 13 Min:
1 Max: 2499 Err: 0 (0.00%)
summary = 3302 in 00:00:54 = 61.5/s Avg: 13 Min: 1 Max: 2499 Err: 0 (0.00%)
2022-03-03 16:06:08.003 INFO 14 --- [ Thread-2] o.a.j.v.backend.BackendListener : Worker ended
2022-03-03 16:06:08.004 INFO 14 --- [1)-10.240.1.210] .a.j.v.b.i.InfluxdbBackendListenerClient : Sending last metrics
2022-03-03 16:06:08.005 INFO 14 --- [1)-10.240.1.210] o.a.j.v.b.influxdb.HttpMetricsSender : Destroying
2022-03-03 16:06:08.091 INFO 14 --- [3)-10.240.1.210] org.apache.jmeter.reporters.Summariser : summary + 741 in 00:00:08 = 94.4/s Avg: 5 Min:
1 Max: 188 Err: 0 (0.00%) Active: 0 Started: 0 Finished: 0
summary + 741 in 00:00:08 = 94.4/s Avg: 5 Min: 1 Max: 188 Err: 0 (0.00%) Active: 0 Started: 0 Finished: 0
2022-03-03 16:06:08.091 INFO 14 --- [3)-10.240.1.210] org.apache.jmeter.reporters.Summariser : summary = 4043 in 00:01:02 = 65.7/s Avg: 12 Min:
1 Max: 2499 Err: 0 (0.00%)
summary = 4043 in 00:01:02 = 65.7/s Avg: 12 Min: 1 Max: 2499 Err: 0 (0.00%)
The Grafana dashboard (using the InfluxDB data) shows Active Thread count as 0 too: Grafana Dashboard
However when I generate a Jmeter report from the result JTL file it shows the correct Active Thread Count data (5VUs constant until test ends):
Jmeter HTML report - Active Thread Over Time
Is there something I'm missing?
Upvotes: 0
Views: 322
Reputation: 11
I was able to figure it out. There was a bug report for this exact issue from 2012: https://bz.apache.org/bugzilla/show_bug.cgi?id=54152
The solution is to add a "dummy" test element to your JMX as a workaround:
var remoteListener = new RemoteThreadsListenerTestElement();
clonedTree.add(clonedTree.getArray()[0], remoteListener);
XML element:
<org.apache.jmeter.threads.RemoteThreadsListenerTestElement/>
The Jmeter client class org.apache.jmeter.engine.ConvertListeners will find this TestElement and replace it with a RemoteThreadsListener that will properly update the count of threads to the JMeterContextService that both Summariser and InfluxdbBackendListenerClient will check periodically.
After this change the Summariser and my Grafana Dashboards are showing the correct number of Jmeter VUs
Upvotes: 0