/** * Parses list of samplers. * * @param context * {@link BackendListenerContext}. */ private void parseSamplers(BackendListenerContext context) { samplersList = context.getParameter(KEY_SAMPLERS_LIST, ""); samplersToFilter = new HashSet<String>(); if (context.getBooleanParameter(KEY_USE_REGEX_FOR_SAMPLER_LIST, false)) { regexForSamplerList = samplersList; } else { regexForSamplerList = null; String[] samplers = samplersList.split(SEPARATOR); samplersToFilter = new HashSet<String>(); for (String samplerName : samplers) { samplersToFilter.add(samplerName); } } }
/** * Methods that add all custom fields added by the user in the Backend Listener's GUI panel * * @param context BackendListenerContext */ private void addCustomFields(BackendListenerContext context) { Iterator<String> pluginParameters = context.getParameterNamesIterator(); while(pluginParameters.hasNext()) { String parameterName = pluginParameters.next(); if(!parameterName.contains("es.") && !context.getParameter(parameterName).trim().equals("")) { String parameter = context.getParameter(parameterName).trim(); try { this.json.put(parameterName, Long.parseLong(parameter)); } catch(Exception e) { if(logger.isDebugEnabled()) logger.debug("Cannot convert custom field to number"); this.json.put(parameterName, context.getParameter(parameterName).trim()); } } } }
@Override public void setupTest(BackendListenerContext context) throws Exception { String graphiteMetricsSenderClass = context.getParameter(GRAPHITE_METRICS_SENDER); graphiteHost = context.getParameter(GRAPHITE_HOST); graphitePort = context.getIntParameter(GRAPHITE_PORT, DEFAULT_PLAINTEXT_PROTOCOL_PORT); summaryOnly = context.getBooleanParameter(SUMMARY_ONLY, true); samplersList = context.getParameter(SAMPLERS_LIST, ""); useRegexpForSamplersList = context.getBooleanParameter(USE_REGEXP_FOR_SAMPLERS_LIST, false); rootMetricsPrefix = context.getParameter(ROOT_METRICS_PREFIX, DEFAULT_METRICS_PREFIX); String[] percentilesStringArray = context.getParameter(PERCENTILES, DEFAULT_METRICS_PREFIX).split(SEPARATOR); okPercentiles = new HashMap<>(percentilesStringArray.length); koPercentiles = new HashMap<>(percentilesStringArray.length);
@Override public void setupTest(BackendListenerContext context) throws Exception { String influxdbMetricsSender = context.getParameter("influxdbMetricsSender"); String influxdbUrl = context.getParameter("influxdbUrl"); summaryOnly = context.getBooleanParameter("summaryOnly", false); samplersRegex = context.getParameter("samplersRegex", ""); application = AbstractInfluxdbMetricsSender.tagToStringValue(context.getParameter("application", "")); measurement = AbstractInfluxdbMetricsSender .tagToStringValue(context.getParameter("measurement", DEFAULT_MEASUREMENT)); testTitle = context.getParameter("testTitle", "Test"); testTags = AbstractInfluxdbMetricsSender.tagToStringValue(context.getParameter("eventTags", "")); String percentilesAsString = context.getParameter("percentiles", ""); String[] percentilesStringArray = percentilesAsString.split(SEPARATOR); okPercentiles = new HashMap<>(percentilesStringArray.length); context.getParameterNamesIterator().forEachRemaining(name -> { if (StringUtils.isNotBlank(name) && !DEFAULT_ARGS.containsKey(name.trim()) && name.startsWith("TAG_") && StringUtils.isNotBlank(context.getParameter(name))) { final String tagName = name.trim().substring(4); final String tagValue = context.getParameter(name).trim(); userTagBuilder.append(',') .append(AbstractInfluxdbMetricsSender
/** * Get the value of a specific parameter as a String, or null if the value * was not specified. * * @param name * the name of the parameter whose value should be retrieved * @return the value of the parameter, or null if the value was not * specified */ public String getParameter(String name) { return getParameter(name, null); }
public InfluxDBConfig(BackendListenerContext context) { String influxDBHost = context.getParameter(KEY_INFLUX_DB_HOST); if (StringUtils.isEmpty(influxDBHost)) { throw new IllegalArgumentException(KEY_INFLUX_DB_HOST + "must not be empty!"); } setInfluxDBHost(influxDBHost); int influxDBPort = context.getIntParameter(KEY_INFLUX_DB_PORT, InfluxDBConfig.DEFAULT_PORT); setInfluxDBPort(influxDBPort); String influxUser = context.getParameter(KEY_INFLUX_DB_USER); setInfluxUser(influxUser); String influxPassword = context.getParameter(KEY_INFLUX_DB_PASSWORD); setInfluxPassword(influxPassword); String influxDatabase = context.getParameter(KEY_INFLUX_DB_DATABASE); if (StringUtils.isEmpty(influxDatabase)) { throw new IllegalArgumentException(KEY_INFLUX_DB_DATABASE + "must not be empty!"); } setInfluxDatabase(influxDatabase); String influxRetentionPolicy = context.getParameter(KEY_RETENTION_POLICY, DEFAULT_RETENTION_POLICY); if (StringUtils.isEmpty(influxRetentionPolicy)) { influxRetentionPolicy = DEFAULT_RETENTION_POLICY; } setInfluxRetentionPolicy(influxRetentionPolicy); String influxHTTPScheme = context.getParameter(KEY_HTTP_SCHEME, DEFAULT_HTTP_SCHEME); if (StringUtils.isEmpty(influxHTTPScheme)) { influxHTTPScheme = DEFAULT_HTTP_SCHEME; } // TODO: no checks but should be only "http" and "https" setInfluxHTTPScheme(influxHTTPScheme); }
private Worker(BackendListenerClient backendListenerClient, Arguments arguments, ListenerClientData listenerClientData){ this.listenerClientData = listenerClientData; // Allow BackendListenerClient implementations to get access to test element name arguments.addArgument(TestElement.NAME, getName()); context = new BackendListenerContext(arguments); this.backendListenerClient = backendListenerClient; }
private void init(BackendListenerContext context) { token = context.getParameter(LoadosophiaUploader.UPLOAD_TOKEN); project = context.getParameter(LoadosophiaUploader.PROJECT); color = context.getParameter(LoadosophiaUploader.COLOR); title = context.getParameter(LoadosophiaUploader.TITLE); fileName = context.getParameter(LoadosophiaUploader.FILE_NAME); isOnlineInitiated = Boolean.parseBoolean(context.getParameter(LoadosophiaUploader.USE_ONLINE)); }
BackendListenerContext context = new BackendListenerContext(getArguments()); listenerClientData.client.teardownTest(context); } catch (Exception e) {
/** * Parses list of samplers. * * @param context * {@link BackendListenerContext}. */ private void parseSamplers(BackendListenerContext context) { samplersList = context.getParameter(KEY_SAMPLERS_LIST, ""); samplersToFilter = new HashSet<String>(); if (context.getBooleanParameter(KEY_USE_REGEX_FOR_SAMPLER_LIST, false)) { regexForSamplerList = samplersList; } else { regexForSamplerList = null; String[] samplers = samplersList.split(SEPARATOR); samplersToFilter = new HashSet<String>(); for (String samplerName : samplers) { samplersToFilter.add(samplerName); } } }
private void init(BackendListenerContext context) { report = new BlazeMeterReport(); report.setShareTest(Boolean.valueOf(context.getParameter(BlazeMeterUploader.SHARE_TEST))); report.setProject(context.getParameter(BlazeMeterUploader.PROJECT)); report.setTitle(context.getParameter(BlazeMeterUploader.TITLE)); report.setToken(context.getParameter(BlazeMeterUploader.UPLOAD_TOKEN)); }
@Override public void sampleOccurred(SampleEvent event) { Arguments args = getArguments(); BackendListenerContext context = new BackendListenerContext(args); SampleResult sr = listenerClientData.client.createSampleResult(context, event.getResult()); if(sr == null) { if (log.isDebugEnabled()) { log.debug("{} => Dropping SampleResult: {}", getName(), event.getResult()); } return; } try { if (!listenerClientData.queue.offer(sr)){ // we failed to add the element first time listenerClientData.queueWaits.add(1L); long t1 = System.nanoTime(); listenerClientData.queue.put(sr); long t2 = System.nanoTime(); listenerClientData.queueWaitTime.add(t2-t1); } } catch (Exception err) { log.error("sampleOccurred, failed to queue the sample", err); } }
@Override public void handleSampleResults(List<SampleResult> results, BackendListenerContext context) { for(SampleResult sr : results) { ElasticSearchMetric metric = new ElasticSearchMetric(sr, context.getParameter(ES_TEST_MODE), context.getParameter(ES_TIMESTAMP), this.buildNumber, context.getBooleanParameter(ES_PARSE_REQ_HEADERS, false), context.getBooleanParameter(ES_PARSE_RES_HEADERS, false)); if(validateSample(context, sr)) { try { this.sender.addToList(new Gson().toJson(metric.getMetric(context))); } catch (Exception e) { logger.error("The ElasticSearch Backend Listener was unable to a sampler to the list of samplers to send... More info in JMeter's console."); e.printStackTrace(); } } } if(this.sender.getListSize() >= this.bulkSize) { try { this.sender.sendRequest(); } catch (Exception e) { logger.error("Error occured while sending bulk request.", e); } finally { this.sender.clearList(); } } }
/** * This method will validate the current sample to see if it is part of the filters or not. * @param context The Backend Listener's context * @param sr The current SampleResult * @return true or false depending on whether or not the sample is valid */ private boolean validateSample(BackendListenerContext context, SampleResult sr) { boolean valid = true; String sampleLabel = sr.getSampleLabel().toLowerCase().trim(); if(this.filters.size() > 0) { for(String filter : filters) { if(sampleLabel.contains(filter)) { valid = true; break; } else { valid = false; } } } // if sample is successful but test mode is "error" only if (sr.isSuccessful() && context.getParameter(ES_TEST_MODE).trim().equalsIgnoreCase("error") && valid) { valid = false; } return valid; } }
BackendListenerContext context = new BackendListenerContext((Arguments)getArguments().clone());
this.filters = new HashSet<>(); this.modes = new HashSet<>(Arrays.asList("info","debug","error","quiet")); this.bulkSize = Integer.parseInt(context.getParameter(ES_BULK_SIZE)); this.timeoutMs = JMeterUtils.getPropDefault(ES_TIMEOUT_MS, DEFAULT_TIMEOUT_MS); this.buildNumber = (JMeterUtils.getProperty(ElasticsearchBackendClient.BUILD_NUMBER) != null && !JMeterUtils.getProperty(ElasticsearchBackendClient.BUILD_NUMBER).trim().equals("")) ? Integer.parseInt(JMeterUtils.getProperty(ElasticsearchBackendClient.BUILD_NUMBER)) : 0; RestClient client = RestClient.builder(new HttpHost(context.getParameter(ES_HOST), Integer.parseInt(context.getParameter(ES_PORT)), context.getParameter(ES_SCHEME))) .setRequestConfigCallback(requestConfigBuilder -> requestConfigBuilder.setConnectTimeout(5000) .setSocketTimeout((int) timeoutMs)) .build(); this.sender = new ElasticSearchMetricSender(client, context.getParameter(ES_INDEX).toLowerCase() ,context.getParameter(ES_AUTH_USER), context.getParameter(ES_AUTH_PWD)); this.sender.createIndex(); checkTestMode(context.getParameter(ES_TEST_MODE)); String[] filterArray = (context.getParameter(ES_SAMPLE_FILTER).contains(";")) ? context.getParameter(ES_SAMPLE_FILTER).split(";") : new String[] {context.getParameter(ES_SAMPLE_FILTER)}; if(filterArray.length > 0 && !filterArray[0].trim().equals("")) { for (String filter : filterArray) {
@Override public void setupTest(BackendListenerContext context) throws Exception { testName = context.getParameter(KEY_TEST_NAME, "Test"); File exportFile = new File(context.getParameter(KEY_FILE_PATH, "influxDBExport.txt")); if (exportFile.getParentFile() != null && !exportFile.getParentFile().exists()) { exportFile.getParentFile().mkdirs(); } if (exportFile.exists()) { exportFile.delete(); boolean created = exportFile.createNewFile(); if (!created) { throw new RuntimeException("Export file could not be created!"); } } exportFileWriter = new BufferedWriter(new FileWriter(exportFile)); Point startPoint = Point.measurement(TestStartEndMeasurement.MEASUREMENT_NAME).time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) .tag(TestStartEndMeasurement.Tags.TYPE, TestStartEndMeasurement.Values.STARTED).tag(TestStartEndMeasurement.Tags.TEST_NAME, testName).build(); exportFileWriter.append(startPoint.lineProtocol()); exportFileWriter.newLine(); parseSamplers(context); scheduler = Executors.newScheduledThreadPool(1); scheduler.scheduleAtFixedRate(this, 1, 1, TimeUnit.SECONDS); }
@Override public void setupTest(BackendListenerContext context) throws Exception { testName = context.getParameter(KEY_TEST_NAME, "Test"); runId = context.getParameter(KEY_RUN_ID,"R001"); //Will be used to compare performance of R001, R002, etc of 'Test' randomNumberGenerator = new Random(); nodeName = context.getParameter(KEY_NODE_NAME, "Test-Node"); setupInfluxClient(context); influxDB.write( influxDBConfig.getInfluxDatabase(), influxDBConfig.getInfluxRetentionPolicy(), Point.measurement(TestStartEndMeasurement.MEASUREMENT_NAME).time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) .tag(TestStartEndMeasurement.Tags.TYPE, TestStartEndMeasurement.Values.STARTED) .tag(TestStartEndMeasurement.Tags.NODE_NAME, nodeName) .tag(TestStartEndMeasurement.Tags.TEST_NAME, testName) .addField(TestStartEndMeasurement.Fields.PLACEHOLDER, "1") .build()); parseSamplers(context); scheduler = Executors.newScheduledThreadPool(1); scheduler.scheduleAtFixedRate(this, 1, 1, TimeUnit.SECONDS); // Indicates whether to write sub sample records to the database recordSubSamples = Boolean.parseBoolean(context.getParameter(KEY_RECORD_SUB_SAMPLES, "false")); }