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

Разбор логов
Хранить логи в ClickHouse полезно, но сохранение каждого события в виде одной строки не дает больших возможностей для анализа данных. Далее мы рассмотрим, как разбирать события логов с помощью материализованного представления.
Материализованное представление работает подобно триггеру на INSERT в SQL. Когда строки данных вставляются в исходную таблицу, материализованное представление выполняет над ними некоторые преобразования и вставляет результаты в целевую таблицу. Материализованное представление можно настроить так, чтобы формировать разобранное представление событий логов в access_logs. Ниже приведен пример одного такого события лога:
В ClickHouse есть различные функции для разбора приведённой выше строки. Функция splitByWhitespace разбирает строку по пробельным символам и возвращает каждый токен в виде элемента массива.
Для демонстрации выполните следующую команду:
В некоторых строках есть лишние символы, а user agent (сведения о браузере) не требуется парсить, но получившийся массив близок к нужному.
Аналогично функции splitByWhitespace, функция splitByRegexp разбивает строку на массив по регулярному выражению.
Выполните следующую команду, которая вернёт две строки.
Обратите внимание, что вторая возвращаемая строка — это User-Agent, успешно разобранный из лога:
Прежде чем перейти к итоговой команде CREATE MATERIALIZED VIEW, давайте рассмотрим ещё пару функций, используемых для очистки данных.
Например, поле RequestMethod имеет значение "GET, то есть содержит лишнюю двойную кавычку.
Вы можете использовать функцию trimBoth (псевдоним trim), чтобы удалить двойную кавычку:
Строка с датой начинается с квадратной скобки и при этом имеет формат, который ClickHouse не может разобрать как дату. Однако, если мы заменим разделитель с двоеточия (:) на запятую (,), разбор уже работает отлично:
Теперь мы готовы определить материализованное представление.
Определение ниже включает POPULATE, что означает, что существующие строки в access_logs будут обработаны и вставлены сразу же.
Выполните следующую SQL-команду:
Теперь убедитесь, что всё работает. Вы должны увидеть журналы доступа, корректно разобранные по столбцам:

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