Nginx-log-collector utility gikan sa Avito alang sa pagpadala nginx logs sa Clickhouse

Kini nga artikulo maghisgot sa proyekto nginx-log-collector, nga mobasa sa nginx logs ug ipadala kini sa Clickhouse cluster. Kasagaran ang ElasticSearch gigamit alang sa mga troso. Ang Clickhouse nanginahanglan gamay nga mga kapanguhaan (disk space, RAM, CPU). Ang Clickhouse nagrekord sa datos nga mas paspas. Ang Clickhouse nag-compress sa datos, nga naghimo sa datos sa disk nga mas compact. Ang mga bentaha sa Clickhouse makita sa 2 nga mga slide gikan sa taho Giunsa pagsal-ot sa VK ang datos sa ClickHouse gikan sa libu-libong mga server.

Nginx-log-collector utility gikan sa Avito alang sa pagpadala nginx logs sa Clickhouse

Nginx-log-collector utility gikan sa Avito alang sa pagpadala nginx logs sa Clickhouse

Aron matan-aw ang analytics base sa mga log, maghimo kami usa ka dashboard para sa Grafana.

Bisan kinsa nga interesado, welcome sa iring.

I-install ang nginx, grafana sa standard nga paagi.

Pag-instalar sa usa ka clickhouse cluster gamit ang ansible-playbook gikan sa Denis Proskurin.

Paghimo mga database ug mga lamesa sa Clickhouse

Sa niana file Ang mga pangutana sa SQL alang sa paghimo sa mga database ug mga lamesa alang sa nginx-log-collector sa Clickhouse gihulagway.

Gihimo namo ang matag hangyo sa tagsa-tagsa sa matag server sa cluster sa Clickhouse.

Importante nga nota. Niini nga linya, ang logs_cluster kinahanglang ilisan sa imong cluster name gikan sa clickhouse_remote_servers.xml file tali sa "remote_servers" ug "shard".

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

Pag-instalar ug pag-configure sa nginx-log-collector-rpm

Ang Nginx-log-collector walay rpm. Dinhi https://github.com/patsevanton/nginx-log-collector-rpm paghimo rpm alang niini. rpm i-compile gamit Fedora Copr

I-install ang rpm package 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

I-edit ang config /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/

Pag-set up sa nginx

Kinatibuk-ang nginx config:

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;
}

Usa ka virtual host:

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;
    }
}

Idugang ang mga virtual nga host sa /etc/hosts file:

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

HTTP server emulator

Ingon usa ka HTTP server emulator among gamiton nodejs-stub-server gikan sa Maxim Ignatenko

Ang Nodejs-stub-server walay rpm. Dinhi https://github.com/patsevanton/nodejs-stub-server paghimo rpm alang niini. rpm i-compile gamit Fedora Copr

I-install ang nodejs-stub-server nga pakete sa 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

Pagsulay sa Stress

Nagpahigayon kami og pagsulay gamit ang Apache benchmark.

I-install kini:

yum install -y httpd-tools

Nagsugod kami sa pagsulay gamit ang Apache benchmark gikan sa 5 nga lainlaing mga server:

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

Pag-set up sa Grafana

Dili ka makakita og dashboard sa opisyal nga website sa Grafana.

Busa, buhaton nato kini pinaagi sa kamot.

Makita nimo ang akong na-save nga dashboard dinhi.

Kinahanglan ka usab nga maghimo usa ka variable sa lamesa nga adunay sulud nginx.access_log.
Nginx-log-collector utility gikan sa Avito alang sa pagpadala nginx logs sa Clickhouse

Singlestat Total nga mga Gipangayo:

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

Nginx-log-collector utility gikan sa Avito alang sa pagpadala nginx logs sa Clickhouse

Singlestat Napakyas nga mga Pangayo:

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

Nginx-log-collector utility gikan sa Avito alang sa pagpadala nginx logs sa Clickhouse

Porsiyento nga Napakyas sa 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 utility gikan sa Avito alang sa pagpadala nginx logs sa Clickhouse

Singlestat Avg nga Oras sa Pagtubag:

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

Nginx-log-collector utility gikan sa Avito alang sa pagpadala nginx logs sa Clickhouse

Singlestat Max nga Oras sa Pagtubag:

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

Nginx-log-collector utility gikan sa Avito alang sa pagpadala nginx logs sa Clickhouse

Ihap nga kahimtang:

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

Nginx-log-collector utility gikan sa Avito alang sa pagpadala nginx logs sa Clickhouse

Aron ma-output ang data sama sa pie, kinahanglan nimo nga i-install ang plugin ug i-restart ang grafana.

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

Pie TOP 5 nga Status:

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 utility gikan sa Avito alang sa pagpadala nginx logs sa Clickhouse

Dugang pa maghatag ako mga hangyo nga wala’y mga screenshot:

Ihap ang 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

Tayming sa Tubag:

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

Upstream nga oras sa pagtubag (1st upstream nga oras sa pagtubag):

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

Status sa Pag-ihap sa Talaan para sa tanang vhost:

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

Kinatibuk-ang panglantaw sa dashboard

Nginx-log-collector utility gikan sa Avito alang sa pagpadala nginx logs sa Clickhouse

Nginx-log-collector utility gikan sa Avito alang sa pagpadala nginx logs sa Clickhouse

Nginx-log-collector utility gikan sa Avito alang sa pagpadala nginx logs sa Clickhouse

Pagtandi sa avg() ug quantile()

avg()
Nginx-log-collector utility gikan sa Avito alang sa pagpadala nginx logs sa Clickhouse
gidaghanon ()
Nginx-log-collector utility gikan sa Avito alang sa pagpadala nginx logs sa Clickhouse

Panapos:

Nanghinaut ko nga ang komunidad moapil sa pagpalambo/pagsulay ug paggamit sa nginx-log-collector.
Ug kung adunay usa nga nagpatuman sa nginx-log-collector, isulti nila kanimo kung pila ang ilang natipig sa disk, RAM, ug CPU.

Mga channel sa Telegram:

Milisecond:

Kang kinsa ang milliseconds importante, palihog pagsulat o pagboto niini isyu.

Source: www.habr.com

Idugang sa usa ka comment