αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ Nginx-log-collector αž–αžΈ Avito αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αŸ’αž‰αžΎαž€αŸ†αžŽαžαŸ‹αž αŸαžαž» nginx αž‘αŸ… Clickhouse

αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž“αžΉαž„αž–αž·αž—αžΆαž€αŸ’αžŸαžΆαž’αŸ†αž–αžΈαž‚αž˜αŸ’αžšαŸ„αž„ nginx-log-collectorαžŠαŸ‚αž›αž“αžΉαž„αž’αžΆαž“αž€αŸ†αžŽαžαŸ‹αž αŸαžαž» nginx αž•αŸ’αž‰αžΎαž–αž½αž€αžœαžΆαž‘αŸ…αž…αž„αŸ’αž€αŸ„αž˜ Clickhouse αŸ” αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆ ElasticSearch αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αŸ†αžŽαžαŸ‹αž αŸαžαž»αŸ” Clickhouse αžαŸ’αžšαžΌαžœαž€αžΆαžšαž’αž“αž’αžΆαž“αžαž·αž…αž‡αžΆαž„αž˜αž»αž“ (αž‘αŸ†αž αŸ†αžαžΆαžŸ, RAM, CPU) αŸ” Clickhouse αžŸαžšαžŸαŸαžšαž‘αž·αž“αŸ’αž“αž“αŸαž™αž›αžΏαž“αž‡αžΆαž„αž˜αž»αž“αŸ” Clickhouse αž”αž„αŸ’αžšαž½αž˜αž‘αž·αž“αŸ’αž“αž“αŸαž™ αžŠαŸ‚αž›αž’αŸ’αžœαžΎαž±αŸ’αž™αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αž›αžΎαžαžΆαžŸαž€αžΆαž“αŸ‹αžαŸ‚αž”αž„αŸ’αžšαž½αž˜αŸ” αž’αžαŸ’αžαž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž“αŸƒ Clickhouse αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž˜αžΎαž›αžƒαžΎαž‰αž“αŸ…αž€αŸ’αž“αž»αž„ 2 αžŸαŸ’αž›αžΆαž™αž–αžΈαžšαž”αžΆαž™αž€αžΆαžšαžŽαŸ αžšαž”αŸ€αž”αžŠαŸ‚αž› VK αž”αž‰αŸ’αž…αžΌαž›αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αŸ…αž€αŸ’αž“αž»αž„ ClickHouse αž–αžΈαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαžšαžΆαž”αŸ‹αž˜αŸ‰αžΊαž“αŸ”

αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ Nginx-log-collector αž–αžΈ Avito αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αŸ’αž‰αžΎαž€αŸ†αžŽαžαŸ‹αž αŸαžαž» nginx αž‘αŸ… Clickhouse

αž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ Nginx-log-collector αž–αžΈ Avito αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αŸ’αž‰αžΎαž€αŸ†αžŽαžαŸ‹αž αŸαžαž» nginx αž‘αŸ… Clickhouse

αžŠαžΎαž˜αŸ’αž”αžΈαž˜αžΎαž›αž€αžΆαžšαžœαž·αž—αžΆαž‚αžαžΆαž˜αž€αŸ†αžŽαžαŸ‹αž αŸαžαž» αžŸαžΌαž˜αž”αž„αŸ’αž€αžΎαžαž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Grafana αŸ”

αž’αŸ’αž“αž€αžŽαžΆαžαŸ’αžœαž›αŸ‹ αžŸαžΌαž˜αžŸαŸ’αžœαžΆαž‚αž˜αž“αŸαž“αŸ…αž€αŸ’αžšαŸ„αž˜αž†αŸ’αž˜αžΆαŸ”

αžŠαŸ†αž‘αžΎαž„ nginx, grafana αžαžΆαž˜αžœαž·αž’αžΈαžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαŸ”

αžŠαŸ†αž‘αžΎαž„ clickhouse cluster αž‡αžΆαž˜αž½αž™ 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;
    }
}

αž”αž“αŸ’αžαŸ‚αž˜αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαž‘αŸ…αž―αž€αžŸαžΆαžš /etc/hostsαŸ–

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

αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΆαž”αŸ‹αžαžΆαž˜αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ HTTP

αž‡αžΆαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžαŸ’αžšαžΆαž”αŸ‹αžαžΆαž˜αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ HTTP αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎ nodejs-stub-server αž–αžΈ Maxim Ignatenko

nodejs-stub-server αž˜αž·αž“αž˜αžΆαž“ rpm αž‘αŸαŸ” αž“αŸ…αž‘αžΈαž“αŸαŸ‡ https://github.com/patsevanton/nodejs-stub-server αž”αž„αŸ’αž€αžΎαž rpm αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžœαžΆαŸ” rpm αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŸαžΆαž„αžŸαž„αŸ‹αžŠαŸ„αž™αž”αŸ’αžšαžΎ αž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“ Fedora Copr

αžŠαŸ†αž‘αžΎαž„αž€αž‰αŸ’αž…αž”αŸ‹ nodejs-stub-server αž“αŸ…αž›αžΎ 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

αž’αŸ’αž“αž€αž“αžΉαž„αž˜αž·αž“αž’αžΆαž…αžšαž€αžƒαžΎαž‰αž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αž“αŸ…αž›αžΎαž‚αŸαž αž‘αŸ†αž–αŸαžšαž•αŸ’αž›αžΌαžœαž€αžΆαžšαžšαž”αžŸαŸ‹ Grafana αž‘αŸαŸ”

αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž™αžΎαž„αž“αžΉαž„αž’αŸ’αžœαžΎαžœαžΆαžŠαŸ„αž™αžŠαŸƒαŸ”

αž’αŸ’αž“αž€αž’αžΆαž…αžŸαŸ’αžœαŸ‚αž„αžšαž€αž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŠαŸ‚αž›αž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αž“αŸ…αž‘αžΈαž“αŸαŸ‡.

αž’αŸ’αž“αž€αž€αŸαžαŸ’αžšαžΌαžœαž”αž„αŸ’αž€αžΎαžαž’αžαŸαžšαžαžΆαžšαžΆαž„αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž˜αžΆαžαž·αž€αžΆ 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

αžŸαŸ’αžαžΆαž“αž—αžΆαž– 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 αž–αžΈ 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 αŸ”

αž”αžŽαŸ’αžαžΆαž‰ TelegramαŸ–

αž˜αž·αž›αŸ’αž›αžΈαžœαž·αž“αžΆαž‘αžΈαŸ–

αž’αŸ’αž“αž€αžŽαžΆαžαŸ’αžœαž›αŸ‹αž’αŸ†αž–αžΈαž˜αž·αž›αŸ’αž›αžΈαžœαž·αž“αžΆαž‘αžΈ សរសេរ αž¬αž”αŸ„αŸ‡αž†αŸ’αž“αŸ„αž αžŸαžΌαž˜αž€αŸ’αž“αž»αž„αžšαžΏαž„αž“αŸαŸ‡ issue.

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹