Nginx-log-collector алатка од Avito за испраќање nginx логови до Clickhouse

Оваа статија ќе разговара за проектот nginx-log-колектор, кој ќе ги чита nginx логовите и ќе ги испрати во кластерот Clickhouse. Обично ElasticSearch се користи за дневници. Clickhouse бара помалку ресурси (простор на диск, RAM, процесор). Clickhouse побрзо снима податоци. Clickhouse ги компресира податоците, што ги прави податоците на дискот уште покомпактни. Предностите на Clickhouse се видливи во 2 слајдови од извештајот Како VK вметнува податоци во ClickHouse од десетици илјади сервери.

Nginx-log-collector алатка од Avito за испраќање nginx логови до Clickhouse

Nginx-log-collector алатка од Avito за испраќање nginx логови до Clickhouse

За да ја видите аналитиката заснована на дневници, ќе создадеме контролна табла за Grafana.

Секој заинтересиран, добредојде во мачка.

Инсталирајте го nginx, grafana на стандарден начин.

Инсталирање на кластер за кликање користејќи ansible-playbook from Денис Проскурин.

Креирање бази на податоци и табели во 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 нема вртежи во минута. Еве https://github.com/patsevanton/nginx-log-collector-rpm креирајте вртежи во минута за тоа. вртежи во минута ќе се компајлира со користење Федора Копр

Инсталирајте го пакетот 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-никулец-сервер од Максим Игнатенко

Nodejs-stub-server нема вртежи во минута. Еве https://github.com/patsevanton/nodejs-stub-server креирајте вртежи во минута за тоа. вртежи во минута ќе се компајлира со користење Федора Копр

Инсталирајте го пакетот 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

Поставување на Графана

Нема да најдете контролна табла на официјалната веб-страница на Графана.

Затоа, тоа ќе го направиме со рака.

Можете да ја најдете мојата зачувана контролна табла тука.

Исто така, треба да креирате променлива на табелата со содржината 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

Добра/лоша стапка:

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

Време на одговор:

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

Време на одговор нагоре (прво време на одговор нагоре):

$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

Додадете коментар