2626import static com .mongodb .kafka .connect .util .TimeseriesValidation .validateCollection ;
2727import static java .util .Collections .emptyList ;
2828
29+ import java .util .ArrayList ;
2930import java .util .Collection ;
3031import java .util .HashSet ;
3132import java .util .List ;
5455import com .mongodb .MongoClientSettings ;
5556import com .mongodb .MongoException ;
5657import com .mongodb .MongoNamespace ;
58+ import com .mongodb .bulk .BulkWriteError ;
5759import com .mongodb .bulk .BulkWriteResult ;
5860import com .mongodb .client .MongoClient ;
5961import com .mongodb .client .MongoClients ;
@@ -236,7 +238,7 @@ private void bulkWriteBatch(final List<MongoProcessedSinkRecordData> batch) {
236238 "Writing {} document(s) into collection [{}] failed." ,
237239 writeModels .size (),
238240 namespace .getFullName ());
239- handleMongoException (config , e );
241+ handleMongoException (config , writeModels , e );
240242 } catch (InterruptedException e ) {
241243 Thread .currentThread ().interrupt ();
242244 throw new DataException ("Rate limiting was interrupted" , e );
@@ -279,14 +281,19 @@ private AtomicInteger getRemainingRetriesForTopic(final String topic) {
279281 return remainingRetriesTopicMap .get (topic );
280282 }
281283
282- private void handleMongoException (final MongoSinkTopicConfig config , final MongoException e ) {
284+ private void handleMongoException (
285+ final MongoSinkTopicConfig config ,
286+ final List <WriteModel <BsonDocument >> writeModels ,
287+ final MongoException e ) {
283288 if (getRemainingRetriesForTopic (config .getTopic ()).decrementAndGet () <= 0 ) {
284289 if (config .logErrors ()) {
285290 LOGGER .error ("Error on mongodb operation" , e );
286291 if (e instanceof MongoBulkWriteException ) {
287292 LOGGER .error ("Mongodb bulk write (partially) failed" , e );
288293 LOGGER .error ("WriteResult: {}" , ((MongoBulkWriteException ) e ).getWriteResult ());
289- LOGGER .error ("WriteErrors: {}" , ((MongoBulkWriteException ) e ).getWriteErrors ());
294+ LOGGER .error (
295+ "WriteErrors: {}" ,
296+ generateWriteErrors (((MongoBulkWriteException ) e ).getWriteErrors (), writeModels ));
290297 LOGGER .error (
291298 "WriteConcernError: {}" , ((MongoBulkWriteException ) e ).getWriteConcernError ());
292299 }
@@ -301,4 +308,29 @@ private void handleMongoException(final MongoSinkTopicConfig config, final Mongo
301308 throw new RetriableException (e .getMessage (), e );
302309 }
303310 }
311+
312+ private String generateWriteErrors (
313+ final List <BulkWriteError > bulkWriteErrorList ,
314+ final List <WriteModel <BsonDocument >> writeModels ) {
315+ List <String > errorString = new ArrayList <>();
316+ for (final BulkWriteError bulkWriteError : bulkWriteErrorList ) {
317+ if (bulkWriteError .getIndex () < writeModels .size ()) {
318+ errorString .add (
319+ "BulkWriteError{"
320+ + "writeModel="
321+ + writeModels .get (bulkWriteError .getIndex ())
322+ + ", code="
323+ + bulkWriteError .getCode ()
324+ + ", message='"
325+ + bulkWriteError .getMessage ()
326+ + '\''
327+ + ", details="
328+ + bulkWriteError .getDetails ()
329+ + '}' );
330+ } else {
331+ errorString .add (bulkWriteError .toString ());
332+ }
333+ }
334+ return "[" + String .join (", " , errorString ) + "]" ;
335+ }
304336}
0 commit comments