Просмотр исходного кода

More detailed ElasticsearchHandler exceptions

Karolis 6 лет назад
Родитель
Сommit
c8cd53dc0f
1 измененных файлов с 40 добавлено и 8 удалено
  1. 40 8
      src/Monolog/Handler/ElasticsearchHandler.php

+ 40 - 8
src/Monolog/Handler/ElasticsearchHandler.php

@@ -11,14 +11,14 @@
 
 namespace Monolog\Handler;
 
-use Elasticsearch\Client;
-use Elasticsearch\Common\Exceptions\RuntimeException as ElasticsearchRuntimeException;
-use InvalidArgumentException;
-use Monolog\Formatter\ElasticsearchFormatter;
-use Monolog\Formatter\FormatterInterface;
-use Monolog\Logger;
-use RuntimeException;
 use Throwable;
+use RuntimeException;
+use Monolog\Logger;
+use Monolog\Formatter\FormatterInterface;
+use Monolog\Formatter\ElasticsearchFormatter;
+use InvalidArgumentException;
+use Elasticsearch\Common\Exceptions\RuntimeException as ElasticsearchRuntimeException;
+use Elasticsearch\Client;
 
 /**
  * Elasticsearch handler
@@ -148,12 +148,44 @@ class ElasticsearchHandler extends AbstractProcessingHandler
             $responses = $this->client->bulk($params);
 
             if ($responses['errors'] === true) {
-                throw new ElasticsearchRuntimeException('Elasticsearch returned error for one of the records');
+                throw $this->createExceptionFromResponses($responses);
             }
         } catch (Throwable $e) {
             if (! $this->options['ignore_error']) {
                 throw new RuntimeException('Error sending messages to Elasticsearch', 0, $e);
             }
         }
+	}
+	
+	/**
+	 * Creates elasticsearch exception from responses array
+	 * 
+	 * Only the first error is converted into an exception.
+	 * 
+	 * @param array $responses returned by $this->client->bulk()
+	 */
+    protected function createExceptionFromResponses(array $responses): ElasticsearchRuntimeException
+    {
+    	foreach ($responses['items'] ?? [] as $item) {
+    		if (isset($item['index']['error'])) {
+    			return $this->createExceptionFromError($item['index']['error']);
+    		}
+    	}
+
+    	return new ElasticsearchRuntimeException('Elasticsearch failed to index one or more records.');
     }
+
+	/**
+	 * Creates elasticsearch exception from error array
+	 *
+	 * @param array $error
+	 */
+    protected function createExceptionFromError(array $error): ElasticsearchRuntimeException
+    {
+    	$previous = isset($error['caused_by']) ? $this->createExceptionFromError($error['caused_by']) : null;
+
+    	return new ElasticsearchRuntimeException($error['type'] . ': ' . $error['reason'], 0, $previous);
+	}
+	
+	
 }