Мониторинг ошибок в Битриксе с помощью Zabbix
Артем Житник
Программисты люди занятые (или ленивые), поэтому они выкатывают проект и переключаются к другим задачам. Если что-то не работает - заказчик сообщит, а ему соответственно пожалуются пользователи. По хорошему, периодически нужно заглядывать в логи ошибок Битрикса на предмет наличия новых записей. Такой рутиной мало кто занимается.
А что если считать ошибки и этот счетчик передавать в уже настроенный мониторинг Zabbix? Добавляем highloadblock ErrorCounter с одним единственным полем "UF_CREATED" типа дата/время со значением по умолчанию - текущее время. Создаем кастомный обработчик ошибок:
namespace MyNamespace\Monitoring; use Bitrix\Main\Diag\FileExceptionHandlerLog; use Bitrix\Main\Loader; use Bitrix\Main\ORM\Data\DataManager; use Exception; use Bitrix\Highloadblock\HighloadBlockTable; Loader::includeModule("highloadblock"); class ExceptionCounter extends FileExceptionHandlerLog { /** * @param Exception $exception * @param int $logType */ public function write($exception, $logType) { parent::write($exception, $logType); self::getCounterDataClass()::add([]); } /** * @return DataManager|string */ public static function getCounterDataClass() { return HighloadBlockTable::compileEntity("ErrorCounter")->getDataClass(); } }
В .settings.php прописываем наш класс в свойство class_name:
'exception_handling' => array ( 'value' => array ( 'debug' => true, 'handled_errors_types' => 4437, 'exception_errors_types' => 4437, 'ignore_silence' => false, 'assertion_throws_exception' => true, 'assertion_error_type' => 256, 'log' => array ( 'settings' => array ( 'file' => 'error.log', 'log_size' => 1000000, ), 'class_name' => 'MyNamespace\Monitoring\ExceptionCounter', ), ), 'readonly' => false, ),
После этого, при возникновении исключения, в счетчик записывается значение. Лог также пишется, как раньше.
Далее дело техники. Делается запрос выбора записей за последние сутки, считается количество результатов. Это и будут данные для наблюдения в Zabbix. Если значение 0, значит ошибок за день не было, если больше 0 - показывать триггер
Если есть сообщение - иду в логи смотреть что произошло, нет - курю бамбук. Момент фильтрации ошибок для счетчика опустил. Бывает что не нужно фиксировать проблему, например если код выполняется администратором из консоли PHP в админке. Отправку данных счетчика в Zabbix выполнил через расширение GraphQL схемы.
Любопытно посмотреть график возникновения ошибок за период: