Stress Testing a CloudBees CI Controller

Article ID:218901087
4 minute readKnowledge base

Issue

  • I’d like to simulate heavy load on my CloudBees CI client controller to get a better understanding of stability and performance

  • How can I stress test my controller to determine if the system/architecture is powerful enough to handle heavy loads?

Resolution

Apache JMeter is a good tool to do this, as it’s designed to load test functional behavior and measure performance. JMeter can be used to simulate a heavy load on a server, group of servers, network or object to test its strength or to analyze overall performance under different load types. You can use it to make a graphical analysis of performance or to test your server/script/object behavior under heavy concurrent load.

Disclaimer: This is a Third-party tool, so please run this at your own risk. We discourage running such tools or performing stress testing in Production environments. It’s recommended to create a "Test" CloudBees CI instance to perform such testing - please see Migration Guide: CloudBees CI for instructions to create this type of environment.

You will need to download the standard set of plugins (which includes Perfmon). Once you start JMeter, and load the test plan, you can right click Test CI Jobs on the left hand column, then Add, then Listeners, then jp@gc - Perfmon Metrics Collector. Here, you can add rows which collect specific data based on target server host name and port that we will specify later (such as "CPU and Disk I/O") as seen in the following screenshot:

stress testing jenkins JMeter

After this is configured, you will need to download the Server Agent and extract onto the target machine. You can put it anywhere and start it by running ./startAgent.sh on Linux machines or ./startAgent.bat on Windows machines. It defaults to port 4444, but you can change it by running a command like this: ./startAgent.sh --udp-port 0 --tcp-port 3450. Once the server is running, you can execute the tests by clicking the green play button at the top of JMeter(as seen in the screenshot above).

You can find a sample test plan in the example section below.

Once you load this sample test in JMeter, Select the Variables section and change the "host" and "port" variables as needed to point to your Test CloudBees CI instance. This should work on an instance that is very basic in configuration, with security disabled. Additional modifications may be necessary if you have security enabled, or if you’d like to enhance the tests.

Example

Below you will find the contents of a sample jmx file that you can use as a reference to start running stress tests on your instance.

Copy the contents of the example into a file with jmx extension and load it using JMeter (e.g.: stress-testing-sample-plan.jmx)

<?xml version="1.0" encoding="UTF-8"?> <jmeterTestPlan version="1.2" properties="2.9" jmeter="3.0 r1743807"> <hashTree> <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test CI Jobs (basic)" enabled="true"> <stringProp name="TestPlan.comments"></stringProp> <boolProp name="TestPlan.functional_mode">false</boolProp> <boolProp name="TestPlan.serialize_threadgroups">true</boolProp> <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> <collectionProp name="Arguments.arguments"/> </elementProp> <stringProp name="TestPlan.user_define_classpath"></stringProp> <boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp> </TestPlan> <hashTree> <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Create Test Environment" enabled="true"> <stringProp name="ThreadGroup.on_sample_error">stoptestnow</stringProp> <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> <boolProp name="LoopController.continue_forever">false</boolProp> <stringProp name="LoopController.loops">1</stringProp> </elementProp> <stringProp name="ThreadGroup.num_threads">1</stringProp> <stringProp name="ThreadGroup.ramp_time">1</stringProp> <longProp name="ThreadGroup.start_time">1457618474000</longProp> <longProp name="ThreadGroup.end_time">1457618474000</longProp> <boolProp name="ThreadGroup.scheduler">false</boolProp> <stringProp name="ThreadGroup.duration"></stringProp> <stringProp name="ThreadGroup.delay"></stringProp> </ThreadGroup> <hashTree> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Create Tests Folder" enabled="true"> <boolProp name="HTTPSampler.postBodyRaw">true</boolProp> <elementProp name="HTTPsampler.Arguments" elementType="Arguments"> <collectionProp name="Arguments.arguments"> <elementProp name="" elementType="HTTPArgument"> <boolProp name="HTTPArgument.always_encode">false</boolProp> <stringProp name="Argument.value">&lt;?xml version=&apos;1.0&apos; encoding=&apos;UTF-8&apos;?&gt;&#xd; &lt;com.cloudbees.hudson.plugins.folder.Folder plugin=&quot;cloudbees-folder@5.3&quot;&gt;&#xd; &lt;properties&gt;&#xd; &lt;com.cloudbees.jenkins.plugins.foldersplus.SecurityGrantsFolderProperty plugin=&quot;cloudbees-folders-plus@3.0&quot;&gt;&#xd; &lt;securityGrants/&gt;&#xd; &lt;/com.cloudbees.jenkins.plugins.foldersplus.SecurityGrantsFolderProperty&gt;&#xd; &lt;/properties&gt;&#xd; &lt;views&gt;&#xd; &lt;hudson.model.AllView&gt;&#xd; &lt;owner class=&quot;com.cloudbees.hudson.plugins.folder.Folder&quot; reference=&quot;../../..&quot;/&gt;&#xd; &lt;name&gt;All&lt;/name&gt;&#xd; &lt;filterExecutors&gt;false&lt;/filterExecutors&gt;&#xd; &lt;filterQueue&gt;false&lt;/filterQueue&gt;&#xd; &lt;properties class=&quot;hudson.model.View$PropertyList&quot;/&gt;&#xd; &lt;/hudson.model.AllView&gt;&#xd; &lt;/views&gt;&#xd; &lt;viewsTabBar class=&quot;hudson.views.DefaultViewsTabBar&quot;/&gt;&#xd; &lt;primaryView&gt;All&lt;/primaryView&gt;&#xd; &lt;healthMetrics&gt;&#xd; &lt;com.cloudbees.hudson.plugins.folder.health.WorstChildHealthMetric/&gt;&#xd; &lt;com.cloudbees.hudson.plugins.folder.health.AverageChildHealthMetric plugin=&quot;cloudbees-folders-plus@3.0&quot;/&gt;&#xd; &lt;com.cloudbees.hudson.plugins.folder.health.JobStatusHealthMetric plugin=&quot;cloudbees-folders-plus@3.0&quot;&gt;&#xd; &lt;success&gt;true&lt;/success&gt;&#xd; &lt;failure&gt;true&lt;/failure&gt;&#xd; &lt;unstable&gt;true&lt;/unstable&gt;&#xd; &lt;unbuilt&gt;true&lt;/unbuilt&gt;&#xd; &lt;countVirginJobs&gt;false&lt;/countVirginJobs&gt;&#xd; &lt;/com.cloudbees.hudson.plugins.folder.health.JobStatusHealthMetric&gt;&#xd; &lt;com.cloudbees.hudson.plugins.folder.health.ProjectEnabledHealthMetric plugin=&quot;cloudbees-folders-plus@3.0&quot;/&gt;&#xd; &lt;/healthMetrics&gt;&#xd; &lt;icon class=&quot;com.cloudbees.hudson.plugins.folder.icons.StockFolderIcon&quot;/&gt;&#xd; &lt;/com.cloudbees.hudson.plugins.folder.Folder&gt;</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> </collectionProp> </elementProp> <stringProp name="HTTPSampler.domain">${host}</stringProp> <stringProp name="HTTPSampler.port">${port}</stringProp> <stringProp name="HTTPSampler.connect_timeout"></stringProp> <stringProp name="HTTPSampler.response_timeout"></stringProp> <stringProp name="HTTPSampler.protocol">http</stringProp> <stringProp name="HTTPSampler.contentEncoding"></stringProp> <stringProp name="HTTPSampler.path">${prefix}/createItem?name=${testFolder}&amp;mode=com.cloudbees.hudson.plugins.folder.Folder</stringProp> <stringProp name="HTTPSampler.method">POST</stringProp> <boolProp name="HTTPSampler.follow_redirects">false</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.use_keepalive">false</boolProp> <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> <stringProp name="HTTPSampler.implementation">HttpClient4</stringProp> <boolProp name="HTTPSampler.monitor">false</boolProp> <stringProp name="HTTPSampler.embedded_url_re"></stringProp> </HTTPSamplerProxy> <hashTree> <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> <collectionProp name="HeaderManager.headers"> <elementProp name="" elementType="Header"> <stringProp name="Header.name">Content-Type</stringProp> <stringProp name="Header.value">application/x-www-form-urlencoded</stringProp> </elementProp> </collectionProp> </HeaderManager> <hashTree/> </hashTree> </hashTree> <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Basic Job Tests" enabled="true"> <stringProp name="ThreadGroup.on_sample_error">continue</stringProp> <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> <boolProp name="LoopController.continue_forever">false</boolProp> <stringProp name="LoopController.loops">${passes}</stringProp> </elementProp> <stringProp name="ThreadGroup.num_threads">${threads}</stringProp> <stringProp name="ThreadGroup.ramp_time">1</stringProp> <longProp name="ThreadGroup.start_time">1457618474000</longProp> <longProp name="ThreadGroup.end_time">1457618474000</longProp> <boolProp name="ThreadGroup.scheduler">false</boolProp> <stringProp name="ThreadGroup.duration"></stringProp> <stringProp name="ThreadGroup.delay"></stringProp> </ThreadGroup> <hashTree> <ConstantThroughputTimer guiclass="TestBeanGUI" testclass="ConstantThroughputTimer" testname="Constant Throughput Timer" enabled="true"> <stringProp name="throughput">${throughput}</stringProp> <intProp name="calcMode">2</intProp> </ConstantThroughputTimer> <hashTree/> <CounterConfig guiclass="CounterConfigGui" testclass="CounterConfig" testname="count" enabled="true"> <stringProp name="CounterConfig.start">1</stringProp> <stringProp name="CounterConfig.end">${countMax}</stringProp> <stringProp name="CounterConfig.incr">1</stringProp> <stringProp name="CounterConfig.name">count</stringProp> <stringProp name="CounterConfig.format"></stringProp> <boolProp name="CounterConfig.per_user">false</boolProp> </CounterConfig> <hashTree/> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Create Job" enabled="true"> <boolProp name="HTTPSampler.postBodyRaw">true</boolProp> <elementProp name="HTTPsampler.Arguments" elementType="Arguments"> <collectionProp name="Arguments.arguments"> <elementProp name="" elementType="HTTPArgument"> <boolProp name="HTTPArgument.always_encode">false</boolProp> <stringProp name="Argument.value">&lt;?xml version=&apos;1.0&apos; encoding=&apos;UTF-8&apos;?&gt;&#xd; &lt;project&gt;&#xd; &lt;actions/&gt;&#xd; &lt;description&gt;&lt;/description&gt;&#xd; &lt;keepDependencies&gt;false&lt;/keepDependencies&gt;&#xd; &lt;properties&gt;&#xd; &lt;com.cloudbees.plugins.deployer.DeployNowJobProperty plugin=&quot;deployer-framework@1.1&quot;&gt;&#xd; &lt;oneClickDeploy&gt;false&lt;/oneClickDeploy&gt;&#xd; &lt;hosts&gt;&#xd; &lt;com.cloudbees.plugins.deployer.impl.amazon.HostImpl plugin=&quot;cloudbees-aws-deployer@1.15&quot;&gt;&#xd; &lt;targets class=&quot;java.util.Collections$UnmodifiableRandomAccessList&quot; resolves-to=&quot;java.util.Collections$UnmodifiableList&quot;&gt;&#xd; &lt;c class=&quot;list&quot;/&gt;&#xd; &lt;list reference=&quot;../c&quot;/&gt;&#xd; &lt;/targets&gt;&#xd; &lt;credentialsId&gt;&lt;/credentialsId&gt;&#xd; &lt;/com.cloudbees.plugins.deployer.impl.amazon.HostImpl&gt;&#xd; &lt;/hosts&gt;&#xd; &lt;/com.cloudbees.plugins.deployer.DeployNowJobProperty&gt;&#xd; &lt;/properties&gt;&#xd; &lt;scm class=&quot;hudson.scm.NullSCM&quot;/&gt;&#xd; &lt;canRoam&gt;true&lt;/canRoam&gt;&#xd; &lt;disabled&gt;false&lt;/disabled&gt;&#xd; &lt;blockBuildWhenDownstreamBuilding&gt;false&lt;/blockBuildWhenDownstreamBuilding&gt;&#xd; &lt;blockBuildWhenUpstreamBuilding&gt;false&lt;/blockBuildWhenUpstreamBuilding&gt;&#xd; &lt;triggers/&gt;&#xd; &lt;concurrentBuild&gt;false&lt;/concurrentBuild&gt;&#xd; &lt;builders&gt;&#xd; &lt;hudson.tasks.Shell&gt;&#xd; &lt;command&gt;echo &amp;quot;BUILDING&amp;quot;&#xd; &#xd; cat &amp;gt; hello.cpp &amp;lt;&amp;lt; &amp;quot;EOF&amp;quot;&#xd; #include &amp;lt;iostream&amp;gt;&#xd; int main()&#xd; {&#xd; std::cout &amp;lt;&amp;lt; &amp;quot;Hello\n&amp;quot;;&#xd; }&#xd; EOF&#xd; &#xd; clang++ hello.cpp -o hello&#xd; &lt;/command&gt;&#xd; &lt;/hudson.tasks.Shell&gt;&#xd; &lt;/builders&gt;&#xd; &lt;publishers/&gt;&#xd; &lt;buildWrappers/&gt;&#xd; &lt;/project&gt;</stringProp> <stringProp name="Argument.metadata">=</stringProp> </elementProp> </collectionProp> </elementProp> <stringProp name="HTTPSampler.domain">${host}</stringProp> <stringProp name="HTTPSampler.port">${port}</stringProp> <stringProp name="HTTPSampler.connect_timeout"></stringProp> <stringProp name="HTTPSampler.response_timeout"></stringProp> <stringProp name="HTTPSampler.protocol">http</stringProp> <stringProp name="HTTPSampler.contentEncoding"></stringProp> <stringProp name="HTTPSampler.path">${prefix}/job/${testFolder}/createItem?name=${testName}${count}</stringProp> <stringProp name="HTTPSampler.method">POST</stringProp> <boolProp name="HTTPSampler.follow_redirects">false</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.use_keepalive">false</boolProp> <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> <stringProp name="HTTPSampler.implementation">HttpClient4</stringProp> <boolProp name="HTTPSampler.monitor">false</boolProp> <stringProp name="HTTPSampler.embedded_url_re"></stringProp> </HTTPSamplerProxy> <hashTree> <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> <collectionProp name="HeaderManager.headers"> <elementProp name="" elementType="Header"> <stringProp name="Header.name">Content-Type</stringProp> <stringProp name="Header.value">application/xml</stringProp> </elementProp> </collectionProp> </HeaderManager> <hashTree/> </hashTree> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Run Job" enabled="true"> <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> <collectionProp name="Arguments.arguments"/> </elementProp> <stringProp name="HTTPSampler.domain">${host}</stringProp> <stringProp name="HTTPSampler.port">${port}</stringProp> <stringProp name="HTTPSampler.connect_timeout"></stringProp> <stringProp name="HTTPSampler.response_timeout"></stringProp> <stringProp name="HTTPSampler.protocol">http</stringProp> <stringProp name="HTTPSampler.contentEncoding"></stringProp> <stringProp name="HTTPSampler.path">${prefix}/job/${testFolder}/job/${testName}${count}/build?delay=0sec</stringProp> <stringProp name="HTTPSampler.method">POST</stringProp> <boolProp name="HTTPSampler.follow_redirects">false</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.use_keepalive">false</boolProp> <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> <stringProp name="HTTPSampler.implementation">HttpClient4</stringProp> <boolProp name="HTTPSampler.monitor">false</boolProp> <stringProp name="HTTPSampler.embedded_url_re"></stringProp> </HTTPSamplerProxy> <hashTree/> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="View Job" enabled="true"> <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> <collectionProp name="Arguments.arguments"/> </elementProp> <stringProp name="HTTPSampler.domain">${host}</stringProp> <stringProp name="HTTPSampler.port">${port}</stringProp> <stringProp name="HTTPSampler.connect_timeout">5000</stringProp> <stringProp name="HTTPSampler.response_timeout">5000</stringProp> <stringProp name="HTTPSampler.protocol">http</stringProp> <stringProp name="HTTPSampler.contentEncoding"></stringProp> <stringProp name="HTTPSampler.path">${prefix}/job/${testFolder}/job/${testName}${count}</stringProp> <stringProp name="HTTPSampler.method">GET</stringProp> <boolProp name="HTTPSampler.follow_redirects">false</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.use_keepalive">false</boolProp> <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> <stringProp name="HTTPSampler.implementation">HttpClient4</stringProp> <boolProp name="HTTPSampler.monitor">false</boolProp> <stringProp name="HTTPSampler.embedded_url_re"></stringProp> </HTTPSamplerProxy> <hashTree/> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="View Build" enabled="true"> <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> <collectionProp name="Arguments.arguments"/> </elementProp> <stringProp name="HTTPSampler.domain">${host}</stringProp> <stringProp name="HTTPSampler.port">${port}</stringProp> <stringProp name="HTTPSampler.connect_timeout">5000</stringProp> <stringProp name="HTTPSampler.response_timeout">5000</stringProp> <stringProp name="HTTPSampler.protocol">http</stringProp> <stringProp name="HTTPSampler.contentEncoding"></stringProp> <stringProp name="HTTPSampler.path">${prefix}/job/${testFolder}/job/${testName}${count}/1</stringProp> <stringProp name="HTTPSampler.method">GET</stringProp> <boolProp name="HTTPSampler.follow_redirects">false</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.use_keepalive">false</boolProp> <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> <stringProp name="HTTPSampler.implementation">HttpClient4</stringProp> <boolProp name="HTTPSampler.monitor">false</boolProp> <stringProp name="HTTPSampler.embedded_url_re"></stringProp> </HTTPSamplerProxy> <hashTree/> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="View Build Console" enabled="true"> <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> <collectionProp name="Arguments.arguments"/> </elementProp> <stringProp name="HTTPSampler.domain">${host}</stringProp> <stringProp name="HTTPSampler.port">${port}</stringProp> <stringProp name="HTTPSampler.connect_timeout">5000</stringProp> <stringProp name="HTTPSampler.response_timeout">5000</stringProp> <stringProp name="HTTPSampler.protocol">http</stringProp> <stringProp name="HTTPSampler.contentEncoding"></stringProp> <stringProp name="HTTPSampler.path">${prefix}/job/${testFolder}/job/${testName}${count}/1/console</stringProp> <stringProp name="HTTPSampler.method">GET</stringProp> <boolProp name="HTTPSampler.follow_redirects">false</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.use_keepalive">false</boolProp> <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> <stringProp name="HTTPSampler.implementation">HttpClient4</stringProp> <boolProp name="HTTPSampler.monitor">false</boolProp> <stringProp name="HTTPSampler.embedded_url_re"></stringProp> </HTTPSamplerProxy> <hashTree/> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Delete Job" enabled="true"> <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> <collectionProp name="Arguments.arguments"/> </elementProp> <stringProp name="HTTPSampler.domain">${host}</stringProp> <stringProp name="HTTPSampler.port">${port}</stringProp> <stringProp name="HTTPSampler.connect_timeout"></stringProp> <stringProp name="HTTPSampler.response_timeout"></stringProp> <stringProp name="HTTPSampler.protocol">http</stringProp> <stringProp name="HTTPSampler.contentEncoding"></stringProp> <stringProp name="HTTPSampler.path">${prefix}/job/${testFolder}/job/${testName}${count}/doDelete</stringProp> <stringProp name="HTTPSampler.method">POST</stringProp> <boolProp name="HTTPSampler.follow_redirects">false</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.use_keepalive">false</boolProp> <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> <stringProp name="HTTPSampler.implementation">HttpClient4</stringProp> <boolProp name="HTTPSampler.monitor">false</boolProp> <stringProp name="HTTPSampler.embedded_url_re"></stringProp> </HTTPSamplerProxy> <hashTree/> <kg.apc.jmeter.perfmon.PerfMonCollector guiclass="kg.apc.jmeter.vizualizers.PerfMonGui" testclass="kg.apc.jmeter.perfmon.PerfMonCollector" testname="jp@gc - PerfMon Metrics Collector" enabled="true"> <boolProp name="ResultCollector.error_logging">false</boolProp> <objProp> <name>saveConfig</name> <value class="SampleSaveConfiguration"> <time>true</time> <latency>true</latency> <timestamp>true</timestamp> <success>true</success> <label>true</label> <code>true</code> <message>true</message> <threadName>true</threadName> <dataType>true</dataType> <encoding>false</encoding> <assertions>true</assertions> <subresults>true</subresults> <responseData>false</responseData> <samplerData>false</samplerData> <xml>false</xml> <fieldNames>true</fieldNames> <responseHeaders>false</responseHeaders> <requestHeaders>false</requestHeaders> <responseDataOnError>false</responseDataOnError> <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage> <assertionsResultsToSave>0</assertionsResultsToSave> <bytes>true</bytes> <threadCounts>true</threadCounts> <idleTime>true</idleTime> </value> </objProp> <stringProp name="filename"></stringProp> <longProp name="interval_grouping">1000</longProp> <boolProp name="graph_aggregated">false</boolProp> <stringProp name="include_sample_labels"></stringProp> <stringProp name="exclude_sample_labels"></stringProp> <stringProp name="start_offset"></stringProp> <stringProp name="end_offset"></stringProp> <boolProp name="include_checkbox_state">false</boolProp> <boolProp name="exclude_checkbox_state">false</boolProp> <collectionProp name="metricConnections"> <collectionProp name="-456574074"> <stringProp name="-1204607085">localhost</stringProp> <stringProp name="1600768">4444</stringProp> <stringProp name="66952">CPU</stringProp> <stringProp name="0"></stringProp> </collectionProp> </collectionProp> </kg.apc.jmeter.perfmon.PerfMonCollector> <hashTree/> </hashTree> <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Delete Test Environment" enabled="true"> <stringProp name="ThreadGroup.on_sample_error">continue</stringProp> <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> <boolProp name="LoopController.continue_forever">false</boolProp> <stringProp name="LoopController.loops">1</stringProp> </elementProp> <stringProp name="ThreadGroup.num_threads">1</stringProp> <stringProp name="ThreadGroup.ramp_time">1</stringProp> <longProp name="ThreadGroup.start_time">1457618474000</longProp> <longProp name="ThreadGroup.end_time">1457618474000</longProp> <boolProp name="ThreadGroup.scheduler">false</boolProp> <stringProp name="ThreadGroup.duration"></stringProp> <stringProp name="ThreadGroup.delay"></stringProp> </ThreadGroup> <hashTree> <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Delete Tests Folder" enabled="true"> <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> <collectionProp name="Arguments.arguments"/> </elementProp> <stringProp name="HTTPSampler.domain">${host}</stringProp> <stringProp name="HTTPSampler.port">${port}</stringProp> <stringProp name="HTTPSampler.connect_timeout"></stringProp> <stringProp name="HTTPSampler.response_timeout"></stringProp> <stringProp name="HTTPSampler.protocol">http</stringProp> <stringProp name="HTTPSampler.contentEncoding"></stringProp> <stringProp name="HTTPSampler.path">${prefix}/job/${testFolder}/doDelete</stringProp> <stringProp name="HTTPSampler.method">POST</stringProp> <boolProp name="HTTPSampler.follow_redirects">false</boolProp> <boolProp name="HTTPSampler.auto_redirects">false</boolProp> <boolProp name="HTTPSampler.use_keepalive">false</boolProp> <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> <stringProp name="HTTPSampler.implementation">HttpClient4</stringProp> <boolProp name="HTTPSampler.monitor">false</boolProp> <stringProp name="HTTPSampler.embedded_url_re"></stringProp> </HTTPSamplerProxy> <hashTree> <HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> <collectionProp name="HeaderManager.headers"> <elementProp name="" elementType="Header"> <stringProp name="Header.name">Content-Type</stringProp> <stringProp name="Header.value">application/x-www-form-urlencoded</stringProp> </elementProp> </collectionProp> </HeaderManager> <hashTree/> </hashTree> </hashTree> <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true"> <boolProp name="ResultCollector.error_logging">false</boolProp> <objProp> <name>saveConfig</name> <value class="SampleSaveConfiguration"> <time>true</time> <latency>true</latency> <timestamp>true</timestamp> <success>true</success> <label>true</label> <code>true</code> <message>true</message> <threadName>true</threadName> <dataType>true</dataType> <encoding>false</encoding> <assertions>true</assertions> <subresults>true</subresults> <responseData>false</responseData> <samplerData>false</samplerData> <xml>false</xml> <fieldNames>false</fieldNames> <responseHeaders>false</responseHeaders> <requestHeaders>false</requestHeaders> <responseDataOnError>false</responseDataOnError> <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage> <assertionsResultsToSave>0</assertionsResultsToSave> <bytes>true</bytes> <threadCounts>true</threadCounts> </value> </objProp> <stringProp name="filename"></stringProp> </ResultCollector> <hashTree/> <ResultCollector guiclass="TableVisualizer" testclass="ResultCollector" testname="View Results in Table" enabled="true"> <boolProp name="ResultCollector.error_logging">false</boolProp> <objProp> <name>saveConfig</name> <value class="SampleSaveConfiguration"> <time>true</time> <latency>true</latency> <timestamp>true</timestamp> <success>true</success> <label>true</label> <code>true</code> <message>true</message> <threadName>true</threadName> <dataType>true</dataType> <encoding>false</encoding> <assertions>true</assertions> <subresults>true</subresults> <responseData>false</responseData> <samplerData>false</samplerData> <xml>false</xml> <fieldNames>false</fieldNames> <responseHeaders>false</responseHeaders> <requestHeaders>false</requestHeaders> <responseDataOnError>false</responseDataOnError> <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage> <assertionsResultsToSave>0</assertionsResultsToSave> <bytes>true</bytes> <threadCounts>true</threadCounts> </value> </objProp> <stringProp name="filename"></stringProp> </ResultCollector> <hashTree/> <ResultCollector guiclass="ComparisonVisualizer" testclass="ResultCollector" testname="Comparison Assertion Visualizer" enabled="true"> <boolProp name="ResultCollector.error_logging">false</boolProp> <objProp> <name>saveConfig</name> <value class="SampleSaveConfiguration"> <time>true</time> <latency>true</latency> <timestamp>true</timestamp> <success>true</success> <label>true</label> <code>true</code> <message>true</message> <threadName>true</threadName> <dataType>true</dataType> <encoding>false</encoding> <assertions>true</assertions> <subresults>true</subresults> <responseData>false</responseData> <samplerData>false</samplerData> <xml>false</xml> <fieldNames>false</fieldNames> <responseHeaders>false</responseHeaders> <requestHeaders>false</requestHeaders> <responseDataOnError>false</responseDataOnError> <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage> <assertionsResultsToSave>0</assertionsResultsToSave> <bytes>true</bytes> <threadCounts>true</threadCounts> </value> </objProp> <stringProp name="filename"></stringProp> </ResultCollector> <hashTree/> <ResultCollector guiclass="StatVisualizer" testclass="ResultCollector" testname="Aggregate Report" enabled="true"> <boolProp name="ResultCollector.error_logging">false</boolProp> <objProp> <name>saveConfig</name> <value class="SampleSaveConfiguration"> <time>true</time> <latency>true</latency> <timestamp>true</timestamp> <success>true</success> <label>true</label> <code>true</code> <message>true</message> <threadName>true</threadName> <dataType>true</dataType> <encoding>false</encoding> <assertions>true</assertions> <subresults>true</subresults> <responseData>false</responseData> <samplerData>false</samplerData> <xml>false</xml> <fieldNames>false</fieldNames> <responseHeaders>false</responseHeaders> <requestHeaders>false</requestHeaders> <responseDataOnError>false</responseDataOnError> <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage> <assertionsResultsToSave>0</assertionsResultsToSave> <bytes>true</bytes> <threadCounts>true</threadCounts> </value> </objProp> <stringProp name="filename"></stringProp> </ResultCollector> <hashTree/> <ResultCollector guiclass="StatGraphVisualizer" testclass="ResultCollector" testname="Aggregate Graph" enabled="true"> <boolProp name="ResultCollector.error_logging">false</boolProp> <objProp> <name>saveConfig</name> <value class="SampleSaveConfiguration"> <time>true</time> <latency>true</latency> <timestamp>true</timestamp> <success>true</success> <label>true</label> <code>true</code> <message>true</message> <threadName>true</threadName> <dataType>true</dataType> <encoding>true</encoding> <assertions>true</assertions> <subresults>true</subresults> <responseData>true</responseData> <samplerData>true</samplerData> <xml>true</xml> <fieldNames>true</fieldNames> <responseHeaders>true</responseHeaders> <requestHeaders>true</requestHeaders> <responseDataOnError>false</responseDataOnError> <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage> <assertionsResultsToSave>0</assertionsResultsToSave> <bytes>true</bytes> <url>true</url> <fileName>true</fileName> <hostname>true</hostname> <threadCounts>true</threadCounts> <sampleCount>true</sampleCount> <idleTime>true</idleTime> <connectTime>true</connectTime> </value> </objProp> <stringProp name="filename"></stringProp> </ResultCollector> <hashTree/> <ResultCollector guiclass="DistributionGraphVisualizer" testclass="ResultCollector" testname="Distribution Graph (alpha)" enabled="true"> <boolProp name="ResultCollector.error_logging">false</boolProp> <objProp> <name>saveConfig</name> <value class="SampleSaveConfiguration"> <time>true</time> <latency>true</latency> <timestamp>true</timestamp> <success>true</success> <label>true</label> <code>true</code> <message>true</message> <threadName>true</threadName> <dataType>true</dataType> <encoding>false</encoding> <assertions>true</assertions> <subresults>true</subresults> <responseData>false</responseData> <samplerData>false</samplerData> <xml>false</xml> <fieldNames>false</fieldNames> <responseHeaders>false</responseHeaders> <requestHeaders>false</requestHeaders> <responseDataOnError>false</responseDataOnError> <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage> <assertionsResultsToSave>0</assertionsResultsToSave> <bytes>true</bytes> <threadCounts>true</threadCounts> </value> </objProp> <stringProp name="filename"></stringProp> </ResultCollector> <hashTree/> <ResultCollector guiclass="RespTimeGraphVisualizer" testclass="ResultCollector" testname="Response Time Graph" enabled="true"> <boolProp name="ResultCollector.error_logging">false</boolProp> <objProp> <name>saveConfig</name> <value class="SampleSaveConfiguration"> <time>true</time> <latency>true</latency> <timestamp>true</timestamp> <success>true</success> <label>true</label> <code>true</code> <message>true</message> <threadName>true</threadName> <dataType>true</dataType> <encoding>false</encoding> <assertions>true</assertions> <subresults>true</subresults> <responseData>false</responseData> <samplerData>false</samplerData> <xml>false</xml> <fieldNames>false</fieldNames> <responseHeaders>false</responseHeaders> <requestHeaders>false</requestHeaders> <responseDataOnError>false</responseDataOnError> <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage> <assertionsResultsToSave>0</assertionsResultsToSave> <bytes>true</bytes> <threadCounts>true</threadCounts> </value> </objProp> <stringProp name="filename"></stringProp> </ResultCollector> <hashTree/> <Summariser guiclass="SummariserGui" testclass="Summariser" testname="Generate Summary Results" enabled="true"/> <hashTree/> <ResultCollector guiclass="GraphVisualizer" testclass="ResultCollector" testname="Graph Results" enabled="true"> <boolProp name="ResultCollector.error_logging">false</boolProp> <objProp> <name>saveConfig</name> <value class="SampleSaveConfiguration"> <time>true</time> <latency>true</latency> <timestamp>true</timestamp> <success>true</success> <label>true</label> <code>true</code> <message>true</message> <threadName>true</threadName> <dataType>true</dataType> <encoding>false</encoding> <assertions>true</assertions> <subresults>true</subresults> <responseData>false</responseData> <samplerData>false</samplerData> <xml>false</xml> <fieldNames>false</fieldNames> <responseHeaders>false</responseHeaders> <requestHeaders>false</requestHeaders> <responseDataOnError>false</responseDataOnError> <saveAssertionResultsFailureMessage>false</saveAssertionResultsFailureMessage> <assertionsResultsToSave>0</assertionsResultsToSave> <bytes>true</bytes> <threadCounts>true</threadCounts> </value> </objProp> <stringProp name="filename"></stringProp> </ResultCollector> <hashTree/> <Arguments guiclass="ArgumentsPanel" testclass="Arguments" testname="Variables" enabled="true"> <collectionProp name="Arguments.arguments"> <elementProp name="count" elementType="Argument"> <stringProp name="Argument.name">count</stringProp> <stringProp name="Argument.value">1</stringProp> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.desc">Default counter start value</stringProp> </elementProp> <elementProp name="host" elementType="Argument"> <stringProp name="Argument.name">host</stringProp> <stringProp name="Argument.value">MyJenkinsMasterURL</stringProp> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.desc">Jenkins host name or ip address</stringProp> </elementProp> <elementProp name="port" elementType="Argument"> <stringProp name="Argument.name">port</stringProp> <stringProp name="Argument.value">8080</stringProp> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.desc">Default jenkins port</stringProp> </elementProp> <elementProp name="prefix" elementType="Argument"> <stringProp name="Argument.name">prefix</stringProp> <stringProp name="Argument.value"></stringProp> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.desc">In case you use a /jenkins prefix</stringProp> </elementProp> <elementProp name="threads" elementType="Argument"> <stringProp name="Argument.name">threads</stringProp> <stringProp name="Argument.value">30</stringProp> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.desc">Nuber of user threads</stringProp> </elementProp> <elementProp name="passes" elementType="Argument"> <stringProp name="Argument.name">passes</stringProp> <stringProp name="Argument.value">30</stringProp> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.desc">Number of time to loop through the tests</stringProp> </elementProp> <elementProp name="countMax" elementType="Argument"> <stringProp name="Argument.name">countMax</stringProp> <stringProp name="Argument.value">1000</stringProp> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.desc">Number of jobs to create (counter)</stringProp> </elementProp> <elementProp name="testFolder" elementType="Argument"> <stringProp name="Argument.name">testFolder</stringProp> <stringProp name="Argument.value">tests</stringProp> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.desc">Name of folder that test jobs will go in</stringProp> </elementProp> <elementProp name="testName" elementType="Argument"> <stringProp name="Argument.name">testName</stringProp> <stringProp name="Argument.value">foobar</stringProp> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.desc">Name of test jobs</stringProp> </elementProp> <elementProp name="throughput" elementType="Argument"> <stringProp name="Argument.name">throughput</stringProp> <stringProp name="Argument.value">2000</stringProp> <stringProp name="Argument.metadata">=</stringProp> <stringProp name="Argument.desc">Target throughput (in samples per minute)</stringProp> </elementProp> </collectionProp> </Arguments> <hashTree/> <CookieManager guiclass="CookiePanel" testclass="CookieManager" testname="HTTP Cookie Manager" enabled="true"> <collectionProp name="CookieManager.cookies"/> <boolProp name="CookieManager.clearEachIteration">true</boolProp> <stringProp name="CookieManager.policy">default</stringProp> </CookieManager> <hashTree/> <CacheManager guiclass="CacheManagerGui" testclass="CacheManager" testname="HTTP Cache Manager" enabled="true"> <boolProp name="clearEachIteration">true</boolProp> <boolProp name="useExpires">true</boolProp> </CacheManager> <hashTree/> <DNSCacheManager guiclass="DNSCachePanel" testclass="DNSCacheManager" testname="DNS Cache Manager" enabled="true"> <collectionProp name="DNSCacheManager.servers"/> <boolProp name="DNSCacheManager.clearEachIteration">true</boolProp> <boolProp name="DNSCacheManager.isCustomResolver">false</boolProp> </DNSCacheManager> <hashTree/> <ConfigTestElement guiclass="HttpDefaultsGui" testclass="ConfigTestElement" testname="HTTP Request Defaults" enabled="true"> <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> <collectionProp name="Arguments.arguments"/> </elementProp> <stringProp name="HTTPSampler.domain">${host}</stringProp> <stringProp name="HTTPSampler.port">${port}</stringProp> <stringProp name="HTTPSampler.connect_timeout"></stringProp> <stringProp name="HTTPSampler.response_timeout"></stringProp> <stringProp name="HTTPSampler.protocol">http</stringProp> <stringProp name="HTTPSampler.contentEncoding"></stringProp> <stringProp name="HTTPSampler.path">${prefix}</stringProp> <stringProp name="HTTPSampler.implementation">HttpClient4</stringProp> <stringProp name="HTTPSampler.concurrentPool">4</stringProp> </ConfigTestElement> <hashTree/> <kg.apc.jmeter.perfmon.PerfMonCollector guiclass="kg.apc.jmeter.vizualizers.PerfMonGui" testclass="kg.apc.jmeter.perfmon.PerfMonCollector" testname="jp@gc - PerfMon Metrics Collector" enabled="true"> <boolProp name="ResultCollector.error_logging">false</boolProp> <objProp> <name>saveConfig</name> <value class="SampleSaveConfiguration"> <time>true</time> <latency>true</latency> <timestamp>true</timestamp> <success>true</success> <label>true</label> <code>true</code> <message>true</message> <threadName>true</threadName> <dataType>true</dataType> <encoding>false</encoding> <assertions>true</assertions> <subresults>true</subresults> <responseData>false</responseData> <samplerData>false</samplerData> <xml>false</xml> <fieldNames>true</fieldNames> <responseHeaders>false</responseHeaders> <requestHeaders>false</requestHeaders> <responseDataOnError>false</responseDataOnError> <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage> <assertionsResultsToSave>0</assertionsResultsToSave> <bytes>true</bytes> <threadCounts>true</threadCounts> <idleTime>true</idleTime> </value> </objProp> <stringProp name="filename"></stringProp> <longProp name="interval_grouping">1000</longProp> <boolProp name="graph_aggregated">false</boolProp> <stringProp name="include_sample_labels"></stringProp> <stringProp name="exclude_sample_labels"></stringProp> <stringProp name="start_offset"></stringProp> <stringProp name="end_offset"></stringProp> <boolProp name="include_checkbox_state">false</boolProp> <boolProp name="exclude_checkbox_state">false</boolProp> <collectionProp name="metricConnections"> <collectionProp name="-456574074"> <stringProp name="-1204607085">localhost</stringProp> <stringProp name="1600768">4444</stringProp> <stringProp name="66952">CPU</stringProp> <stringProp name="0"></stringProp> </collectionProp> </collectionProp> </kg.apc.jmeter.perfmon.PerfMonCollector> <hashTree/> </hashTree> </hashTree> </jmeterTestPlan>