Në këtë artikull do të shqyrtohet projekti , 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


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 .
Krijimi i db dhe tabelave në Clickhouse
Në këtë 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 e krijojmë rpm. Do të ndërtohet rpm nga
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-collectorRregullojmë 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 vhost1Emulatori i serverit HTTP
Si emulator të serverit HTTP do të përdorim nga
Nodejs-stub-server nuk ka rpm. Këtu e krijojmë rpm. Do të ndërtohet rpm nga
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_serverTestimi i ngarkesës
Testimi realizohet me ndihmën e Apache benchmark.
E instalojmë atë:
yum install -y httpd-toolsNisemi 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; doneKonfigurimi 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 .
Po ashtu, duhet të krijoni një variabël table me përmbajtjen nginx.access_log.

Numri Total i Kërkesave:
Zgjidhni
1 si t,
count(*) si c
NGA $table
KU $timeFilter GROUP BY t
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
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
Koha Mesatare e Pëgjigjes:
Zgjidhni
1, avg(request_time) NGA $table
KU $timeFilter GROUP BY 1
Koha Maksimale e Pëgjigjes:
Zgjidhni
1 si t, max(request_time) si c
NGA $table
KU $timeFilter GROUP BY t
Numri i Statusit:
$columns(status, count(*) si c) NGA $table
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 restartPie TOP 5 Statusi:
Zgjidhni
1,
status,
sum(status) SI Reqs
NGA $table
KU $timeFilter
GROUP BY status
ORDER BY Reqs desc
LIMIT 5
Më tej do të jap kërkesat pa screenshot-e:
Numri http_user_agent:
$columns(http_user_agent, count(*) c) NGA $tableKoha e Mirë/Koha e Keqe:
$rate(countIf(status = 200) SI mirë, countIf(status != 200) SI keq) NGA $tableKoha e Pëgjigjes:
$rate(avg(request_time) si request_time) NGA $tableKoha e përgjigjes upstream (koha e përgjigjes së 1-upstream):
$rate(avg(arrayElement(upstream_response_time,1)) si upstream_response_time) NGA $tableNumri i Statusit të Tabelës për të gjithë vhost:
$columns(status, count(*) si c) NGA $tablePamja e Përgjithshme e Tabelës



Krahasimi avg() dhe quantile()
avg()

quantile()

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ë .
Burimi: habr.com
