Skip to content

Commit 34f887d

Browse files
authored
Log more information in debug when synonyms fail updates (#102946) (#103020)
Related to: #102261 In test failures, we are not receiving any information around the bulk indexing cause stacktrace, just the message. This adds debug logging and grabs the first stacktrace over all indices. Additionally, the logger groups by the failure message in an effort to find unique failures over all the indices.
1 parent 2329efc commit 34f887d

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

rest-api-spec/src/yamlRestTest/resources/rest-api-spec/test/synonyms/40_synonyms_sets_get.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,21 @@ setup:
2323
body:
2424
synonyms_set:
2525
- synonyms: "pc, computer"
26+
# set logging to debug for issue: https://github.com/elastic/elasticsearch/issues/102261
27+
- do:
28+
cluster.put_settings:
29+
body:
30+
persistent:
31+
logger.org.elasticsearch.synonyms: DEBUG
2632

2733
---
34+
teardown:
35+
- do:
36+
cluster.put_settings:
37+
body:
38+
persistent:
39+
logger.org.elasticsearch.synonyms: null
40+
---
2841
"List synonyms set":
2942
- do:
3043
synonyms.get_synonyms_sets: { }

server/src/main/java/org/elasticsearch/synonyms/SynonymsManagementAPIService.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
package org.elasticsearch.synonyms;
1010

11+
import org.apache.logging.log4j.LogManager;
12+
import org.apache.logging.log4j.Logger;
1113
import org.elasticsearch.ElasticsearchException;
1214
import org.elasticsearch.ExceptionsHelper;
1315
import org.elasticsearch.ResourceNotFoundException;
@@ -62,6 +64,8 @@
6264
* Manages synonyms performing operations on the system index
6365
*/
6466
public class SynonymsManagementAPIService {
67+
68+
private static final Logger logger = LogManager.getLogger(SynonymsManagementAPIService.class);
6569
private static final String SYNONYMS_INDEX_NAME_PATTERN = ".synonyms-*";
6670
private static final int SYNONYMS_INDEX_FORMAT = 2;
6771
private static final String SYNONYMS_INDEX_CONCRETE_NAME = ".synonyms-" + SYNONYMS_INDEX_FORMAT;
@@ -234,11 +238,30 @@ private static SynonymRule sourceMapToSynonymRule(Map<String, Object> docSourceA
234238
return new SynonymRule((String) docSourceAsMap.get(SYNONYM_RULE_ID_FIELD), (String) docSourceAsMap.get(SYNONYMS_FIELD));
235239
}
236240

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+
237259
public void putSynonymsSet(String synonymSetId, SynonymRule[] synonymsSet, ActionListener<SynonymsReloadResult> listener) {
238260
deleteSynonymsSetObjects(synonymSetId, listener.delegateFailure((deleteByQueryResponseListener, bulkDeleteResponse) -> {
239261
boolean created = bulkDeleteResponse.getDeleted() == 0;
240262
final List<BulkItemResponse.Failure> bulkDeleteFailures = bulkDeleteResponse.getBulkFailures();
241263
if (bulkDeleteFailures.isEmpty() == false) {
264+
logUniqueFailureMessagesWithIndices(bulkDeleteFailures);
242265
listener.onFailure(
243266
new ElasticsearchException(
244267
"Error updating synonyms: "
@@ -264,6 +287,12 @@ public void putSynonymsSet(String synonymSetId, SynonymRule[] synonymsSet, Actio
264287
bulkRequestBuilder.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE)
265288
.execute(deleteByQueryResponseListener.delegateFailure((bulkInsertResponseListener, bulkInsertResponse) -> {
266289
if (bulkInsertResponse.hasFailures()) {
290+
logUniqueFailureMessagesWithIndices(
291+
Arrays.stream(bulkInsertResponse.getItems())
292+
.filter(BulkItemResponse::isFailed)
293+
.map(BulkItemResponse::getFailure)
294+
.collect(Collectors.toList())
295+
);
267296
bulkInsertResponseListener.onFailure(
268297
new ElasticsearchException("Error updating synonyms: " + bulkInsertResponse.buildFailureMessage())
269298
);

0 commit comments

Comments
 (0)