Решил перевести логи Nginx’а в Google BQ. Сначала хотел перенести в Elastic, но лень было поднимать сервер, а Big Query уже готов. Вот, как это делается на Debian.
Инструкция подходит и для Ubuntu, CentOS (используйте соответствующий менеджер пакетов).
Для этого нам понадобится:
- root SSH доступ к серверу
- Созданный проект и датасет в Google BQ
- Созданный сервисный аккаунт и JSON-ключ (файл) к нему
Логинимся на сервер, обновляем информацию о пакетах, ставим sudo (если еще не устанавливали)
# apt update
# apt install sudo
Ставим td-agent, команды для разных ОС вы найдете по ссылке.
В моем случае это:
# curl -fsSL https://toolbelt.treasuredata.com/sh/install-debian-buster-td-agent4.sh | sh
Далее запускаем и проверяем работоспособность:
# sudo systemctl start td-agent.service
# sudo systemctl status td-agent.service
Если видим подобное сообщение, значит все ОК:
● td-agent.service - td-agent: Fluentd based data collector for Treasure Data
Loaded: loaded (/lib/systemd/system/td-agent.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2022-08-10 08:06:06 CEST; 39s ago
Docs: https://docs.treasuredata.com/display/public/PD/About+Treasure+Data%27s+Server-Side+Agent
Process: 29000 ExecStart=/opt/td-agent/bin/fluentd --log $TD_AGENT_LOG_FILE --daemon /var/run/td-agent/td-agent.pid $TD_AGENT_OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 29099 (fluentd)
Tasks: 9 (limit: 4915)
Memory: 77.0M
CGroup: /system.slice/td-agent.service
├─29099 /opt/td-agent/bin/ruby /opt/td-agent/bin/fluentd --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid
└─29102 /opt/td-agent/bin/ruby -Eascii-8bit:ascii-8bit /opt/td-agent/bin/fluentd --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid --under-supervisor
Aug 10 08:06:05 vmi382323.contaboserver.net systemd[1]: Starting td-agent: Fluentd based data collector for Treasure Data...
Aug 10 08:06:06 vmi3823.server.net systemd[1]: Started td-agent: Fluentd based data collector for Treasure Data.
Следующим этапом ставим плагин для работы с Google Big Query — fluent-plugin-bigquery:
# sudo td-agent-gem install fluent-plugin-bigquery
Может занять некоторое время. У меня «зависает» на этапе «Parsing documentation for google-api-client-0.53.0», но на самом деле нужно просто подождать.
Настраиваем Nginx
После чего я меняю формат access лога для более удобного распаршивания. В nginx.conf (вы должны знать где он лежит) я привожу access log к виду:
log_format ltsv "time:$time_local"
"\tvhost:$host"
"\treq:$request"
"\tstatus:$status"
"\tremote_addr:$remote_addr"
"\tforwardedfor:$http_x_forwarded_for"
"\tua:$http_user_agent"
"\treferer:$http_referer"
"\tsize:$body_bytes_sent"
"\treqtime:$request_time"
"\tremoteuser:$remote_user";
access_log /var/log/nginx/access.log ltsv;
И делаю reload nginx:
# nginx -s reload
TD-agent будет парсить файл /var/log/nginx/access.log и стримить его в таблицу в BQ.
Настраиваем Td-agent
Все настройки будем производить в файле /etc/td-agent/td-agent.conf. Таблицу сами создавать не будем, а сделаем так, чтобы она создавалась автоматически.
Обнуляем файл /etc/td-agent/td-agent.conf:
# cp /dev/null /etc/td-agent/td-agent.conf
Теперь открываем этот же файл в удобном редакторе и пишем:
<source>
@type tail
tag accesslog
path /var/log/nginx/access.log
pos_file /var/log/td-agent/nginx.pos
format ltsv
time_format %d/%b/%Y:%H:%M:%S %z
</source>
<match accesslog>
@type bigquery_insert
auth_method json_key
email {EMAIL}
json_key {KEY_FILE}
project {PROJECT}
dataset {DATASET}
tables {TABLE}
auto_create_table true
schema [{"name":"time","type":"STRING"},{"name":"vhost","type":"STRING"},{"name":"req","type":"STRING"},{"name":"status","type":"STRING"},{"name":"remote_addr","type":"STRING"},{"name":"forwardedfor","type":"STRING"},{"name":"ua","type":"STRING"},{"name":"referer","type":"STRING"},{"name":"size","type":"STRING"},{"name":"reqtime","type":"STRING"},{"name":"remoteuser","type":"STRING"}]
<inject>
time_key time
time_type string
time_format %Y-%m-%d %H:%M:%S
</inject>
<buffer>
flush_interval 0.1 # flush as frequent as possible
total_limit_size 10g
flush_thread_count 16
</buffer>
</match>
Где:
- {EMAIL} — почта сервисного аккаунта
- {KEY_FILE} — путь до файла с ключом от сервисного аккаунта (json файл)
- {PROJECT} — название проекта в BQ
- {DATASET} — название датасета
- {TABLE} — название создаваемой таблицы
И перезапускаем td-agent:
# systemctl restart td-agent
Логи можно смотреть в файле /var/log/td-agent/td-agent.log
#Updated 3.10.2022
Если трафика много, то таблица нереально разрастается и стоимость запросов для анализа будет довольно высока. Я нашел 2 варианта, что можно сделать:
- Использовать в настройках td-agent опцию для выгрузки в партиционные таблицы, но тогда вы не будете видеть данные реалтайм
- Написать 2 скрипта (что сделал я): первый выгружает данные за вчера в партиционную таблицу, а второй скрипт удаляет устаревшие данные из стримминговой таблицы. Задание работает раз в сутки.