11package net .delirius .jmeter .backendlistener .elasticsearch ;
22
3- import java .net . InetAddress ;
3+ import java .io . IOException ;
44import java .text .ParseException ;
55import java .text .SimpleDateFormat ;
66import java .time .LocalDateTime ;
1313
1414import org .apache .commons .io .IOUtils ;
1515import org .apache .commons .lang .StringUtils ;
16+ import org .apache .http .HttpHost ;
1617import org .apache .jmeter .assertions .AssertionResult ;
1718import org .apache .jmeter .config .Arguments ;
1819import org .apache .jmeter .samplers .SampleResult ;
1920import org .apache .jmeter .threads .JMeterContextService ;
2021import org .apache .jmeter .util .JMeterUtils ;
2122import org .apache .jmeter .visualizers .backend .AbstractBackendListenerClient ;
2223import org .apache .jmeter .visualizers .backend .BackendListenerContext ;
23- import org .elasticsearch .action .bulk .BulkRequestBuilder ;
24+ import org .elasticsearch .action .bulk .BulkRequest ;
2425import org .elasticsearch .action .bulk .BulkResponse ;
25- import org .elasticsearch .common .settings .Settings ;
26- import org .elasticsearch .common .transport .InetSocketTransportAddress ;
26+ import org .elasticsearch .action .index .IndexRequest ;
27+ import org .elasticsearch .client .RestClient ;
28+ import org .elasticsearch .client .RestHighLevelClient ;
2729import org .elasticsearch .common .unit .TimeValue ;
2830import org .elasticsearch .common .xcontent .XContentType ;
29- import org .elasticsearch .transport .client .PreBuiltTransportClient ;
3031import org .slf4j .Logger ;
3132import org .slf4j .LoggerFactory ;
3233
3839 * @source_2: https://github.com/zumo64/ELK_POC
3940 */
4041public class ElasticsearchBackend extends AbstractBackendListenerClient {
41- private static final String BUILD_NUMBER = "BuildNumber" ;
42+ private static final String BUILD_NUMBER = "BuildNumber" ;
43+ private static final String ES_SCHEME = "es.scheme" ;
4244 private static final String ES_HOST = "es.host" ;
4345 private static final String ES_PORT = "es.transport.port" ;
4446 private static final String ES_INDEX = "es.index" ;
4547 private static final String ES_TIMESTAMP = "es.timestamp" ;
4648 private static final String ES_STATUS_CODE = "es.status.code" ;
47- private static final String ES_CLUSTER = "es.cluster" ;
4849 private static final String ES_BULK_SIZE = "es.bulk.size" ;
4950 private static final String ES_TIMEOUT_MS = "es.timout.ms" ;
5051 private static final long DEFAULT_TIMEOUT_MS = 200L ;
5152 private static final Logger logger = LoggerFactory .getLogger (ElasticsearchBackend .class );
5253
53- private PreBuiltTransportClient client ;
54+ private RestHighLevelClient client ;
5455 private String index ;
5556 private int buildNumber ;
5657 private int bulkSize ;
57- private BulkRequestBuilder bulkRequest ;
58+ private BulkRequest bulkRequest ;
5859 private long timeoutMs ;
5960
6061 @ Override
6162 public Arguments getDefaultParameters () {
6263 Arguments parameters = new Arguments ();
64+ parameters .addArgument (ES_SCHEME , "http" );
6365 parameters .addArgument (ES_HOST , null );
64- parameters .addArgument (ES_PORT , "9300 " );
66+ parameters .addArgument (ES_PORT , "9200 " );
6567 parameters .addArgument (ES_INDEX , null );
6668 parameters .addArgument (ES_TIMESTAMP , "yyyy-MM-dd'T'HH:mm:ss.SSSZZ" );
6769 parameters .addArgument (ES_STATUS_CODE , "531" );
68- parameters .addArgument (ES_CLUSTER , "elasticsearch" );
6970 parameters .addArgument (ES_BULK_SIZE , "100" );
7071 parameters .addArgument (ES_TIMEOUT_MS , Long .toString (DEFAULT_TIMEOUT_MS ));
7172 return parameters ;
@@ -80,13 +81,17 @@ public void setupTest(BackendListenerContext context) throws Exception {
8081 this .buildNumber = (JMeterUtils .getProperty (ElasticsearchBackend .BUILD_NUMBER ) != null
8182 && JMeterUtils .getProperty (ElasticsearchBackend .BUILD_NUMBER ).trim () != "" )
8283 ? Integer .parseInt (JMeterUtils .getProperty (ElasticsearchBackend .BUILD_NUMBER )) : 0 ;
83- Settings settings = Settings .builder ().put ("cluster.name" , context .getParameter (ES_CLUSTER )).build ();
8484 String host = context .getParameter (ES_HOST );
8585 int port = Integer .parseInt (context .getParameter (ES_PORT ));
86- this .client = new PreBuiltTransportClient (settings );
87- this .client .addTransportAddress (
88- new InetSocketTransportAddress (InetAddress .getByName (host ), port ));
89- this .bulkRequest = this .client .prepareBulk ();
86+ this .client = new RestHighLevelClient (
87+ RestClient .builder (
88+ new HttpHost (host , port , context .getParameter (ES_SCHEME , "http" )))
89+ .setRequestConfigCallback (requestConfigBuilder ->
90+ requestConfigBuilder
91+ .setConnectTimeout (5000 )
92+ .setSocketTimeout ((int )timeoutMs ))
93+ .setMaxRetryTimeoutMillis (60000 ));
94+ this .bulkRequest = new BulkRequest ().timeout (TimeValue .timeValueMillis (timeoutMs ));
9095 super .setupTest (context );
9196 } catch (Exception e ) {
9297 throw new IllegalStateException ("Unable to setup connectivity to ES" , e );
@@ -96,37 +101,43 @@ public void setupTest(BackendListenerContext context) throws Exception {
96101 @ Override
97102 public void handleSampleResults (List <SampleResult > results , BackendListenerContext context ) {
98103 for (SampleResult sr : results ) {
99- this .bulkRequest .add (this .client .prepareIndex (this .index , "SampleResult" ).setSource (this .getElasticData (sr , context ), XContentType .JSON ));
104+ this .bulkRequest .add (
105+ new IndexRequest (this .index , "SampleResult" ).source (this .getElasticData (sr , context ),
106+ XContentType .JSON ));
100107 }
101108
102109 if (this .bulkRequest .numberOfActions () >= this .bulkSize ) {
103110 try {
104- BulkResponse bulkResponse = this .bulkRequest .get (TimeValue .timeValueMillis (timeoutMs ));
105- if (bulkResponse .hasFailures ()) {
106- if (logger .isErrorEnabled ()) {
107- logger .error ("Failed to write a result on {}: {}" ,
108- index , bulkResponse .buildFailureMessage ());
109- }
110- } else {
111- logger .debug ("Wrote {} results in {}." ,
112- index );
113- }
111+ sendRequest (bulkRequest );
114112 } catch (Exception e ) {
115113 logger .error ("Error sending data to ES, data will be lost" , e );
116114 } finally {
117- this .bulkRequest = this . client . prepareBulk ( );
115+ this .bulkRequest = new BulkRequest (). timeout ( TimeValue . timeValueMillis ( timeoutMs ) );
118116 }
119117 }
120118 }
121119
122120 @ Override
123121 public void teardownTest (BackendListenerContext context ) throws Exception {
124122 if (this .bulkRequest .numberOfActions () > 0 ) {
125- this . bulkRequest . get ( );
123+ sendRequest ( bulkRequest );
126124 }
127125 IOUtils .closeQuietly (client );
128126 super .teardownTest (context );
129127 }
128+
129+ private void sendRequest (BulkRequest bulkRequest ) throws IOException {
130+ BulkResponse bulkResponse = this .client .bulk (bulkRequest );
131+ if (bulkResponse .hasFailures ()) {
132+ if (logger .isErrorEnabled ()) {
133+ logger .error ("Failed to write a result on {}: {}" ,
134+ index , bulkResponse .buildFailureMessage ());
135+ }
136+ } else {
137+ logger .debug ("Wrote {} results in {}." ,
138+ index );
139+ }
140+ }
130141
131142 public Map <String , Object > getElasticData (SampleResult sr , BackendListenerContext context ) {
132143 HashMap <String , Object > jsonObject = new HashMap <>();
@@ -172,7 +183,7 @@ public Map<String, Object> getElasticData(SampleResult sr, BackendListenerContex
172183 //all assertions
173184 AssertionResult [] assertionResults = sr .getAssertionResults ();
174185 if (assertionResults != null ) {
175- HashMap <String , Object > [] assertionArray = new HashMap [assertionResults .length ];
186+ Map <String , Object >[] assertionArray = new HashMap [assertionResults .length ];
176187 Integer i = 0 ;
177188 for (AssertionResult assertionResult : assertionResults ) {
178189 HashMap <String , Object > assertionMap = new HashMap <>();
0 commit comments