Nginx-log-collector, utilitet nga Avito për dërgimin e logeve të nginx në Clickhouse

Në këtë artikull do të shqyrtohet projekti nginx-log-collector, i cili do të lexojë logjet e nginx, duke i dërguar ato në klasterin Clickhouse. Zakonisht për logjet përdoret ElasticSearch. Për Clickhouse kërkohen më pak burime (hapësirë disku, RAM, CPU). Clickhouse shkruan të dhënat më shpejt. Clickhouse kompreson të dhënat, çka i bën ato më kompakte në disk. Avantazhet e Clickhouse janë të dukshme në 2 diapozita nga prezantimi Si VK fut të dhëna në ClickHouse nga dhjetëra mijëra serverë.

Nginx-log-collector, utilitet nga Avito për dërgimin e logeve të nginx në Clickhouse

Nginx-log-collector, utilitet nga Avito për dërgimin e logeve të nginx në Clickhouse

Për të parë analitikën mbi logjet, do të krijojmë një dashboard për Grafana.

Kush është e interesuar, mirë se vini nën kat.

E instalojmë nginx, grafana në mënyrën standart.

E instalojmë klasterin clickhouse me ndihmën e ansible-playbook nga Denis Proskurin.

Krijimi i db dhe tabelave në Clickhouse

Në këtë skedar përshkruhen kërkesat SQL për krijimin e db dhe tabelave për nginx-log-collector në Clickhouse.

Çdo kĂ«rkesĂ« e bĂ«jmĂ« njĂ«ra pas tjetrĂ«s nĂ« çdo server tĂ« klasterit Clickhouse.

Vërejtje e rëndësishme. Në këtë linjë logs_cluster duhet të zëvendësohet me emrin tuaj të klasterit nga skedari clickhouse_remote_servers.xml midis "remote_servers" dhe "shard".

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

Instalimi dhe konfigurimi i nginx-log-collector-rpm

Nginx-log-collector nuk ka rpm. Këtu https://github.com/patsevanton/nginx-log-collector-rpm e krijojmë rpm. Do të ndërtohet rpm nga Fedora Copr

Instalojmë paketën 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

Rregullojmë konfigurimin /etc/nginx-log-collector/config.yaml:

  .......
  upload:
    table: nginx.access_log
    dsn: http://ip-adresa-e-klasterit-clickhouse:8123/

- tag: "nginx_error:"
  format: error  # access | error
  buffer_size: 1048576
  upload:
    table: nginx.error_log
    dsn: http://ip-adresa-e-klasterit-clickhouse:8123/

Konfigurimi i nginx

Konfigurimi i përgjithshëm i nginx:

përdorues  nginx;
proceset_përpunuese  auto;

# regjistri i gabimeve  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    lidhjet_përpunuese  1024;
}

http {
    përfshij       /etc/nginx/mime.types;
    tipi_default  application/octet-stream;

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

    formati_regjistrit 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  kryesor;

    proxy_ignore_client_abort on;
    sendfile        on;
    keepalive_timeout  65;
    përfshij /etc/nginx/conf.d/*.conf;
}

Hosti virtual i parë:

vhost1.conf:

upstream backend {
    server ip-adresa-serverit-së-stub_http_server:8080;
    server ip-adresa-serverit-së-stub_http_server:8080;
    server ip-adresa-serverit-së-stub_http_server:8080;
    server ip-adresa-serverit-së-stub_http_server:8080;
    server ip-adresa-serverit-së-stub_http_server:8080;
}

server {
    dëgjo   80;
    emri_serverit vhost1;
    location / {
        proxy_pass http://backend;
    }
}

Shtojmë në skedarin /etc/hosts hostet virtuale:

ip-adresa-serverit-së-nginx vhost1

Emulatori i serverit HTTP

Si emulator të serverit HTTP do të përdorim nodejs-stub-server nga Maxim Ignatenko

Nodejs-stub-server nuk ka rpm. Këtu https://github.com/patsevanton/nodejs-stub-server e krijojmë rpm. Do të ndërtohet rpm nga Fedora Copr

Instalojmë paketën rpm nodejs-stub-server në upstream nginx

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

Testimi i ngarkesës

Testimi realizohet me ndihmën e Apache benchmark.

E instalojmë atë:

yum install -y httpd-tools

Nisemi me testimin me ndihmën e Apache benchmark nga 5 serverë të ndryshëm:

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

Konfigurimi i Grafana

Në faqen zyrtare të Grafana nuk do të gjeni dashboard.

Prandaj do ta bëjmë manualisht.

Mund ta gjeni tabelën time të ruajtur këtu.

Po ashtu, duhet të krijoni një variabël table me përmbajtjen nginx.access_log.
Nginx-log-collector, utilitet nga Avito për dërgimin e logeve të nginx në Clickhouse

Numri Total i Kërkesave:

Zgjidhni
 1 si t,
 count(*) si c
 NGA $table
 KU $timeFilter GROUP BY t

Nginx-log-collector, utilitet nga Avito për dërgimin e logeve të nginx në Clickhouse

Numri i Kërkesave të Dështuar:

Zgjidhni
 1 si t,
 count(*) si c
 NGA $table
 KU $timeFilter DHE status NOT IN (200, 201, 401) GROUP BY t

Nginx-log-collector, utilitet nga Avito për dërgimin e logeve të nginx në Clickhouse

Përqindja e Dështimeve:

Zgjidhni
 1 si t, (sum(status = 500 or status = 499)/sum(status = 200 or status = 201 or status = 401))*100 NGA $table
 KU $timeFilter GROUP BY t

Nginx-log-collector, utilitet nga Avito për dërgimin e logeve të nginx në Clickhouse

Koha Mesatare e Pëgjigjes:

Zgjidhni
 1, avg(request_time) NGA $table
 KU $timeFilter GROUP BY 1

Nginx-log-collector, utilitet nga Avito për dërgimin e logeve të nginx në Clickhouse

Koha Maksimale e Pëgjigjes:

Zgjidhni
 1 si t, max(request_time) si c
 NGA $table
 KU $timeFilter GROUP BY t

Nginx-log-collector, utilitet nga Avito për dërgimin e logeve të nginx në Clickhouse

Numri i Statusit:

$columns(status, count(*) si c) NGA $table

Nginx-log-collector, utilitet nga Avito për dërgimin e logeve të nginx në Clickhouse

Për të treguar të dhënat si një tortë, duhet të instaloni një plugin dhe të rindezni grafanën.

grafana-cli plugins install grafana-piechart-panel
shërbimi grafana-server restart

Pie TOP 5 Statusi:

Zgjidhni
    1, 
    status,
    sum(status) SI Reqs
 NGA $table
 KU $timeFilter
 GROUP BY status
 ORDER BY Reqs desc
 LIMIT 5

Nginx-log-collector, utilitet nga Avito për dërgimin e logeve të nginx në Clickhouse

Më tej do të jap kërkesat pa screenshot-e:

Numri http_user_agent:

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

Koha e Mirë/Koha e Keqe:

$rate(countIf(status = 200) SI mirë, countIf(status != 200) SI keq) NGA $table

Koha e Pëgjigjes:

$rate(avg(request_time) si request_time) NGA $table

Koha e përgjigjes upstream (koha e përgjigjes së 1-upstream):

$rate(avg(arrayElement(upstream_response_time,1)) si upstream_response_time) NGA $table

Numri i Statusit të Tabelës për të gjithë vhost:

$columns(status, count(*) si c) NGA $table

Pamja e Përgjithshme e Tabelës

Nginx-log-collector, utilitet nga Avito për dërgimin e logeve të nginx në Clickhouse

Nginx-log-collector, utilitet nga Avito për dërgimin e logeve të nginx në Clickhouse

Nginx-log-collector, utilitet nga Avito për dërgimin e logeve të nginx në Clickhouse

Krahasimi avg() dhe quantile()

avg()
Nginx-log-collector, utilitet nga Avito për dërgimin e logeve të nginx në Clickhouse
quantile()
Nginx-log-collector, utilitet nga Avito për dërgimin e logeve të nginx në Clickhouse

Përfundimi:

Shpresoj që komuniteti të angazhohet në zhvillimin/testimin dhe përdorimin e nginx-log-collector.
Dhe dikush, kur të implementojë nginx-log-collector, do të tregojë sa ka kursyer në disk, RAM, CPU.

Kanale Telegrami:

Millisekondat:

Për ata që i duhen millisekondat, ju lutem shkruani ose voteoni në këtë issue.

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster