null

Собираем урожай из логов: Vector

Начало

Зачастую перед разработчиками возникает задача передачи событий на другие сервисы/микросервисы. Это стандартная задача, которая обычно решается либо передачей данных через http, либо через брокеры сообщений, однако, могут возникнуть случаи, когда одни и те же события надо передать сразу в несколько мест, предварительно обработать или отфильтровать, что не очень удобно и красиво реализовывать в коде. В таком случае элегантным решением будет Vector. Vector - инструмент для сбора, преобразования и отправки данных логов, метрик и событий. Vector представляет собой роутер сообщений, который принимает сообщения из источников, при необходимости применяет к ним преобразования и отправляет в один или несколько стоков. Vector может являться заменой filebeat и logstash, так как может выступать в обоих ролях -  принимать и отправлять сообщения. Также, написан Vector на языке Rust, благодаря чему обладает более высокой производительностью и низким потреблением оперативной памяти по сравнению с конкурентами.

Для начала работы с Vector, нужно его установить, после чего можно сконфигурировать. 

curl --proto '=https' --tlsv1.2 -sSf https://sh.vector.dev | bash

Vector поддерживает 3 языка для конфигурации: TOML, YAML и JSON. Пример базовой конфигурации на языке TOML, который принимает данные из стандартного входа и перенаправляет их в консоль.

[sources.in]
type = "stdin"

[sinks.out]
inputs = ["in"]
type = "console"
encoding.codec = "text"

Модель данных Vector

Основные компоненты Vector

  • Sources

  • Transforms

  • Sinks

Sources

Vector может принимать данные из 40 разных источников, таких как HTTP, Kafka, Kubernetes logs и прочие. Для каждого типа источника есть свой шаблон конфигурации, который можно найти в официальной документации. Каждый шаблон позвляет тщательно настроить нужные параметры, индивидуальные для каждого типа, такие как задержка, максимальный размер и прочее.

Transforms

Преобразования существуют разных типов, мы рассмотрим 2 из них: Remap with VRL и Filter. VRL - предметно-ориентированный язык для изменения наблюдаемых данных. VRL имеет простой синтаксис и богатый набор встроенных функций. Пишутся программы на этом языке также в конфигурации. VRL взаимодействует со своим контекстом, который определен как символ точки. В контексте могут лежать объекты - .field = "value", которые определяются через ключ - значение. Объекты могут быть вложены друг в друга. Для любых элементов, которые не определены как объекты, или если для верхнего уровня задано скалярное значение, то для элемента будет установлен по умолчанию ключ message.

Пример remap конфигурации:

[transforms.modify]
type = "remap"
inputs = ["logs"]
source = '''
  del(.user_info)
  .timestamp = now()
'''

Не менее полезным инструментом являются фильтры, которые позволяют с помощью контекста и объектов, лежащих в нем, выбирать нужные сообщения, так как контекст передается через вход фильтра inputs. Фильтры поддерживают синтаксис VRL, но не позволяют выполнять в них преобразования, хоть и не выдают ошибку при попытке изменить данные.

Пример конфигурации фильтра:

[transforms.my_transform_id]
type = "filter"
inputs = [ "my-source-or-transform-id" ]
condition = '.level != "debug"'

Sinks

Vector может отправлять данные в 50 разных стоков, которые в основном повторяют источники. Для каждого типа стока также можно найти шаблон конфигурации в официальной документации. В стоках можно настроить все необходимые параметры для каждого заданного типа.