From 58f4361d8e54f8b3da61513b9e04c0a1d43ecae2 Mon Sep 17 00:00:00 2001 From: Saurabh Mhaske Date: Thu, 31 Jul 2025 00:11:25 +0530 Subject: [PATCH] InfluxDB Backend Listener: Limited error information and missing assertion failure details Fix --- .../visualizers/backend/ErrorMetric.java | 13 ++++++++--- .../visualizers/backend/SamplerMetric.java | 23 +++++++++++++++++-- .../apache/jmeter/samplers/SampleResult.java | 9 +++++--- .../apache/jmeter/save/CSVSaveService.java | 2 +- 4 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/components/src/main/java/org/apache/jmeter/visualizers/backend/ErrorMetric.java b/src/components/src/main/java/org/apache/jmeter/visualizers/backend/ErrorMetric.java index 3ccf49f4c53..dac72c485cd 100644 --- a/src/components/src/main/java/org/apache/jmeter/visualizers/backend/ErrorMetric.java +++ b/src/components/src/main/java/org/apache/jmeter/visualizers/backend/ErrorMetric.java @@ -19,7 +19,9 @@ import java.util.Locale; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.jmeter.assertions.AssertionResult; import org.apache.jmeter.report.utils.MetricUtils; import org.apache.jmeter.samplers.SampleResult; @@ -45,15 +47,20 @@ public ErrorMetric() { public ErrorMetric(SampleResult result) { if (MetricUtils.isSuccessCode(responseCode) || (StringUtils.isEmpty(responseCode) && - !StringUtils.isEmpty(result.getFirstAssertionFailureMessage()))) { - responseCode = MetricUtils.ASSERTION_FAILED; - responseMessage = result.getFirstAssertionFailureMessage(); + !StringUtils.isEmpty(result.getFirstAssertionFailureMessage().getLeft()))) { + responseCode = result.getFirstAssertionFailureMessage().getLeft(); + responseMessage = result.getFirstAssertionFailureMessage().getRight(); } else { responseCode = result.getResponseCode(); responseMessage = result.getResponseMessage(); } } + public ErrorMetric(AssertionResult assertionResult) { + responseCode = ObjectUtils.isNotEmpty(assertionResult.getName()) ? assertionResult.getName() : ""; + responseMessage = ObjectUtils.isNotEmpty(assertionResult.getFailureMessage()) ? assertionResult.getFailureMessage() : ""; + } + /** * @return the response code , '0' if the code is empty */ diff --git a/src/components/src/main/java/org/apache/jmeter/visualizers/backend/SamplerMetric.java b/src/components/src/main/java/org/apache/jmeter/visualizers/backend/SamplerMetric.java index 7e3149cb749..bf4fb12f6eb 100644 --- a/src/components/src/main/java/org/apache/jmeter/visualizers/backend/SamplerMetric.java +++ b/src/components/src/main/java/org/apache/jmeter/visualizers/backend/SamplerMetric.java @@ -22,7 +22,9 @@ import java.util.List; import java.util.Map; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics; +import org.apache.jmeter.assertions.AssertionResult; import org.apache.jmeter.control.TransactionController; import org.apache.jmeter.report.processor.DescriptiveStatisticsFactory; import org.apache.jmeter.samplers.SampleResult; @@ -123,8 +125,25 @@ private synchronized void add(SampleResult result, boolean isCumulated) { successes+=result.getSampleCount()-result.getErrorCount(); } else { failures+=result.getErrorCount(); - ErrorMetric error = new ErrorMetric(result); - errors.put(error, errors.getOrDefault(error, 0) + result.getErrorCount() ); + // Check if there are assertion failures + AssertionResult[] assertionResults = result.getAssertionResults(); + boolean hasAssertionFailures = false; + // Process all failed assertions + if (ObjectUtils.isNotEmpty(assertionResults)) { + for (AssertionResult assertionResult : assertionResults) { + if (assertionResult.isFailure() || assertionResult.isError()) { + hasAssertionFailures = true; + // Create ErrorMetric for each failed assertion + ErrorMetric error = new ErrorMetric(assertionResult); + errors.put(error, errors.getOrDefault(error, 0) + 1); + } + } + } + // If no assertion failures, create ErrorMetric based on response code/message + if (!hasAssertionFailures) { + ErrorMetric error = new ErrorMetric(result); + errors.put(error, errors.getOrDefault(error, 0) + result.getErrorCount()); + } } long time = result.getTime(); allResponsesStats.addValue((double) time); diff --git a/src/core/src/main/java/org/apache/jmeter/samplers/SampleResult.java b/src/core/src/main/java/org/apache/jmeter/samplers/SampleResult.java index 66589162432..58afda0b418 100644 --- a/src/core/src/main/java/org/apache/jmeter/samplers/SampleResult.java +++ b/src/core/src/main/java/org/apache/jmeter/samplers/SampleResult.java @@ -29,6 +29,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; +import org.apache.commons.lang3.tuple.Pair; import org.apache.jmeter.assertions.AssertionResult; import org.apache.jmeter.gui.Searchable; import org.apache.jmeter.testelement.TestPlan; @@ -1636,20 +1637,22 @@ public void setIgnore() { /** * @return String first non null assertion failure message if assertionResults is not null, null otherwise */ - public String getFirstAssertionFailureMessage() { + public Pair getFirstAssertionFailureMessage() { + String code = null; String message = null; AssertionResult[] results = getAssertionResults(); if (results != null) { // Find the first non-null message for (AssertionResult result : results) { + code = result.getName(); message = result.getFailureMessage(); - if (message != null) { + if (code != null && message != null) { break; } } } - return message; + return Pair.of(code, message); } /** diff --git a/src/core/src/main/java/org/apache/jmeter/save/CSVSaveService.java b/src/core/src/main/java/org/apache/jmeter/save/CSVSaveService.java index adece7104fe..08f8f5bd050 100644 --- a/src/core/src/main/java/org/apache/jmeter/save/CSVSaveService.java +++ b/src/core/src/main/java/org/apache/jmeter/save/CSVSaveService.java @@ -888,7 +888,7 @@ public static String resultToDelimitedString(SampleEvent event, } if (saveConfig.saveAssertionResultsFailureMessage()) { - String message = sample.getFirstAssertionFailureMessage(); + String message = sample.getFirstAssertionFailureMessage().getRight(); if (message != null) { text.append(message); } else {