Перейти к основному содержимому
Перейти к основному содержимому

Интеграция Vector с ClickHouse

Возможность анализа ваших журналов в реальном времени критически важна для приложений в производственной среде. Когда-либо задумывались о том, насколько хорошо ClickHouse может хранить и анализировать данные журналов? Просто ознакомьтесь с опытом Uber по переходу от ELK к ClickHouse.

Этот гид показывает, как использовать популярный инструмент для обработки данных Vector, чтобы следить за файлом журнала Nginx и отправлять его в ClickHouse. Шаги ниже будут аналогичны для отслеживания любого типа файла журнала. Мы предполагаем, что ClickHouse уже установлен и работает, и Vector тоже установлен (но пока не нужно его запускать).

1. Создайте базу данных и таблицу

Давайте определим таблицу для хранения событий журнала:

  1. Начнем с новой базы данных с именем nginxdb:

  2. Для начала мы просто будем вставлять все события журнала как одну строку. Очевидно, это не лучший формат для выполнения аналитики на данных журнала, но мы решим эту часть ниже с использованием материализованных представлений.

    примечание

    На самом деле пока нет необходимости в первичном ключе, поэтому ORDER BY установлен на tuple().

2. Настройка Nginx

Мы не хотим тратить слишком много времени на объяснение Nginx, но также не хотим скрывать все детали, поэтому на этом этапе мы предоставим вам достаточно информации для настройки журналирования в Nginx.

  1. Свойство access_log отправляет журналы в /var/log/nginx/my_access.log в формате combined. Это значение помещается в раздел http вашего файла nginx.conf:

  2. Обязательно перезапустите Nginx, если вы вносили изменения в nginx.conf.

  3. Сгенерируйте несколько событий журнала в журнале доступа, посетив страницы на вашем веб-сервере. Журналы в формате combined имеют следующий формат:

3. Настройка Vector

Vector собирает, преобразует и направляет журналы, метрики и трассировки (называемые источниками) к различным поставщикам (называемым приемниками), включая интеграцию с ClickHouse "из коробки". Источники и приемники определяются в конфигурационном файле с именем vector.toml.

  1. Следующий vector.toml определяет источник типа file, который отслеживает конец my_access.log, и также определяет приемник как таблицу access_logs, определенную выше:

  2. Запустите Vector, используя приведенную конфигурацию. Посетите документацию Vector для подробной информации о том, как определять источники и приемники.

  3. Проверьте, что журналы доступа вставляются в ClickHouse. Выполните следующий запрос, и вы должны увидеть журналы доступа в своей таблице:

    Просмотр журналов

4. Парсинг журналов

Хранение журналов в ClickHouse отлично, но хранение каждого события как одной строки не позволяет проводить много анализа данных. Давайте посмотрим, как разобрать события журнала, используя материализованное представление.

  1. Материализованное представление (сокращенно MV) — это новая таблица на основе существующей таблицы, и когда вставки выполняются в существующую таблицу, новые данные также добавляются в материализованное представление. Давайте посмотрим, как определить MV, которое содержит разобранное представление событий журнала в access_logs, другими словами:

    В ClickHouse есть различные функции для разбора строки, но для начала давайте взглянем на splitByWhitespace — который разбивает строку по пробелам и возвращает каждый токен в массиве. Чтобы продемонстрировать, выполните следующую команду:

    Обратите внимание, что ответ довольно близок к тому, что мы хотим! Некоторые строки имеют дополнительные символы, и пользовательский агент (данные о браузере) не нужно разбирать, но мы решим это на следующем шаге:

  2. Аналогично splitByWhitespace, функция splitByRegexp разбивает строку на массив, основываясь на регулярном выражении. Выполните следующую команду, которая возвращает две строки.

    Обратите внимание, что вторая строка, возвращаемая — это пользовательский агент, успешно разобранный из журнала:

  3. Прежде чем рассматривать окончательную команду CREATE MATERIALIZED VIEW, давайте посмотрим на еще несколько функций, используемых для очистки данных. Например, RequestMethod выглядит как "GET с ненужной двойной кавычкой. Выполните следующую функцию trim, которая удаляет двойную кавычку:

  4. Строка времени имеет ведущую квадратную скобку и также не находится в формате, который ClickHouse может разобрать в дату. Однако, если мы изменим разделитель с двоеточия (:) на запятую (,), то парсинг будет работать отлично:

  5. Теперь мы готовы определить наше материализованное представление. Наша определение включает POPULATE, что означает, что существующие строки в access_logs будут обработаны и вставлены сразу. Выполните следующий оператор SQL:

  6. Теперь проверьте, что это сработало. Вы должны увидеть журналы доступа, красиво разобранные на колонки:

    Просмотр журналов
    примечание

    В уроке выше данные были хранены в двух таблицах, но вы можете изменить начальную таблицу nginxdb.access_logs, чтобы использовать движок таблицы Null - разобранные данные все равно попадут в таблицу nginxdb.access_logs_view, но необработанные данные не будут храниться в таблице.

Резюме: Используя Vector, который требует лишь простой установки и быстрой настройки, мы можем отправлять журналы с сервера Nginx в таблицу ClickHouse. С помощью умного материализованного представления мы можем разбивать эти журналы на колонки для более удобной аналитики.