1111import java .util .Iterator ;
1212import java .util .LinkedList ;
1313import java .util .Map ;
14+ import java .util .Set ;
1415
1516import org .apache .jmeter .assertions .AssertionResult ;
1617import org .apache .jmeter .samplers .SampleResult ;
@@ -32,19 +33,22 @@ public class ElasticSearchMetric {
3233
3334 private HashMap <String , Object > json ;
3435
36+ private Set <String > fields ;
37+
3538 private boolean allReqHeaders ;
3639
3740 private boolean allResHeaders ;
3841
3942 public ElasticSearchMetric (SampleResult sr , String testMode , String timeStamp , int buildNumber ,
40- boolean parseReqHeaders , boolean parseResHeaders ) {
43+ boolean parseReqHeaders , boolean parseResHeaders , Set < String > fields ) {
4144 this .sampleResult = sr ;
4245 this .esTestMode = testMode .trim ();
4346 this .esTimestamp = timeStamp .trim ();
4447 this .ciBuildNumber = buildNumber ;
4548 this .json = new HashMap <>();
4649 this .allReqHeaders = parseReqHeaders ;
4750 this .allResHeaders = parseResHeaders ;
51+ this .fields = fields ;
4852 }
4953
5054 /**
@@ -58,27 +62,27 @@ public Map<String, Object> getMetric(BackendListenerContext context) throws Exce
5862 SimpleDateFormat sdf = new SimpleDateFormat (this .esTimestamp );
5963
6064 //add all the default SampleResult parameters
61- this . json . put ("AllThreads" , this .sampleResult .getAllThreads ());
62- this . json . put ("BodySize" , this .sampleResult .getBodySizeAsLong ());
63- this . json . put ("Bytes" , this .sampleResult .getBytesAsLong ());
64- this . json . put ("SentBytes" , this .sampleResult .getSentBytes ());
65- this . json . put ("ConnectTime" , this .sampleResult .getConnectTime ());
66- this . json . put ("ContentType" , this .sampleResult .getContentType ());
67- this . json . put ("DataType" , this .sampleResult .getDataType ());
68- this . json . put ("ErrorCount" , this .sampleResult .getErrorCount ());
69- this . json . put ("GrpThreads" , this .sampleResult .getGroupThreads ());
70- this . json . put ("IdleTime" , this .sampleResult .getIdleTime ());
71- this . json . put ("Latency" , this .sampleResult .getLatency ());
72- this . json . put ("ResponseTime" , this .sampleResult .getTime ());
73- this . json . put ("SampleCount" , this .sampleResult .getSampleCount ());
74- this . json . put ("SampleLabel" , this .sampleResult .getSampleLabel ());
75- this . json . put ("ThreadName" , this .sampleResult .getThreadName ());
76- this . json . put ("URL" , this .sampleResult .getURL ());
77- this . json . put ("ResponseCode" , this .sampleResult .getResponseCode ());
78- this . json . put ("StartTime" , sdf .format (new Date (this .sampleResult .getStartTime ())));
79- this . json . put ("EndTime" , sdf .format (new Date (this .sampleResult .getEndTime ())));
80- this . json . put ("Timestamp" , sdf .format (new Date (this .sampleResult .getTimeStamp ())));
81- this . json . put ("InjectorHostname" , InetAddress .getLocalHost ().getHostName ());
65+ addFilteredJSON ("AllThreads" , this .sampleResult .getAllThreads ());
66+ addFilteredJSON ("BodySize" , this .sampleResult .getBodySizeAsLong ());
67+ addFilteredJSON ("Bytes" , this .sampleResult .getBytesAsLong ());
68+ addFilteredJSON ("SentBytes" , this .sampleResult .getSentBytes ());
69+ addFilteredJSON ("ConnectTime" , this .sampleResult .getConnectTime ());
70+ addFilteredJSON ("ContentType" , this .sampleResult .getContentType ());
71+ addFilteredJSON ("DataType" , this .sampleResult .getDataType ());
72+ addFilteredJSON ("ErrorCount" , this .sampleResult .getErrorCount ());
73+ addFilteredJSON ("GrpThreads" , this .sampleResult .getGroupThreads ());
74+ addFilteredJSON ("IdleTime" , this .sampleResult .getIdleTime ());
75+ addFilteredJSON ("Latency" , this .sampleResult .getLatency ());
76+ addFilteredJSON ("ResponseTime" , this .sampleResult .getTime ());
77+ addFilteredJSON ("SampleCount" , this .sampleResult .getSampleCount ());
78+ addFilteredJSON ("SampleLabel" , this .sampleResult .getSampleLabel ());
79+ addFilteredJSON ("ThreadName" , this .sampleResult .getThreadName ());
80+ addFilteredJSON ("URL" , this .sampleResult .getURL ());
81+ addFilteredJSON ("ResponseCode" , this .sampleResult .getResponseCode ());
82+ addFilteredJSON ("StartTime" , sdf .format (new Date (this .sampleResult .getStartTime ())));
83+ addFilteredJSON ("EndTime" , sdf .format (new Date (this .sampleResult .getEndTime ())));
84+ addFilteredJSON ("Timestamp" , sdf .format (new Date (this .sampleResult .getTimeStamp ())));
85+ addFilteredJSON ("InjectorHostname" , InetAddress .getLocalHost ().getHostName ());
8286
8387 // Add the details according to the mode that is set
8488 switch (this .esTestMode ) {
@@ -113,16 +117,22 @@ private void addAssertions() {
113117 if (assertionResults != null ) {
114118 Map <String , Object >[] assertionArray = new HashMap [assertionResults .length ];
115119 Integer i = 0 ;
120+ String failureMessage = "" ;
121+ boolean isFailure = false ;
116122 for (AssertionResult assertionResult : assertionResults ) {
117123 HashMap <String , Object > assertionMap = new HashMap <>();
118124 boolean failure = assertionResult .isFailure () || assertionResult .isError ();
125+ isFailure = isFailure || assertionResult .isFailure () || assertionResult .isError ();
119126 assertionMap .put ("failure" , failure );
120127 assertionMap .put ("failureMessage" , assertionResult .getFailureMessage ());
128+ failureMessage += assertionResult .getFailureMessage () + "\n " ;
121129 assertionMap .put ("name" , assertionResult .getName ());
122130 assertionArray [i ] = assertionMap ;
123131 i ++;
124132 }
125- this .json .put ("AssertionResults" , assertionArray );
133+ addFilteredJSON ("AssertionResults" , assertionArray );
134+ addFilteredJSON ("FailureMessage" , failureMessage );
135+ addFilteredJSON ("Success" , !isFailure );
126136 }
127137 }
128138
@@ -139,15 +149,15 @@ private void addElapsedTime(SimpleDateFormat sdf) {
139149
140150 if (this .ciBuildNumber != 0 ) {
141151 elapsedTime = getElapsedTime (true );
142- this . json . put ("BuildNumber" , this .ciBuildNumber );
152+ addFilteredJSON ("BuildNumber" , this .ciBuildNumber );
143153
144154 if (elapsedTime != null )
145- this . json . put ("ElapsedTimeComparison" , sdf .format (elapsedTime ));
155+ addFilteredJSON ("ElapsedTimeComparison" , sdf .format (elapsedTime ));
146156 }
147157
148158 elapsedTime = getElapsedTime (false );
149159 if (elapsedTime != null )
150- this . json . put ("ElapsedTime" , sdf .format (elapsedTime ));
160+ addFilteredJSON ("ElapsedTime" , sdf .format (elapsedTime ));
151161 }
152162
153163 /**
@@ -165,11 +175,11 @@ private void addCustomFields(BackendListenerContext context) {
165175 String parameter = context .getParameter (parameterName ).trim ();
166176
167177 try {
168- this . json . put (parameterName , Long .parseLong (parameter ));
178+ addFilteredJSON (parameterName , Long .parseLong (parameter ));
169179 } catch (Exception e ) {
170180 if (logger .isDebugEnabled ())
171181 logger .debug ("Cannot convert custom field to number" );
172- this . json . put (parameterName , context .getParameter (parameterName ).trim ());
182+ addFilteredJSON (parameterName , context .getParameter (parameterName ).trim ());
173183 }
174184 }
175185 }
@@ -180,11 +190,11 @@ private void addCustomFields(BackendListenerContext context) {
180190 *
181191 */
182192 private void addDetails () {
183- this . json . put ("RequestHeaders" , this .sampleResult .getRequestHeaders ());
184- this . json . put ("RequestBody" , this .sampleResult .getSamplerData ());
185- this . json . put ("ResponseHeaders" , this .sampleResult .getResponseHeaders ());
186- this . json . put ("ResponseBody" , this .sampleResult .getResponseDataAsString ());
187- this . json . put ("ResponseMessage" , this .sampleResult .getResponseMessage ());
193+ addFilteredJSON ("RequestHeaders" , this .sampleResult .getRequestHeaders ());
194+ addFilteredJSON ("RequestBody" , this .sampleResult .getSamplerData ());
195+ addFilteredJSON ("ResponseHeaders" , this .sampleResult .getResponseHeaders ());
196+ addFilteredJSON ("ResponseBody" , this .sampleResult .getResponseDataAsString ());
197+ addFilteredJSON ("ResponseMessage" , this .sampleResult .getResponseMessage ());
188198 }
189199
190200 /**
@@ -228,6 +238,18 @@ private void parseHeadersAsJsonProps(boolean allReqHeaders, boolean allResHeader
228238 }
229239 }
230240
241+ /**
242+ * Adds a given key-value pair to JSON if the key is contained in the field filter or in case of empty field filter
243+ *
244+ * @param key
245+ * @param value
246+ */
247+ private void addFilteredJSON (String key , Object value ) {
248+ if (this .fields .size () == 0 || this .fields .contains (key .toLowerCase ())) {
249+ this .json .put (key , value );
250+ }
251+ }
252+
231253 /**
232254 * This method is meant to return the elapsed time in a human readable format. The purpose of this is mostly for
233255 * build comparison in Kibana. By doing this, the user is able to set the X-axis of his graph to this date and split
0 commit comments