Введение
Допустим, мы отправляем логи в ElasticSearch или Loki, извлекаем из них метрики для Prometheus. Все прекрасно, кроме 1 момента. Что, если логи не доходят до цели? Возникает ошибка при отправке логов на лог-сервер. Как это мониторить? Это проблема курицы и яйца. Для метрик мы используем логи, но логов нет.
Тут на помощь приходит простенькая программа Mtail. Она позволяет строить Prometheus метрики, читая текстовые файлы логов на сервере. Официальный сайт https://google.github.io/mtail/. Текущая версия - 3.0.9
Описание
Принцип работы схож с Awk. Указываем регулярку, которую нужно найти в строке. При совпадении, выполняем некие действия. Как правило, увиличиваем счетчик на единицу. Метрики хранятся в памяти, на диск не сохраняются. Но это и не нужно.
Пример, мониторим логи Fluent на наличие ошибок отправки данных в ElasticSearch.
mtail --progs /etc/mtail/td-agent-elastic --logs /var/log/fluent/fluentd.log --port 3903
--progs [dir] - директория с паттернами (программами).
--logs [file] - какой файл мониторить. Корректно обрабатывает ротацию. Можно передать несколько раз для разных файлов.
В директории /etc/mtail/td-agent-elastic создаем файл с расширением .mtail td-agent-elastic.mtail.
# Считаем и делим по тегам ошибки отправки в эластик
counter td_agent_elastic_errors by tag
/^.*dump an error event: .* tag="(?P<tag>[^"]+)".*$/ {
td_agent_elastic_errors[$tag]++
}
Для удобства лучше завести отдельного пользователя mtail и добавлять его в группы тех файлов, которые требуется читать.
Чтобы mtail поднимался при перезапуске машины, добавим его в systemd:
# /etc/systemd/system/mtail-td-agent-elastic.service
[Unit]
Description=Mtail log parser (td-agent-elastic)
After=network.target
[Service]
Type=simple
User=mtail
Group=mtail
ExecStart=/usr/bin/mtail -progs /etc/mtail/td-agent-elastic -logs /var/log/fluent/fluentd.log -port 3903
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target
Возможные ошибки
Метрика log_errors_total увеличивается, когда mtail не может прочитать указанный файл/
Заключение
Для сборка метрик существует множество способов. Но иногда встречаются случаи, когда они все не подходят и нужно собирать метрики именно с текстовых файлов на сервере. В этом случае и стоит обратить внимание на Mtail.
В статье рассмотрели базовый сценарий, как начать мониторить логи одной программы. В случае, если нужно мониторить более одной, использовать разные паттерны для разных типов файлов, можно поднять на другом порте еще один экземпляр mtail с другим набором параметров.