Интеграция Vector с ClickHouse
Способность анализировать ваши журналы в реальном времени критически важна для производственных приложений. Вы когда-нибудь задумывались, хорош ли ClickHouse для хранения и анализа журнальных данных? Просто посмотрите на опыт Uber в преобразовании своей инфраструктуры журналирования с ELK на ClickHouse.
Этот гид показывает, как использовать популярный конвейер данных Vector для отслеживания файла журнала Nginx и отправки его в ClickHouse. Шаги, приведенные ниже, будут аналогичны для отслеживания любого типа файла журнала. Мы будем считать, что ClickHouse уже запущен и что Vector установлен (правда, пока нет необходимости его запускать).
1. Создайте базу данных и таблицу
Давайте определим таблицу для хранения событий журналов:
-
Начнем с новой базы данных с именем
nginxdb
: -
Для начала мы просто вставим все событие журнала как одну строку. Очевидно, это не лучший формат для выполнения аналитики по журналам, но мы разберёмся с этой частью ниже, используя материализованные представления.
примечаниеНа данный момент нет необходимости в первичном ключе, поэтому ORDER BY установлен на tuple().
2. Настройте Nginx
Мы, конечно, не хотим тратить слишком много времени на объяснение Nginx, но также не хотим прятать все детали, поэтому на этом этапе мы предоставим вам достаточно информации для настройки журналирования Nginx.
-
Следующее свойство
access_log
отправляет журналы в/var/log/nginx/my_access.log
в смешанном формате. Это значение помещается в секциюhttp
вашего файлаnginx.conf
: -
Убедитесь, что вы перезапустили Nginx, если вам нужно было изменить
nginx.conf
. -
Сгенерируйте некоторые события журнала в журнале доступа, посетив страницы на вашем веб-сервере. Журналы в смешанном формате имеют следующий вид:
3. Настройте Vector
Vector собирает, преобразовывает и маршрутизирует журналы, метрики и трассировки (называемые источниками) к множеству различных поставщиков (называемых стоками), включая совместимость с ClickHouse из коробки. Источники и стоки определяются в файле конфигурации с именем vector.toml.
-
Следующий vector.toml определяет источник типа file, который отслеживает конец my_access.log, а также определяет сток как таблицу access_logs, описанную выше:
-
Запустите Vector, используя приведенную выше конфигурацию. Посетите документацию Vector для получения дополнительной информации о том, как определять источники и стоки.
-
Убедитесь, что журналы доступа вставляются в ClickHouse. Выполните следующий запрос, и вы должны увидеть журналы доступа в вашей таблице:
4. Разбор журналов
Иметь журналы в ClickHouse — это здорово, но хранение каждого события как одной строки не позволяет проводить серьезный анализ данных. Давайте посмотрим, как разобрать события журналов, используя материализованное представление.
-
Материализованное представление (МП, сокращенно) — это новая таблица, основанная на существующей таблице, и когда вставляются данные в существующую таблицу, новые данные также добавляются в материализованное представление. Давайте определим МП, которое содержит разобранное представление событий журналов в access_logs, другими словами:
В ClickHouse есть различные функции для разбора строки, но для начала давайте рассмотрим splitByWhitespace - которая разбивает строку по пробелам и возвращает каждый токен в массиве. Для демонстрации выполните следующую команду:
Обратите внимание, что ответ довольно близок к тому, что мы хотим! Несколько строк содержат лишние символы, и пользовательский агент (данные о браузере) не требовалось разбирать, но мы решим эту проблему на следующем шаге:
-
Аналогично splitByWhitespace, функция splitByRegexp разбивает строку на массив на основе регулярного выражения. Выполните следующую команду, которая возвращает две строки.
Обратите внимание, что вторая возвращенная строка — это успешно разобранный пользовательский агент из журнала:
-
Прежде чем рассмотреть окончательную команду CREATE MATERIALIZED VIEW, давайте взглянем на пару дополнительных функций, используемых для очистки данных. Например,
RequestMethod
выглядит как "GET с нежелательной двойной кавычкой. Выполните следующую функцию trim, которая удаляет двойную кавычку: -
Строка времени имеет ведущую квадратную скобку и также не находится в формате, который ClickHouse может разобрать в дату. Однако, если мы изменим разделитель с двоеточия (:) на запятую (,), то разбор будет работать отлично:
-
Теперь мы готовы определить наше материализованное представление. Наша реализация включает POPULATE, что означает, что существующие строки в access_logs будут обработаны и вставлены немедленно. Выполните следующий SQL-запрос:
-
Теперь проверьте, что это сработало. Вы должны увидеть журналы доступа, красиво разбитые на столбцы:
примечаниеУрок выше сохранил данные в двух таблицах, но вы можете изменить первоначальную таблицу
nginxdb.access_logs
, чтобы использовать движок таблиц Null - разобранные данные все равно окажутся в таблицеnginxdb.access_logs_view
, но необработанные данные не будут храниться в таблице.
Резюме: Используя Vector, для установки и быстрой настройки которого требовалось всего лишь немного времени, мы можем отправлять журналы с сервера Nginx в таблицу ClickHouse. С помощью умного материализованного представления мы можем разбить эти журналы на столбцы для упрощения аналитики.