Содержание
Мониторинг
Представьте, что вы реализуете мониторинг. Сбор метрик уже готов. Визуализацию тоже понятно, как сделать. Остаётся самое заковыристое — агрегировать полученные данные и преобразовать их в нужный формат для построения графиков.
Но как это сделать?
Как делают обычно
Обычно пишут какой-нибудь сервис на бэке, где используют разные либы: одна читает собранные данные, вторая агрегирует, третья перегоняет их в нужный формат.
Не то чтобы это очень сложно написать, но как-то всё многословно выглядит.
Но можно сделать проще.
Vector
Есть такая штука — Vector. Это мощный тулинг для построения observability пайплайнов. Он может читать, преобразовывать и сохранять результаты работы в нужном формате.
Пайплайн работы с данными описывается в виде yaml или toml файла. Необходимо указать три секции:
- sources — откуда прочитать данные;
- transforms — что сделать с данными;
- sinks — куда данные сохранить.
Вектор из коробки умеет работать со многими sources (файлы, логи, БД), может их по-всякому трансформировать и синкать в различные места (Prometheus, Datadog, Elasticsearch). В процессе трансформаций можно также использовать набор готовых функций, написанных на Vector Remap Language.
Пример пайплайна из документации вектора, в котором данные читаются из Kafka, парсятся и сохраняются в Elasticsearch:
sources:
kafka_in:
type: "kafka"
bootstrap_servers: "10.14.22.123:9092,10.14.23.332:9092"
group_id: "vector-logs"
key_field: "message"
topics: ["logs-*"]
transforms:
json_parse:
type: "remap"
inputs: ["kafka_in"]
source: |
parsed, err = parse_json(.message)
if err != null {
log(err, level: "error")
}
. |= object(parsed) ?? {}
sinks:
elasticsearch_out:
type: "elasticsearch"
inputs: ["json_parse"]
endpoint: "http://10.24.32.122:9000"
index: "logs-via-kafka"
У себя мы используем Vector для агрегации метрик web vitals, собранных с пользователей Дрома (RUM). И ребята на бэкенде тоже используют его для своих задач.
В общем, Vector — прям прикольная штука. Если у вас будут похожие задачи, то обязательно посмотрите в его сторону. Очень удобно.