George Li
George Li

Reputation: 11

Distributed JMeter - Active Thread Count is 0 in Summariser and InfluxDB Backend Listener

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

Answers (1)

George Li
George Li

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

Related Questions