Nginx-log-collector utility เบˆเบฒเบ Avito เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบปเปˆเบ‡เบšเบฑเบ™เบ—เบถเบ nginx เป„เบ› Clickhouse

เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบˆเบฐเบชเบปเบ™เบ—เบฐเบ™เบฒเบเปˆเบฝเบงเบเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™ nginx-log-collector, เป€เบŠเบดเปˆเบ‡เบˆเบฐเบญเปˆเบฒเบ™เบšเบฑเบ™เบ—เบถเบ nginx, เบชเบปเปˆเบ‡เบžเบงเบเบกเบฑเบ™เป„เบ›เบซเบฒเบเบธเปˆเบก Clickhouse. เบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบง ElasticSearch เปเบกเปˆเบ™เปƒเบŠเป‰เบชเปเบฒเบฅเบฑเบšเบšเบฑเบ™เบ—เบถเบ. Clickhouse เบ•เป‰เบญเบ‡เบเบฒเบ™เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบซเบ™เป‰เบญเบ (เบžเบทเป‰เบ™เบ—เบตเปˆเบ”เบดเบ”, RAM, CPU). Clickhouse เบ‚เบฝเบ™เบ‚เปเป‰เบกเบนเบ™เป„เบงเบ‚เบถเป‰เบ™. Clickhouse เบšเบตเบšเบญเบฑเบ”เบ‚เปเป‰เบกเบนเบ™, เป€เบŠเบดเปˆเบ‡เป€เบฎเบฑเบ”เปƒเบซเป‰เบ‚เปเป‰เบกเบนเบ™เปƒเบ™เปเบœเปˆเบ™เบกเบตเบ„เบงเบฒเบกเบซเบ™เบฒเปเบซเบ™เป‰เบ™เบซเบผเบฒเบเบ‚เบถเป‰เบ™. เบœเบปเบ™เบ›เบฐเป‚เบซเบเบ”เบ‚เบญเบ‡ Clickhouse เบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰เปƒเบ™ 2 slides เบˆเบฒเบเบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™ เบงเบดเบ—เบตเบเบฒเบ™ VK เปเบŠเบเบ‚เปเป‰เบกเบนเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ ClickHouse เบˆเบฒเบเบซเบฅเบฒเบเบชเบดเบšเบžเบฑเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ.

Nginx-log-collector utility เบˆเบฒเบ Avito เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบปเปˆเบ‡เบšเบฑเบ™เบ—เบถเบ nginx เป„เบ› Clickhouse

Nginx-log-collector utility เบˆเบฒเบ Avito เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบปเปˆเบ‡เบšเบฑเบ™เบ—เบถเบ nginx เป„เบ› Clickhouse

เป€เบžเบทเปˆเบญเป€เบšเบดเปˆเบ‡เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ•เบฒเบกเบšเบฑเบ™เบ—เบถเบ, เปƒเบซเป‰เบชเป‰เบฒเบ‡ dashboard เบชเปเบฒเบฅเบฑเบš Grafana.

เปƒเบœเบชเบปเบ™เปƒเบˆ, เบเบดเบ™เบ”เบตเบ•เป‰เบญเบ™เบฎเบฑเบšเบžเบฒเบเปƒเบ•เป‰ cat.

เบ•เบดเบ”เบ•เบฑเป‰เบ‡ nginx, grafana เปƒเบ™เบ—เบฒเบ‡เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™.

เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบเบธเปˆเบก clickhouse เบเบฑเบš ansible-playbook เบˆเบฒเบ Denis Proskurin.

เบเบฒเบ™เบชเป‰เบฒเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เปเบฅเบฐเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เปƒเบ™ 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;
    }
}

เป€เบžเบตเปˆเบก virtual hosts เปƒเบชเปˆเป„เบŸเบฅเปŒ /etc/hosts:

ip-ะฐะดั€ะตั-ัะตั€ะฒะตั€ะฐ-ั-nginx vhost1

เบ•เบปเบงเบˆเบณเบฅเบญเบ‡เป€เบŠเบตเบšเป€เบงเบต HTTP

เปƒเบ™เบ–เบฒเบ™เบฐเป€เบ›เบฑเบ™ emulator เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ HTTP เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰ nodejs-stub-server เบˆเบฒเบ Maxim Ignatenko

nodejs-stub-server เบšเปเปˆเบกเบต 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 benchmark.

เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบกเบฑเบ™:

yum install -y httpd-tools

เบžเบงเบเป€เบฎเบปเบฒเป€เบฅเบตเปˆเบกเบ—เบปเบ”เบชเบญเบšเป‚เบ”เบเปƒเบŠเป‰ Apache benchmark เบˆเบฒเบ 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โ€‹

เบ—เปˆเบฒเบ™เบˆเบฐเบšเปเปˆเบžเบปเบš dashboard เบขเบนเปˆเปƒเบ™เป€เบงเบฑเบšเป„เบŠเบ—เปŒเบขเปˆเบฒเบ‡เป€เบ›เบฑเบ™เบ—เบฒเบ‡เบเบฒเบ™ Grafana.

เป€เบžเบฒเบฐเบชเบฐเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบฎเบฑเบ”เบกเบฑเบ™เบ”เป‰เบงเบเบกเบท.

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบŠเบญเบเบซเบฒ dashboard เบ‚เบญเบ‡เบ‚เป‰เบญเบเบ—เบตเปˆเบšเบฑเบ™เบ—เบถเบเป„เบงเป‰ เบ—เบตเปˆเบ™เบตเป‰.

เบ™เบญเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบเบฑเบ‡เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบชเป‰เบฒเบ‡เบ•เบปเบงเปเบ›เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบ—เบตเปˆเบกเบตเป€เบ™เบทเป‰เบญเบซเบฒ nginx.access_log.
Nginx-log-collector utility เบˆเบฒเบ Avito เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบปเปˆเบ‡เบšเบฑเบ™เบ—เบถเบ nginx เป„เบ› Clickhouse

เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ—เบฑเบ‡เปเบปเบ” Singlestat:

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

Nginx-log-collector utility เบˆเบฒเบ 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 utility เบˆเบฒเบ 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 utility เบˆเบฒเบ Avito เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบปเปˆเบ‡เบšเบฑเบ™เบ—เบถเบ nginx เป„เบ› Clickhouse

เป€เบงเบฅเบฒเบ•เบญเบšเป‚เบ•เป‰เบชเบฐเป€เบฅเปˆเบ Singlestat:

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

Nginx-log-collector utility เบˆเบฒเบ Avito เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบปเปˆเบ‡เบšเบฑเบ™เบ—เบถเบ nginx เป„เบ› Clickhouse

เป€เบงเบฅเบฒเบ•เบญเบšเบฎเบฑเบšเบชเบนเบ‡เบชเบธเบ” Singlestat:

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

Nginx-log-collector utility เบˆเบฒเบ Avito เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบปเปˆเบ‡เบšเบฑเบ™เบ—เบถเบ nginx เป„เบ› Clickhouse

เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ™เบฑเบš:

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

Nginx-log-collector utility เบˆเบฒเบ Avito เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบปเปˆเบ‡เบšเบฑเบ™เบ—เบถเบ nginx เป„เบ› Clickhouse

เป€เบžเบทเปˆเบญเปƒเบซเป‰เบ‚เปเป‰เบกเบนเบ™เบญเบญเบเบกเบฒเบ„เบทเบเบฑเบš pie, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ•เบดเบ”เบ•เบฑเป‰เบ‡ plugin เปเบฅเบฐเป‚เบซเบผเบ” grafana เบ„เบทเบ™เปƒเปเปˆ.

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

Pie TOP 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 utility เบˆเบฒเบ Avito เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบปเปˆเบ‡เบšเบฑเบ™เบ—เบถเบ nginx เป„เบ› Clickhouse

เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเปƒเบซเป‰เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™ screenshots:

เบ™เบฑเบš 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

เป€เบงโ€‹เบฅเบฒโ€‹เบ•เบญเบšโ€‹เบชเบฐโ€‹เบซเบ™เบญเบ‡โ€‹เบขเบนเปˆโ€‹เป€เบ—เบดเบ‡โ€‹เบ™โ€‹เป‰โ€‹เปโ€‹เบฒ (เบ—เบตเปˆโ€‹เปƒเบŠเป‰โ€‹เป€เบงโ€‹เบฅเบฒโ€‹เบ•เบญเบšโ€‹เบชเบฐโ€‹เบซเบ™เบญเบ‡โ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบ•เบญเบšโ€‹เบชเบฐโ€‹เบซเบ™เบญเบ‡โ€‹เบ„เบฑเป‰เบ‡โ€‹เบ—เบต 1โ€‹)โ€‹:

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

เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ™เบฑเบšเบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบชเปเบฒเบฅเบฑเบš vhosts เบ—เบฑเบ‡เบซเบกเบปเบ”:

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

เบกเบธเบกเบกเบญเบ‡เบ—เบปเปˆเบงเป„เบ›เบ‚เบญเบ‡ dashboard

Nginx-log-collector utility เบˆเบฒเบ Avito เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบปเปˆเบ‡เบšเบฑเบ™เบ—เบถเบ nginx เป„เบ› Clickhouse

Nginx-log-collector utility เบˆเบฒเบ Avito เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบปเปˆเบ‡เบšเบฑเบ™เบ—เบถเบ nginx เป„เบ› Clickhouse

Nginx-log-collector utility เบˆเบฒเบ Avito เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบปเปˆเบ‡เบšเบฑเบ™เบ—เบถเบ nginx เป„เบ› Clickhouse

เบ›เบฝเบšเบ—เบฝเบš avg() เปเบฅเบฐ quantile()

เบชเบฐเป€เบฅเปˆเบ()
Nginx-log-collector utility เบˆเบฒเบ Avito เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบปเปˆเบ‡เบšเบฑเบ™เบ—เบถเบ nginx เป„เบ› Clickhouse
quantile()
Nginx-log-collector utility เบˆเบฒเบ Avito เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบปเปˆเบ‡เบšเบฑเบ™เบ—เบถเบ nginx เป„เบ› Clickhouse

เบชเบฐเบซเบผเบธเบš:

เบซเบงเบฑเบ‡เบงเปˆเบฒเบŠเบธเบกเบŠเบปเบ™เบˆเบฐเบกเบตเบชเปˆเบงเบ™เบฎเปˆเบงเบกเปƒเบ™เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ / เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเปเบฅเบฐเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ nginx-log-collector.
เปเบฅเบฐเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบœเบนเป‰เปƒเบ”เบœเบนเป‰เบซเบ™เบถเปˆเบ‡เบ›เบฐเบ•เบดเบšเบฑเบ” nginx-log-collector, เบฅเบฒเบงเบˆเบฐเบšเบญเบเบ—เปˆเบฒเบ™เบงเปˆเบฒเบฅเบฒเบงเป„เบ”เป‰เบšเบฑเบ™เบ—เบถเบเปเบœเปˆเบ™, RAM, CPU เบซเบผเบฒเบเบ›เบฒเบ™เปƒเบ”.

เบŠเปˆเบญเบ‡ Telegram:

เบกเบดเบ™เบฅเบดเบงเบดเบ™เบฒเบ—เบต:

เปƒเบœเบชเบปเบ™เปƒเบˆ milliseconds, เบ‚เบฝเบ™เบซเบผเบทเบฅเบปเบ‡เบ„เบฐเปเบ™เบ™เบชเบฝเบ‡, เบเบฐเบฅเบธเบ™เบฒ, เปƒเบ™เบ™เบตเป‰ เบšเบฑเบ™เบซเบฒ.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™