Помощна програма Nginx-log-collector от Avito за изпращане на nginx регистрационни файлове към Clickhouse

Тази статия ще обсъди проекта nginx-log-collector, който ще прочете регистрационните файлове на nginx, ще ги изпрати до клъстера Clickhouse. Обикновено ElasticSearch се използва за регистрационни файлове. Clickhouse изисква по-малко ресурси (дисково пространство, RAM, CPU). Clickhouse записва данни по-бързо. Clickhouse компресира данните, което прави данните на диска още по-компактни. Ползите от Clickhouse могат да се видят в 2 слайда от доклада Как VK вмъква данни в ClickHouse от десетки хиляди сървъри.

Помощна програма Nginx-log-collector от Avito за изпращане на nginx регистрационни файлове към Clickhouse

Помощна програма Nginx-log-collector от Avito за изпращане на nginx регистрационни файлове към Clickhouse

За да видите анализите по регистрационни файлове, нека създадем табло за управление за Grafana.

На кого му пука, добре дошъл под кат.

Инсталирайте nginx, grafana по стандартния начин.

Инсталирайте клъстер clickhouse с ansible-playbook от Денис Проскурин.

Създаване на база данни и таблици в Clickhouse

В този файл Описани са SQL заявки за създаване на бази данни и таблици за nginx-log-collector в Clickhouse.

Правим всяка заявка на свой ред на всеки сървър от клъстера Clickhouse.

Важна забележка. В този ред logs_cluster трябва да се замени с името на вашия клъстер от файла clickhouse_remote_servers.xml между „remote_servers“ и „shard“.

ENGINE = Distributed('logs_cluster', 'nginx', 'access_log_shard', rand())

Инсталиране и конфигуриране на nginx-log-collector-rpm

Nginx-log-collector няма rpm. Тук https://github.com/patsevanton/nginx-log-collector-rpm създайте rpm за него. rpm ще бъде изграден с помощта на Fedora Copr

Инсталирайте rpm пакет nginx-log-collector-rpm

yum -y install yum-plugin-copr
yum copr enable antonpatsev/nginx-log-collector-rpm
yum -y install nginx-log-collector
systemctl start nginx-log-collector

Редактирайте конфигурацията /etc/nginx-log-collector/config.yaml:

  .......
  upload:
    table: nginx.access_log
    dsn: http://ip-адрес-кластера-clickhouse:8123/

- tag: "nginx_error:"
  format: error  # access | error
  buffer_size: 1048576
  upload:
    table: nginx.error_log
    dsn: http://ip-адрес-кластера-clickhouse:8123/

Настройване на nginx

Обща конфигурация на nginx:

user  nginx;
worker_processes  auto;

#error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    log_format avito_json escape=json
                     '{'
                     '"event_datetime": "$time_iso8601", '
                     '"server_name": "$server_name", '
                     '"remote_addr": "$remote_addr", '
                     '"remote_user": "$remote_user", '
                     '"http_x_real_ip": "$http_x_real_ip", '
                     '"status": "$status", '
                     '"scheme": "$scheme", '
                     '"request_method": "$request_method", '
                     '"request_uri": "$request_uri", '
                     '"server_protocol": "$server_protocol", '
                     '"body_bytes_sent": $body_bytes_sent, '
                     '"http_referer": "$http_referer", '
                     '"http_user_agent": "$http_user_agent", '
                     '"request_bytes": "$request_length", '
                     '"request_time": "$request_time", '
                     '"upstream_addr": "$upstream_addr", '
                     '"upstream_response_time": "$upstream_response_time", '
                     '"hostname": "$hostname", '
                     '"host": "$host"'
                     '}';

    access_log     syslog_server=unix:/var/run/nginx_log.sock,nohostname,tag=nginx avito_json; #ClickHouse
    error_log      syslog_server=unix:/var/run/nginx_log.sock,nohostname,tag=nginx_error; #ClickHouse

    #access_log  /var/log/nginx/access.log  main;

    proxy_ignore_client_abort on;
    sendfile        on;
    keepalive_timeout  65;
    include /etc/nginx/conf.d/*.conf;
}

Виртуален хост едно:

vhost1.conf:

upstream backend {
    server ip-адрес-сервера-с-stub_http_server:8080;
    server ip-адрес-сервера-с-stub_http_server:8080;
    server ip-адрес-сервера-с-stub_http_server:8080;
    server ip-адрес-сервера-с-stub_http_server:8080;
    server ip-адрес-сервера-с-stub_http_server:8080;
}

server {
    listen   80;
    server_name vhost1;
    location / {
        proxy_pass http://backend;
    }
}

Добавете виртуални хостове към файла /etc/hosts:

ip-адрес-сервера-с-nginx vhost1

Емулатор на HTTP сървър

Като емулатор на HTTP сървър, който ще използваме nodejs-stub-сървър от Максим Игнатенко

nodejs-stub-сървърът няма rpm. Тук https://github.com/patsevanton/nodejs-stub-server създайте rpm за него. rpm ще бъде изграден с помощта на Fedora Copr

Инсталирайте пакета nodejs-stub-server на upstream nginx rpm

yum -y install yum-plugin-copr
yum copr enable antonpatsev/nodejs-stub-server
yum -y install stub_http_server
systemctl start stub_http_server

Стрес тестване

Тестването се извършва с помощта на бенчмарк на Apache.

Инсталирайте го:

yum install -y httpd-tools

Започваме да тестваме с помощта на бенчмарк на Apache от 5 различни сървъра:

while true; do ab -H "User-Agent: 1server" -c 10 -n 10 -t 10 http://vhost1/; sleep 1; done
while true; do ab -H "User-Agent: 2server" -c 10 -n 10 -t 10 http://vhost1/; sleep 1; done
while true; do ab -H "User-Agent: 3server" -c 10 -n 10 -t 10 http://vhost1/; sleep 1; done
while true; do ab -H "User-Agent: 4server" -c 10 -n 10 -t 10 http://vhost1/; sleep 1; done
while true; do ab -H "User-Agent: 5server" -c 10 -n 10 -t 10 http://vhost1/; sleep 1; done

Настройка на Графана

Няма да намерите табло на официалния сайт на Grafana.

Затова ще го направим на ръка.

Можете да намерите моето запазено табло тук.

Трябва също да създадете таблична променлива със съдържанието nginx.access_log.
Помощна програма Nginx-log-collector от Avito за изпращане на nginx регистрационни файлове към Clickhouse

Общ брой заявки за Singlestat:

SELECT
 1 as t,
 count(*) as c
 FROM $table
 WHERE $timeFilter GROUP BY t

Помощна програма Nginx-log-collector от Avito за изпращане на nginx регистрационни файлове към Clickhouse

Неуспешни заявки за Singlestat:

SELECT
 1 as t,
 count(*) as c
 FROM $table
 WHERE $timeFilter AND status NOT IN (200, 201, 401) GROUP BY t

Помощна програма Nginx-log-collector от Avito за изпращане на nginx регистрационни файлове към Clickhouse

Процент на неуспех на Singlestat:

SELECT
 1 as t, (sum(status = 500 or status = 499)/sum(status = 200 or status = 201 or status = 401))*100 FROM $table
 WHERE $timeFilter GROUP BY t

Помощна програма Nginx-log-collector от Avito за изпращане на nginx регистрационни файлове към Clickhouse

Средно време за реакция на Singlestat:

SELECT
 1, avg(request_time) FROM $table
 WHERE $timeFilter GROUP BY 1

Помощна програма Nginx-log-collector от Avito за изпращане на nginx регистрационни файлове към Clickhouse

Максимално време за реакция на Singlestat:

SELECT
 1 as t, max(request_time) as c
 FROM $table
 WHERE $timeFilter GROUP BY t

Помощна програма Nginx-log-collector от Avito за изпращане на nginx регистрационни файлове към Clickhouse

Състояние на преброяване:

$columns(status, count(*) as c) from $table

Помощна програма Nginx-log-collector от Avito за изпращане на nginx регистрационни файлове към Clickhouse

За да изведете данни като пай, трябва да инсталирате плъгина и да презаредите grafana.

grafana-cli plugins install grafana-piechart-panel
service grafana-server restart

Пай ТОП 5 Статус:

SELECT
    1, /* fake timestamp value */
    status,
    sum(status) AS Reqs
FROM $table
WHERE $timeFilter
GROUP BY status
ORDER BY Reqs desc
LIMIT 5

Помощна програма Nginx-log-collector от Avito за изпращане на nginx регистрационни файлове към Clickhouse

Освен това ще давам заявки без екранни снимки:

Брой http_user_agent:

$columns(http_user_agent, count(*) c) FROM $table

GoodRate/BadRate:

$rate(countIf(status = 200) AS good, countIf(status != 200) AS bad) FROM $table

време за отговор:

$rate(avg(request_time) as request_time) FROM $table

Време за реакция нагоре по веригата (време за реакция на 1-ви нагоре по веригата):

$rate(avg(arrayElement(upstream_response_time,1)) as upstream_response_time) FROM $table

Състояние на броя на таблиците за всички vhost-ове:

$columns(status, count(*) as c) from $table

Общ изглед на таблото

Помощна програма Nginx-log-collector от Avito за изпращане на nginx регистрационни файлове към Clickhouse

Помощна програма Nginx-log-collector от Avito за изпращане на nginx регистрационни файлове към Clickhouse

Помощна програма Nginx-log-collector от Avito за изпращане на nginx регистрационни файлове към Clickhouse

Сравняване на avg() и quantile()

ср.()
Помощна програма Nginx-log-collector от Avito за изпращане на nginx регистрационни файлове към Clickhouse
квантил()
Помощна програма Nginx-log-collector от Avito за изпращане на nginx регистрационни файлове към Clickhouse

Заключение:

Надяваме се общността да се включи в разработването/тестването и използването на nginx-log-collector.
И когато някой имплементира nginx-log-collector, той ще ви каже колко е спестил диск, RAM, CPU.

Телеграм канали:

Милисекунди:

Който се интересува от милисекунди, моля, пишете или гласувайте за това издаване.

Източник: www.habr.com

Добавяне на нов коментар