Мониторинг ошибок в Битриксе с помощью 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 схемы.
Любопытно посмотреть график возникновения ошибок за период: