Integrating Vector with ClickHouse
Возможность анализировать логи в реальном времени критически важна для production-приложений. ClickHouse превосходно справляется с хранением и анализом логов благодаря отличному сжатию (до 170x для логов) и способности быстро агрегировать большие объемы данных.
Данное руководство показывает, как использовать популярный конвейер данных Vector для отслеживания файла логов Nginx и отправки данных в ClickHouse. Приведенные ниже шаги аналогичны для отслеживания файлов логов любого типа.
Предварительные требования:
- У вас уже установлен и запущен ClickHouse
- У вас установлен Vector
Создание базы данных и таблицы
Определите таблицу для хранения событий логов:
- Сначала создайте новую базу данных с именем
nginxdb:
- Вставьте всё событие лога как одну строку. Очевидно, что это не лучший формат для проведения аналитики по данным логов, но ниже мы разберёмся с этим, используя materialized views.
ORDER BY установлен в tuple() (пустой кортеж), так как первичный ключ пока не требуется.
Настройка Nginx
На этом шаге будет показано, как настроить логирование Nginx.
- Следующая директива
access_logзаписывает логи в/var/log/nginx/my_access.logв формате combined. Это значение указывается в разделеhttpфайлаnginx.conf:
-
Обязательно перезапустите Nginx, если вы изменяли файл
nginx.conf. -
Сгенерируйте несколько событий в журнале доступа (access log), переходя по страницам вашего веб-сервера. Записи журнала в формате combined выглядят следующим образом:
Настройка Vector
Vector собирает, преобразует и маршрутизирует логи, метрики и трейсы (далее — источники) в различные сервисы (далее — приёмники), включая встроенную «из коробки» совместимость с ClickHouse. Источники и приёмники определяются в конфигурационном файле vector.toml.
- Следующий файл vector.toml определяет source типа file, который непрерывно считывает новые записи из конца файла my_access.log, а также определяет sink, направляющий данные в таблицу access_logs, описанную выше:
-
Запустите Vector с приведённой выше конфигурацией. За дополнительной информацией об определении источников и приёмников обращайтесь к документации Vector.
-
Убедитесь, что логи доступа записываются в ClickHouse, выполнив следующий запрос. В своей таблице вы должны увидеть эти логи доступа:

Разбор логов
Хранить логи в ClickHouse полезно, но сохранение каждого события в виде одной строки не дает больших возможностей для анализа данных. Далее мы рассмотрим, как разбирать события логов с помощью материализованного представления.
Материализованное представление работает подобно триггеру на INSERT в SQL. Когда строки данных вставляются в исходную таблицу, материализованное представление выполняет над ними некоторые преобразования и вставляет результаты в целевую таблицу. The materialized view can be configured to configure a parsed representation of the log events in access_logs. An example of one such log event is shown below:
В ClickHouse есть различные функции для разбора приведённой выше строки. Функция splitByWhitespace разбирает строку по пробельным символам и возвращает каждый токен в виде элемента массива.
Для демонстрации выполните следующую команду:
В некоторых строках есть лишние символы, а user agent (сведения о браузере) не требовалось парсить, но получившийся массив близок к нужному.
Аналогично функции splitByWhitespace, функция splitByRegexp разбивает строку на массив по регулярному выражению.
Выполните следующую команду, которая вернёт две строки.
Обратите внимание, что вторая возвращаемая строка — это user agent, успешно разобранный из лога:
Прежде чем перейти к итоговой команде CREATE MATERIALIZED VIEW, давайте рассмотрим ещё пару функций, используемых для очистки данных.
Например, поле RequestMethod имеет значение "GET, то есть содержит лишнюю двойную кавычку.
Вы можете использовать функцию trimBoth (псевдоним trim), чтобы удалить двойную кавычку:
Строка с датой начинается с квадратной скобки и при этом имеет формат, который ClickHouse не может разобрать как дату. Однако, если мы заменим разделитель с двоеточия (:) на запятую (,), разбор уже работает отлично:
Теперь мы готовы определить materialized view.
В определение ниже включено POPULATE, что означает, что существующие строки в access_logs будут сразу обработаны и вставлены.
Выполните следующий SQL-запрос:
Теперь убедитесь, что всё работает. Вы должны увидеть, что логи доступа аккуратно разобраны по столбцам:

В приведённом выше примере данные сохранялись в двух таблицах, но вы можете изменить исходную таблицу nginxdb.access_logs, чтобы она использовала движок таблиц Null.
Разобранные данные по-прежнему попадут в таблицу nginxdb.access_logs_view, но исходные данные не будут сохраняться в таблице.
Используя Vector, который требует лишь простой установки и быстрой настройки, вы можете отправлять журналы с сервера Nginx в таблицу ClickHouse. Используя materialized view, вы можете разобрать эти журналы по столбцам для упрощения аналитики.