Skip to content

Commit 76fd519

Browse files
committed
Added way of adding response headers as JSON props
1 parent de4d9d5 commit 76fd519

File tree

4 files changed

+40
-31
lines changed

4 files changed

+40
-31
lines changed

src/main/java/io/github/delirius325/jmeter/backendlistener/elasticsearch/ElasticSearchMetric.java

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,17 @@ public class ElasticSearchMetric {
2222
private String esTimestamp;
2323
private int ciBuildNumber;
2424
private HashMap<String, Object> json;
25-
private boolean all;
25+
private boolean allReqHeaders;
26+
private boolean allResHeaders;
2627

27-
public ElasticSearchMetric(SampleResult sr, String testMode, String timeStamp, int buildNumber, boolean parseHeaders) {
28+
public ElasticSearchMetric(SampleResult sr, String testMode, String timeStamp, int buildNumber, boolean parseReqHeaders, boolean parseResHeaders) {
2829
this.sampleResult = sr;
2930
this.esTestMode = testMode.trim();
3031
this.esTimestamp = timeStamp.trim();
3132
this.ciBuildNumber = buildNumber;
3233
this.json = new HashMap<>();
33-
this.all = parseHeaders;
34+
this.allReqHeaders = parseReqHeaders;
35+
this.allResHeaders = parseResHeaders;
3436
}
3537

3638
/**
@@ -76,12 +78,14 @@ public Map<String, Object> getMetric(BackendListenerContext context) throws Exce
7678
if(!this.sampleResult.isSuccessful())
7779
addDetails();
7880
break;
81+
default:
82+
break;
7983
}
8084

8185
addAssertions();
8286
addElapsedTime(sdf);
8387
addCustomFields(context);
84-
parseHeadersAsDocumentProps(this.all);
88+
parseHeadersAsJsonProps(this.allReqHeaders, this.allResHeaders);
8589

8690
return this.json;
8791
}
@@ -174,21 +178,31 @@ private void addDetails() {
174178
* This is a work-around the native behaviour of JMeter where variables are not accessible within the
175179
* backend listener.
176180
*
177-
* @param all boolean to determine if the user wants to separate ALL headers into different ES properties.
181+
* @param allReqHeaders boolean to determine if the user wants to separate ALL request headers into different ES JSON properties.
182+
* @param allResHeaders boolean to determine if the user wants to separate ALL response headers into different ES JSON properties.
178183
*
179184
* NOTE: This will be fixed as soon as a patch comes in for JMeter to change the behaviour.
180185
*/
181-
private void parseHeadersAsDocumentProps(boolean all) {
182-
String[] lines = this.sampleResult.getRequestHeaders().split("\n");
186+
private void parseHeadersAsJsonProps(boolean allReqHeaders, boolean allResHeaders) {
187+
LinkedList<String[]> headersArrayList = new LinkedList<String[]>();
188+
189+
if(allReqHeaders) {
190+
headersArrayList.add(this.sampleResult.getRequestHeaders().split("\n"));
191+
}
183192

184-
for(int i=0; i < lines.length; i++) {
185-
String[] header = lines[i].split(":");
186-
if(!this.all) {
187-
if(header[0].startsWith("X-es-backend")) {
193+
if(allResHeaders) {
194+
headersArrayList.add(this.sampleResult.getResponseHeaders().split("\n"));
195+
}
196+
197+
for(String[] lines : headersArrayList) {
198+
for(int i=0; i < lines.length; i++) {
199+
String[] header = lines[i].split(":");
200+
// if not all req headers and header contains special X-tag
201+
if(!this.allReqHeaders && header[0].startsWith("X-es-backend")) {
202+
this.json.put(header[0].replaceAll("es-", "").trim(), header[1].trim());
203+
} else {
188204
this.json.put(header[0].replaceAll("es-", "").trim(), header[1].trim());
189205
}
190-
} else {
191-
this.json.put(header[0].replaceAll("es-", "").trim(), header[1].trim());
192206
}
193207
}
194208
}

src/main/java/io/github/delirius325/jmeter/backendlistener/elasticsearch/ElasticSearchMetricSender.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package io.github.delirius325.jmeter.backendlistener.elasticsearch;
22

3-
import org.apache.http.HttpEntity;
43
import org.apache.http.HttpStatus;
54
import org.apache.http.entity.ContentType;
6-
import org.apache.http.message.BasicHeader;
75
import org.apache.http.nio.entity.NStringEntity;
86
import org.elasticsearch.client.Request;
97
import org.elasticsearch.client.RequestOptions;
@@ -94,10 +92,8 @@ public void sendRequest() {
9492

9593
Response response = this.client.performRequest(request);
9694

97-
if(response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
98-
if(logger.isErrorEnabled()) {
99-
logger.error("ElasticSearch Backend Listener failed to write results for index {}", this.esIndex);
100-
}
95+
if(response.getStatusLine().getStatusCode() != HttpStatus.SC_OK && logger.isErrorEnabled()) {
96+
logger.error("ElasticSearch Backend Listener failed to write results for index {}", this.esIndex);
10197
}
10298
} catch (Exception e) {
10399
if(logger.isErrorEnabled()) {

src/main/java/io/github/delirius325/jmeter/backendlistener/elasticsearch/ElasticsearchBackendClient.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,14 @@ public class ElasticsearchBackendClient extends AbstractBackendListenerClient {
2727
private static final String ES_TEST_MODE = "es.test.mode";
2828
private static final String ES_AUTH_USER = "es.xpack.user";
2929
private static final String ES_AUTH_PWD = "es.xpack.password";
30-
private static final String ES_PARSE_HEADERS = "es.parse.all.headers";
30+
private static final String ES_PARSE_REQ_HEADERS = "es.parse.all.req.headers";
31+
private static final String ES_PARSE_RES_HEADERS = "es.parse.all.res.headers";
3132
private static final long DEFAULT_TIMEOUT_MS = 200L;
3233
private static final Logger logger = LoggerFactory.getLogger(ElasticsearchBackendClient.class);
3334

3435
private ElasticSearchMetricSender sender;
3536
private Set<String> modes;
3637
private Set<String> filters;
37-
private RestClient client;
3838
private int buildNumber;
3939
private int bulkSize;
4040
private long timeoutMs;
@@ -53,7 +53,8 @@ public Arguments getDefaultParameters() {
5353
parameters.addArgument(ES_TEST_MODE, "info");
5454
parameters.addArgument(ES_AUTH_USER, "");
5555
parameters.addArgument(ES_AUTH_PWD, "");
56-
parameters.addArgument(ES_PARSE_HEADERS, "false");
56+
parameters.addArgument(ES_PARSE_REQ_HEADERS, "false");
57+
parameters.addArgument(ES_PARSE_RES_HEADERS, "false");
5758
return parameters;
5859
}
5960

@@ -64,8 +65,8 @@ public void setupTest(BackendListenerContext context) throws Exception {
6465
this.modes = new HashSet<>(Arrays.asList("info","debug","error","quiet"));
6566
this.bulkSize = Integer.parseInt(context.getParameter(ES_BULK_SIZE));
6667
this.timeoutMs = JMeterUtils.getPropDefault(ES_TIMEOUT_MS, DEFAULT_TIMEOUT_MS);
67-
this.buildNumber = (JMeterUtils.getProperty(ElasticsearchBackendClient.BUILD_NUMBER) != null && JMeterUtils.getProperty(ElasticsearchBackendClient.BUILD_NUMBER).trim() != "") ? Integer.parseInt(JMeterUtils.getProperty(ElasticsearchBackendClient.BUILD_NUMBER)) : 0;
68-
this.client = RestClient.builder(new HttpHost(context.getParameter(ES_HOST), Integer.parseInt(context.getParameter(ES_PORT)), context.getParameter(ES_SCHEME)))
68+
this.buildNumber = (JMeterUtils.getProperty(ElasticsearchBackendClient.BUILD_NUMBER) != null && !JMeterUtils.getProperty(ElasticsearchBackendClient.BUILD_NUMBER).trim().equals("")) ? Integer.parseInt(JMeterUtils.getProperty(ElasticsearchBackendClient.BUILD_NUMBER)) : 0;
69+
RestClient client = RestClient.builder(new HttpHost(context.getParameter(ES_HOST), Integer.parseInt(context.getParameter(ES_PORT)), context.getParameter(ES_SCHEME)))
6970
.setRequestConfigCallback(requestConfigBuilder -> requestConfigBuilder.setConnectTimeout(5000)
7071
.setSocketTimeout((int) timeoutMs))
7172
.setFailureListener(new RestClient.FailureListener() {
@@ -77,13 +78,13 @@ public void onFailure(Node node) {
7778
.setMaxRetryTimeoutMillis(60000)
7879
.build();
7980

80-
this.sender = new ElasticSearchMetricSender(this.client, context.getParameter(ES_INDEX).toLowerCase() ,context.getParameter(ES_AUTH_USER), context.getParameter(ES_AUTH_PWD));
81+
this.sender = new ElasticSearchMetricSender(client, context.getParameter(ES_INDEX).toLowerCase() ,context.getParameter(ES_AUTH_USER), context.getParameter(ES_AUTH_PWD));
8182
this.sender.createIndex();
8283

8384
checkTestMode(context.getParameter(ES_TEST_MODE));
8485

8586
String[] filterArray = (context.getParameter(ES_SAMPLE_FILTER).contains(";")) ? context.getParameter(ES_SAMPLE_FILTER).split(";") : new String[] {context.getParameter(ES_SAMPLE_FILTER)};
86-
if(filterArray.length >= 1 && filterArray[0].trim() != "") {
87+
if(filterArray.length >= 1 && !filterArray[0].trim().equals("")) {
8788
for (String filter : filterArray) {
8889
this.filters.add(filter.toLowerCase().trim());
8990
}
@@ -98,7 +99,7 @@ public void onFailure(Node node) {
9899
@Override
99100
public void handleSampleResults(List<SampleResult> results, BackendListenerContext context) {
100101
for(SampleResult sr : results) {
101-
ElasticSearchMetric metric = new ElasticSearchMetric(sr, context.getParameter(ES_TEST_MODE), context.getParameter(ES_TIMESTAMP), this.buildNumber, context.getBooleanParameter(ES_PARSE_HEADERS, false));
102+
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));
102103

103104
if(validateSample(context, sr)) {
104105
try {

src/test/java/io/github/delirius325/jmeter/backendlistener/elasticsearch/TestElasticSearchBackend.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
import java.util.Date;
77

88
import org.apache.jmeter.samplers.SampleResult;
9-
import org.apache.jmeter.threads.JMeterContext;
10-
import org.apache.jmeter.threads.JMeterContextService;
119
import org.junit.Before;
1210
import org.junit.Test;
1311

@@ -17,8 +15,8 @@ public class TestElasticSearchBackend {
1715

1816
@Before
1917
public void setUp() throws Exception {
20-
metricCI = new ElasticSearchMetric(new SampleResult(), "info", "yyyy-MM-dd'T'HH:mm:ss.SSSZZ", 1, false);
21-
metricNoCI = new ElasticSearchMetric(new SampleResult(), "info", "yyyy-MM-dd'T'HH:mm:ss.SSSZZ", 0, false);
18+
metricCI = new ElasticSearchMetric(new SampleResult(), "info", "yyyy-MM-dd'T'HH:mm:ss.SSSZZ", 1, false, false);
19+
metricNoCI = new ElasticSearchMetric(new SampleResult(), "info", "yyyy-MM-dd'T'HH:mm:ss.SSSZZ", 0, false, false);
2220
}
2321

2422
@Test

0 commit comments

Comments
 (0)