From c8cd53dc0f486acdc07fd6467646b25459b98d0f Mon Sep 17 00:00:00 2001 From: Karolis Date: Sat, 7 Dec 2019 10:08:00 +0000 Subject: [PATCH] More detailed ElasticsearchHandler exceptions --- src/Monolog/Handler/ElasticsearchHandler.php | 48 ++++++++++++++++---- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/src/Monolog/Handler/ElasticsearchHandler.php b/src/Monolog/Handler/ElasticsearchHandler.php index 6d0021b9..ed9a2bc5 100644 --- a/src/Monolog/Handler/ElasticsearchHandler.php +++ b/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); + } + + }