smicyk / groovy-jmeter

A Groovy-based DSL for building and running JMeter test plans from command line and more.
Apache License 2.0
13 stars 1 forks source link

Another InfluxDb BackendListener #112

Closed AntonioSun closed 1 year ago

AntonioSun commented 1 year ago

Hi @smicyk,

I'm switching to another InfluxDb Backend Listener, which is of class rocks.nt.apm.jmeter.JMeterInfluxDBBackendListenerClient

I first try follow the https://github.com/smicyk/groovy-jmeter/blob/develop/examples/plugins/datadog/script.groovy but got:

WARNING: Could not find match for name 'rocks.nt.apm.jmeter.JMeterInfluxDBBackendListenerClient'
Caught: net.simonix.dsl.jmeter.model.ValidationException: The keyword 'rocks.nt.apm.jmeter.JMeterInfluxDBBackendListenerClient' is not valid. Did you misspell any of valid keywords [execute_if, argument, before, jsrpreprocessor, csv, simple, section, execute_total, uniform_timer, jsrsampler, jsrassertion, authorization, execute_random, assert_duration, view, assert_jmes, loop, host, throughput, jsrlistener, jdbc_request, plan, flow, group, jsrpostprocessor, extract_json, cache, cookie, check_request, dns, execute_percent, execute, poisson_timer, execute_order, java_request, execute_interleave, execute_once, execute_runtime, defaults, http, header, extract_regex, check_size, assert_md5hex, authorizations, for_each, insert, constant_timer, jdbc, gaussian_timer, login, check_response, cookies, aggregate, timer, random, extract_xpath, precise_throughput, jsrtimer, backend, after, graphql, constant_throughput, assert_json, jdbc_config, summary, include, headers, variables, debug, ajp, assert_response, assert_xpath, extract_jmes, counter, extract_css, jdbc_preprocessor, schedule, execute_while, synchronizing_timer, jdbc_postprocessor, execute_switch, variable, assert_size, debug_postprocessor, arguments, transaction]?

I then try follow the https://github.com/smicyk/groovy-jmeter/blob/develop/examples/standalone/script.groovy

Generating .jmx succeeded, but I got this: image

Would you support this new InfluxDb Backend Listener please?

The desired xml output is:

      <BackendListener guiclass="BackendListenerGui" testclass="BackendListener" testname="Backend Listener" enabled="true">
        <elementProp name="arguments" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" enabled="true">
          <collectionProp name="Arguments.arguments">
            <elementProp name="testName" elementType="Argument">
              <stringProp name="Argument.name">testName</stringProp>
              <stringProp name="Argument.value">${c_cfg_TestName}</stringProp>
              <stringProp name="Argument.metadata">=</stringProp>
            </elementProp>
            <elementProp name="nodeName" elementType="Argument">
              <stringProp name="Argument.name">nodeName</stringProp>
              <stringProp name="Argument.value">${TestDesc}</stringProp>
              <stringProp name="Argument.metadata">=</stringProp>
            </elementProp>
            <elementProp name="runId" elementType="Argument">
              <stringProp name="Argument.name">runId</stringProp>
              <stringProp name="Argument.value">${runId}</stringProp>
              <stringProp name="Argument.metadata">=</stringProp>
            </elementProp>
            <elementProp name="influxDBHost" elementType="Argument">
              <stringProp name="Argument.name">influxDBHost</stringProp>
              <stringProp name="Argument.value">xyz</stringProp>
              <stringProp name="Argument.metadata">=</stringProp>
            </elementProp>
            <elementProp name="influxDBPort" elementType="Argument">
              <stringProp name="Argument.name">influxDBPort</stringProp>
              <stringProp name="Argument.value">8086</stringProp>
              <stringProp name="Argument.metadata">=</stringProp>
            </elementProp>
            <elementProp name="influxDBUser" elementType="Argument">
              <stringProp name="Argument.name">influxDBUser</stringProp>
              <stringProp name="Argument.value">jmeter</stringProp>
              <stringProp name="Argument.metadata">=</stringProp>
            </elementProp>
            <elementProp name="influxDBPassword" elementType="Argument">
              <stringProp name="Argument.name">influxDBPassword</stringProp>
              <stringProp name="Argument.value">PW</stringProp>
              <stringProp name="Argument.metadata">=</stringProp>
            </elementProp>
            <elementProp name="influxDBDatabase" elementType="Argument">
              <stringProp name="Argument.name">influxDBDatabase</stringProp>
              <stringProp name="Argument.value">jmeter</stringProp>
              <stringProp name="Argument.metadata">=</stringProp>
            </elementProp>
            <elementProp name="retentionPolicy" elementType="Argument">
              <stringProp name="Argument.name">retentionPolicy</stringProp>
              <stringProp name="Argument.value">autogen</stringProp>
              <stringProp name="Argument.metadata">=</stringProp>
            </elementProp>
            <elementProp name="samplersList" elementType="Argument">
              <stringProp name="Argument.name">samplersList</stringProp>
              <stringProp name="Argument.value">abc.*</stringProp>
              <stringProp name="Argument.metadata">=</stringProp>
            </elementProp>
            <elementProp name="useRegexForSamplerList" elementType="Argument">
              <stringProp name="Argument.name">useRegexForSamplerList</stringProp>
              <stringProp name="Argument.value">true</stringProp>
              <stringProp name="Argument.metadata">=</stringProp>
            </elementProp>
            <elementProp name="recordSubSamples" elementType="Argument">
              <stringProp name="Argument.name">recordSubSamples</stringProp>
              <stringProp name="Argument.name">recordSubSamples</stringProp>
              <stringProp name="Argument.value">true</stringProp>
              <stringProp name="Argument.metadata">=</stringProp>
            </elementProp>
          </collectionProp>
        </elementProp>
        <stringProp name="classname">rocks.nt.apm.jmeter.JMeterInfluxDBBackendListenerClient</stringProp>
      </BackendListener>

Changes need from the org.apache.jmeter.visualizers.backend.influxdb.InfluxdbBackendListenerClient is posted at https://www.diffchecker.com/NZbFVuXT

Thanks

AntonioSun commented 1 year ago

two different types of inputs, to save you from typing:

datadog way:

@GrabConfig(systemClassLoader = true)
@Grab('net.simonix.scripts:groovy-jmeter')

@groovy.transform.BaseScript net.simonix.dsl.jmeter.TestScript script

start {
  plan {

    backend classname: 'rocks.nt.apm.jmeter.JMeterInfluxDBBackendListenerClient' {
      arguments {
        argument(name: 'testName', value: '${c_cfg_TestName}')
        argument(name: 'nodeName', value: '${TestDesc}')
        argument(name: 'runId', value: '${runId}')
        argument(name: 'influxDBHost', value: 'xyz')
        argument(name: 'influxDBPort', value: '8086')
        argument(name: 'influxDBUser', value: 'jmeter')
        argument(name: 'influxDBPassword', value: 'PW')
        argument(name: 'influxDBDatabase', value: 'jmeter')
        argument(name: 'retentionPolicy', value: 'autogen')
        argument(name: 'samplersList', value: 'abc.*')
        argument(name: 'useRegexForSamplerList', value: 'true')
        argument(name: 'recordSubSamples', value: 'recordSubSamples')
       }
    }

    view () // View Result Tree
  }
}

Original way:

start {
  plan {

    backend(name: 'InfluxDb Backend', enabled: true) {
      arguments {
        argument(name: 'influxdbMetricsSender', value: 'rocks.nt.apm.jmeter.JMeterInfluxDBBackendListenerClient')
        argument(name: 'testName', value: '${c_cfg_TestName}')
        argument(name: 'nodeName', value: '${TestDesc}')
        argument(name: 'runId', value: '${runId}')
        argument(name: 'influxDBHost', value: 'xyz')
        argument(name: 'influxDBPort', value: '8086')
        argument(name: 'influxDBUser', value: 'jmeter')
        argument(name: 'influxDBPassword', value: 'PW')
        argument(name: 'influxDBDatabase', value: 'jmeter')
        argument(name: 'retentionPolicy', value: 'autogen')
        argument(name: 'samplersList', value: 'abc.*')
        argument(name: 'useRegexForSamplerList', value: 'true')
        argument(name: 'recordSubSamples', value: 'recordSubSamples')
       }
    }

    view () // View Result Tree
  }
}
smicyk commented 1 year ago

Sure, I will look into this.

smicyk commented 1 year ago

Hi, I think your original script had one error. It was missing comma after classname: 'rocks.nt.apm.jmeter.JMeterInfluxDBBackendListenerClient'. Below you can find the correct version.

Please, remember that when you execute the script you need to add the plugin jar to the classpath e.g.

groovy -cp JMeter-InfluxDB-Writer-plugin-1.2.jar script.groovy

Remember to add any parameters required by the script at the end of the command line.

@GrabConfig(systemClassLoader = true)
@Grab('net.simonix.scripts:groovy-jmeter')

@groovy.transform.BaseScript net.simonix.dsl.jmeter.TestScript script

start {
  plan {

    backend classname: 'rocks.nt.apm.jmeter.JMeterInfluxDBBackendListenerClient', {
      arguments {
        argument(name: 'testName', value: '${c_cfg_TestName}')
        argument(name: 'nodeName', value: '${TestDesc}')
        argument(name: 'runId', value: '${runId}')
        argument(name: 'influxDBHost', value: 'xyz')
        argument(name: 'influxDBPort', value: '8086')
        argument(name: 'influxDBUser', value: 'jmeter')
        argument(name: 'influxDBPassword', value: 'PW')
        argument(name: 'influxDBDatabase', value: 'jmeter')
        argument(name: 'retentionPolicy', value: 'autogen')
        argument(name: 'samplersList', value: 'abc.*')
        argument(name: 'useRegexForSamplerList', value: 'true')
        argument(name: 'recordSubSamples', value: 'recordSubSamples')
       }
    }

    view () // View Result Tree
  }
}
AntonioSun commented 1 year ago

Please, remember that when you execute the script you need to add the plugin jar to the classpath

Ah. THX! I got it working per your instructions. Thanks!

AntonioSun commented 1 year ago

Please, remember that when you execute the script you need to add the plugin jar to the classpath

Just to be 100% clear, it is necessary when executing the script, but unnecessary when generating the .jmx script file.