Skip to content

Commit 57d665c

Browse files
#31 - Added support for variables, switched to ES 6.4 low-level client
1 parent c4f53f3 commit 57d665c

File tree

4 files changed

+33
-11
lines changed

4 files changed

+33
-11
lines changed

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<modelVersion>4.0.0</modelVersion>
44
<groupId>io.github.delirius325</groupId>
55
<artifactId>jmeter.backendlistener.elasticsearch</artifactId>
6-
<version>2.4.3</version>
6+
<version>2.5.0</version>
77
<packaging>jar</packaging>
88

99
<name>jmeter.backendlistener.elasticsearch</name>
@@ -44,7 +44,7 @@
4444
<junit.platform.version>1.0.0</junit.platform.version>
4545
<org.apache.jmeter.version>4.0</org.apache.jmeter.version>
4646
<org.apache.commons>3.7</org.apache.commons>
47-
<org.elasticsearch.client>6.2.0</org.elasticsearch.client>
47+
<org.elasticsearch.client>6.4.0</org.elasticsearch.client>
4848
</properties>
4949
<dependencies>
5050
<dependency>

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ public Map<String, Object> getMetric(BackendListenerContext context) throws Exce
7979
addAssertions();
8080
addElapsedTime(sdf);
8181
addCustomFields(context);
82+
checkCustomVariables();
8283

8384
return this.json;
8485
}
@@ -165,6 +166,24 @@ private void addDetails() {
165166
this.json.put("ResponseMessage", this.sampleResult.getResponseMessage());
166167
}
167168

169+
/**
170+
* This method will parse the headers and look for custom variables passed through as header.
171+
* This is a work-around the native behaviour of JMeter where variables are not accessible within the
172+
* backend listener.
173+
*
174+
* NOTE: This will be fixed as soon as a patch comes in for JMeter to change the behaviour.
175+
*/
176+
private void checkCustomVariables() {
177+
String[] lines = this.sampleResult.getRequestHeaders().split("\n");
178+
179+
for(int i=0; i < lines.length; i++) {
180+
String[] header = lines[i].split(":");
181+
if(header[0].contains("es-")) {
182+
this.json.put(header[0].replaceAll("es-", "").trim(), header[1].trim());
183+
}
184+
}
185+
}
186+
168187
/**
169188
* This method is meant to return the elapsed time in a human readable format. The purpose of this is
170189
* mostly for build comparison in Kibana. By doing this, the user is able to set the X-axis of his graph

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import org.apache.http.entity.ContentType;
66
import org.apache.http.message.BasicHeader;
77
import org.apache.http.nio.entity.NStringEntity;
8+
import org.elasticsearch.client.Request;
9+
import org.elasticsearch.client.RequestOptions;
810
import org.elasticsearch.client.Response;
911
import org.elasticsearch.client.RestClient;
1012
import org.slf4j.Logger;
@@ -22,15 +24,13 @@ public class ElasticSearchMetricSender {
2224
private List<String> metricList;
2325
private String authUser;
2426
private String authPwd;
25-
private BasicHeader authHeader;
2627

2728
public ElasticSearchMetricSender(RestClient cli, String index, String user, String pwd) {
2829
this.client = cli;
2930
this.esIndex = index;
3031
this.metricList = new LinkedList<String>();
3132
this.authUser = user.trim();
3233
this.authPwd = pwd.trim();
33-
this.authHeader = null;
3434
}
3535

3636
/**
@@ -72,26 +72,28 @@ public void createIndex() {
7272
* All is being sent through the low-level ElasticSearch REST Client.
7373
*/
7474
public void sendRequest() {
75+
Request request = new Request("POST", "/" + this.esIndex + "/SampleResult/_bulk");
76+
StringBuilder bulkRequestBody = new StringBuilder();
7577
String actionMetaData = String.format("{ \"index\" : { \"_index\" : \"%s\", \"_type\" : \"%s\" } }%n", this.esIndex, "SampleResult");
7678

77-
StringBuilder bulkRequestBody = new StringBuilder();
7879
for (String metric : this.metricList) {
7980
bulkRequestBody.append(actionMetaData);
8081
bulkRequestBody.append(metric);
8182
bulkRequestBody.append("\n");
8283
}
8384

8485
HttpEntity entity = new NStringEntity(bulkRequestBody.toString(), ContentType.APPLICATION_JSON);
86+
request.setEntity(entity);
87+
8588
try {
8689
if(!this.authUser.equals("") && !this.authPwd.equals("")) {
8790
String encodedCredentials = Base64.getEncoder().encodeToString((this.authUser + ":" + this.authPwd).getBytes());
88-
89-
this.authHeader = new BasicHeader("Authorization", "Basic " + encodedCredentials);
91+
RequestOptions.Builder options = request.getOptions().toBuilder();
92+
options.addHeader("Authorization", "Basic " + encodedCredentials);
93+
request.setOptions(options);
9094
}
9195

92-
Response response = (this.authHeader != null)
93-
? this.client.performRequest("POST", "/"+ this.esIndex +"/SampleResult/_bulk", Collections.emptyMap(), entity, this.authHeader)
94-
: this.client.performRequest("POST", "/"+ this.esIndex +"/SampleResult/_bulk", Collections.emptyMap(), entity);
96+
Response response = this.client.performRequest(request);
9597

9698
if(response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
9799
if(logger.isErrorEnabled()) {

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.apache.jmeter.util.JMeterUtils;
88
import org.apache.jmeter.visualizers.backend.AbstractBackendListenerClient;
99
import org.apache.jmeter.visualizers.backend.BackendListenerContext;
10+
import org.elasticsearch.client.Node;
1011
import org.elasticsearch.client.RestClient;
1112
import org.slf4j.Logger;
1213
import org.slf4j.LoggerFactory;
@@ -67,7 +68,7 @@ public void setupTest(BackendListenerContext context) throws Exception {
6768
.setSocketTimeout((int) timeoutMs))
6869
.setFailureListener(new RestClient.FailureListener() {
6970
@Override
70-
public void onFailure(HttpHost host) {
71+
public void onFailure(Node node) {
7172
throw new IllegalStateException();
7273
}
7374
})

0 commit comments

Comments
 (0)