8
8
9
9
package org .elasticsearch .synonyms ;
10
10
11
+ import org .apache .logging .log4j .LogManager ;
12
+ import org .apache .logging .log4j .Logger ;
11
13
import org .elasticsearch .ElasticsearchException ;
12
14
import org .elasticsearch .ExceptionsHelper ;
13
15
import org .elasticsearch .ResourceNotFoundException ;
62
64
* Manages synonyms performing operations on the system index
63
65
*/
64
66
public class SynonymsManagementAPIService {
67
+
68
+ private static final Logger logger = LogManager .getLogger (SynonymsManagementAPIService .class );
65
69
private static final String SYNONYMS_INDEX_NAME_PATTERN = ".synonyms-*" ;
66
70
private static final int SYNONYMS_INDEX_FORMAT = 2 ;
67
71
private static final String SYNONYMS_INDEX_CONCRETE_NAME = ".synonyms-" + SYNONYMS_INDEX_FORMAT ;
@@ -234,11 +238,30 @@ private static SynonymRule sourceMapToSynonymRule(Map<String, Object> docSourceA
234
238
return new SynonymRule ((String ) docSourceAsMap .get (SYNONYM_RULE_ID_FIELD ), (String ) docSourceAsMap .get (SYNONYMS_FIELD ));
235
239
}
236
240
241
+ private static void logUniqueFailureMessagesWithIndices (List <BulkItemResponse .Failure > bulkFailures ) {
242
+ // check if logger is at least debug
243
+ if (logger .isDebugEnabled () == false ) {
244
+ return ;
245
+ }
246
+ Map <String , List <BulkItemResponse .Failure >> uniqueFailureMessages = bulkFailures .stream ()
247
+ .collect (Collectors .groupingBy (BulkItemResponse .Failure ::getMessage ));
248
+ // log each unique failure with their associated indices and the first stacktrace
249
+ uniqueFailureMessages .forEach ((failureMessage , failures ) -> {
250
+ logger .debug (
251
+ "Error updating synonyms: [{}], indices: [{}], stacktrace: [{}]" ,
252
+ failureMessage ,
253
+ failures .stream ().map (BulkItemResponse .Failure ::getIndex ).collect (Collectors .joining ("," )),
254
+ ExceptionsHelper .formatStackTrace (failures .get (0 ).getCause ().getStackTrace ())
255
+ );
256
+ });
257
+ }
258
+
237
259
public void putSynonymsSet (String synonymSetId , SynonymRule [] synonymsSet , ActionListener <SynonymsReloadResult > listener ) {
238
260
deleteSynonymsSetObjects (synonymSetId , listener .delegateFailure ((deleteByQueryResponseListener , bulkDeleteResponse ) -> {
239
261
boolean created = bulkDeleteResponse .getDeleted () == 0 ;
240
262
final List <BulkItemResponse .Failure > bulkDeleteFailures = bulkDeleteResponse .getBulkFailures ();
241
263
if (bulkDeleteFailures .isEmpty () == false ) {
264
+ logUniqueFailureMessagesWithIndices (bulkDeleteFailures );
242
265
listener .onFailure (
243
266
new ElasticsearchException (
244
267
"Error updating synonyms: "
@@ -264,6 +287,12 @@ public void putSynonymsSet(String synonymSetId, SynonymRule[] synonymsSet, Actio
264
287
bulkRequestBuilder .setRefreshPolicy (WriteRequest .RefreshPolicy .IMMEDIATE )
265
288
.execute (deleteByQueryResponseListener .delegateFailure ((bulkInsertResponseListener , bulkInsertResponse ) -> {
266
289
if (bulkInsertResponse .hasFailures ()) {
290
+ logUniqueFailureMessagesWithIndices (
291
+ Arrays .stream (bulkInsertResponse .getItems ())
292
+ .filter (BulkItemResponse ::isFailed )
293
+ .map (BulkItemResponse ::getFailure )
294
+ .collect (Collectors .toList ())
295
+ );
267
296
bulkInsertResponseListener .onFailure (
268
297
new ElasticsearchException ("Error updating synonyms: " + bulkInsertResponse .buildFailureMessage ())
269
298
);
0 commit comments