Clickhouse āĻ nginx āĻ˛āĻ— āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ Avito āĻĨā§‡āĻ•ā§‡ Nginx-log-collector āĻ‡āĻ‰āĻŸāĻŋāĻ˛āĻŋāĻŸāĻŋ

āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒ āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻ†āĻ˛ā§‹āĻšāĻ¨āĻž āĻ•āĻ°āĻŦā§‡ nginx-āĻ˛āĻ—-āĻ¸āĻ‚āĻ—ā§āĻ°āĻžāĻšāĻ•, āĻ¯āĻž nginx āĻ˛āĻ—āĻ—ā§āĻ˛āĻŋ āĻĒāĻĄāĻŧāĻŦā§‡, āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ•ā§āĻ˛āĻŋāĻ•āĻšāĻžāĻ‰āĻ¸ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ°ā§‡ āĻĒāĻžāĻ āĻžāĻŦā§‡āĨ¤ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤ āĻ˛āĻ—ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ‡āĻ˛āĻžāĻ¸ā§āĻŸāĻŋāĻ• āĻ¸āĻžāĻ°ā§āĻš āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ•ā§āĻ˛āĻŋāĻ•āĻšāĻžāĻ‰āĻ¸ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ•āĻŽ āĻ¸āĻ‚āĻ¸ā§āĻĨāĻžāĻ¨ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ (āĻĄāĻŋāĻ¸ā§āĻ• āĻ¸ā§āĻĒā§‡āĻ¸, RAM, CPU)āĨ¤ āĻ•ā§āĻ˛āĻŋāĻ•āĻšāĻžāĻ‰āĻ¸ āĻĄāĻžāĻŸāĻž āĻĻā§āĻ°ā§āĻ¤ āĻ˛āĻŋāĻ–ā§‡āĨ¤ āĻ•ā§āĻ˛āĻŋāĻ•āĻšāĻžāĻ‰āĻ¸ āĻĄā§‡āĻŸāĻž āĻ¸āĻ‚āĻ•ā§āĻšāĻŋāĻ¤ āĻ•āĻ°ā§‡, āĻ¯āĻž āĻĄāĻŋāĻ¸ā§āĻ•ā§‡āĻ° āĻĄā§‡āĻŸāĻžāĻ•ā§‡ āĻ†āĻ°āĻ“ āĻ•āĻŽāĻĒā§āĻ¯āĻžāĻ•ā§āĻŸ āĻ•āĻ°ā§‡ āĻ¤ā§‹āĻ˛ā§‡āĨ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻŦā§‡āĻĻāĻ¨ āĻĨā§‡āĻ•ā§‡ 2āĻŸāĻŋ āĻ¸ā§āĻ˛āĻžāĻ‡āĻĄā§‡ āĻ•ā§āĻ˛āĻŋāĻ•āĻšāĻžāĻ‰āĻ¸ā§‡āĻ° āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻ—ā§āĻ˛āĻŋ āĻĻā§‡āĻ–āĻž āĻ¯āĻžāĻŦā§‡ā§ˇ āĻ­āĻŋāĻ•ā§‡ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻšāĻžāĻœāĻžāĻ° āĻšāĻžāĻœāĻžāĻ° āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻĨā§‡āĻ•ā§‡ āĻ•ā§āĻ˛āĻŋāĻ•āĻšāĻžāĻ‰āĻ¸ā§‡ āĻĄā§‡āĻŸāĻž āĻ¸āĻ¨ā§āĻ¨āĻŋāĻŦā§‡āĻļ āĻ•āĻ°āĻžāĻ¯āĻŧāĨ¤

Clickhouse āĻ nginx āĻ˛āĻ— āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ Avito āĻĨā§‡āĻ•ā§‡ Nginx-log-collector āĻ‡āĻ‰āĻŸāĻŋāĻ˛āĻŋāĻŸāĻŋ

Clickhouse āĻ nginx āĻ˛āĻ— āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ Avito āĻĨā§‡āĻ•ā§‡ Nginx-log-collector āĻ‡āĻ‰āĻŸāĻŋāĻ˛āĻŋāĻŸāĻŋ

āĻ˛āĻ— āĻĻā§āĻŦāĻžāĻ°āĻž āĻŦāĻŋāĻļā§āĻ˛ā§‡āĻˇāĻŖ āĻĻā§‡āĻ–āĻ¤ā§‡, āĻ†āĻ¸ā§āĻ¨ Grafana-āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻĄā§āĻ¯āĻžāĻļāĻŦā§‹āĻ°ā§āĻĄ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŋāĨ¤

āĻ•ā§‡ āĻ¯āĻ¤ā§āĻ¨ āĻ•āĻ°ā§‡, āĻŦāĻŋāĻĄāĻŧāĻžāĻ˛ āĻ…āĻ§ā§€āĻ¨ā§‡ āĻ¸ā§āĻŦāĻžāĻ—āĻ¤āĻŽ.

āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ āĻ‰āĻĒāĻžāĻ¯āĻŧā§‡ nginx, grafana āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°ā§āĻ¨āĨ¤

āĻĨā§‡āĻ•ā§‡ āĻ‰āĻ¤ā§āĻ¤āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯-āĻĒā§āĻ˛ā§‡āĻŦā§āĻ• āĻ¸āĻš āĻ•ā§āĻ˛āĻŋāĻ•āĻšāĻžāĻ‰āĻ¸ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ° āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°ā§āĻ¨ āĻĄā§‡āĻ¨āĻŋāĻ¸ āĻĒā§āĻ°āĻ¸āĻ•ā§āĻ°āĻŋāĻ¨.

āĻ•ā§āĻ˛āĻŋāĻ•āĻšāĻžāĻ‰āĻ¸ā§‡ āĻāĻ•āĻŸāĻŋ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ āĻāĻŦāĻ‚ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž

āĻ¤āĻžāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻĢāĻžāĻ‡āĻ˛ āĻ•ā§āĻ˛āĻŋāĻ•āĻšāĻžāĻ‰āĻ¸ā§‡ nginx-log-colector āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ āĻāĻŦāĻ‚ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ¤ā§ˆāĻ°āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ SQL āĻ•ā§‹āĻ¯āĻŧā§‡āĻ°āĻŋ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤

āĻ†āĻŽāĻ°āĻž āĻ•ā§āĻ˛āĻŋāĻ•āĻšāĻžāĻ‰āĻ¸ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ°ā§‡āĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻ•āĻ°āĻŋāĨ¤

āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻ¤āĻĨā§āĻ¯. āĻāĻ‡ āĻ˛āĻžāĻ‡āĻ¨ā§‡, "remote_servers" āĻāĻŦāĻ‚ "shard" āĻāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ clickhouse_remote_servers.xml āĻĢāĻžāĻ‡āĻ˛ āĻĨā§‡āĻ•ā§‡ logs_cluster āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ° āĻ¨āĻžāĻŽā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤āĨ¤

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

nginx-log-collector-rpm āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻāĻŦāĻ‚ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

Nginx-log-colector āĻāĻ° āĻāĻ•āĻŸāĻŋ rpm āĻ¨ā§‡āĻ‡āĨ¤ āĻāĻ–āĻžāĻ¨ā§‡ https://github.com/patsevanton/nginx-log-collector-rpm āĻāĻŸāĻŋāĻ° āĻœāĻ¨ā§āĻ¯ rpm āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨āĨ¤ rpm āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ¨āĻŋāĻ°ā§āĻŽāĻŋāĻ¤ āĻšāĻŦā§‡ āĻĢā§‡āĻĄā§‹āĻ°āĻž āĻ•āĻ°ā§āĻĒā§‹āĻ°ā§‡āĻļāĻ¨

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 āĻĨā§‡āĻ•ā§‡ āĻŽā§āĻ¯āĻžāĻ•ā§āĻ¸āĻŋāĻŽ āĻ‡āĻ—āĻ¨āĻžāĻŸā§‡āĻ¨āĻ•ā§‹

nodejs-stub-server āĻāĻ° rpm āĻ¨ā§‡āĻ‡āĨ¤ āĻāĻ–āĻžāĻ¨ā§‡ https://github.com/patsevanton/nodejs-stub-server āĻāĻŸāĻŋāĻ° āĻœāĻ¨ā§āĻ¯ rpm āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§āĻ¨āĨ¤ rpm āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ¨āĻŋāĻ°ā§āĻŽāĻŋāĻ¤ āĻšāĻŦā§‡ āĻĢā§‡āĻĄā§‹āĻ°āĻž āĻ•āĻ°ā§āĻĒā§‹āĻ°ā§‡āĻļāĻ¨

āĻ†āĻĒāĻ¸ā§āĻŸā§āĻ°āĻŋāĻŽ nginx rpm-āĻ nodejs-stub-server āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°ā§āĻ¨

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 āĻŦā§‡āĻžā§āĻšāĻŽāĻžāĻ°ā§āĻ• āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤

āĻāĻŸāĻŋ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°ā§āĻ¨:

yum install -y httpd-tools

āĻ†āĻŽāĻ°āĻž 5āĻŸāĻŋ āĻ­āĻŋāĻ¨ā§āĻ¨ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻĨā§‡āĻ•ā§‡ Apache āĻŦā§‡āĻžā§āĻšāĻŽāĻžāĻ°ā§āĻ• āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻļā§āĻ°ā§ āĻ•āĻ°āĻŋ:

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.
Clickhouse āĻ nginx āĻ˛āĻ— āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ Avito āĻĨā§‡āĻ•ā§‡ Nginx-log-collector āĻ‡āĻ‰āĻŸāĻŋāĻ˛āĻŋāĻŸāĻŋ

Singlestat āĻŽā§‹āĻŸ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§:

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

Clickhouse āĻ nginx āĻ˛āĻ— āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ Avito āĻĨā§‡āĻ•ā§‡ Nginx-log-collector āĻ‡āĻ‰āĻŸāĻŋāĻ˛āĻŋāĻŸāĻŋ

Singlestat āĻŦā§āĻ¯āĻ°ā§āĻĨ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§:

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

Clickhouse āĻ nginx āĻ˛āĻ— āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ Avito āĻĨā§‡āĻ•ā§‡ Nginx-log-collector āĻ‡āĻ‰āĻŸāĻŋāĻ˛āĻŋāĻŸāĻŋ

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

Clickhouse āĻ nginx āĻ˛āĻ— āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ Avito āĻĨā§‡āĻ•ā§‡ Nginx-log-collector āĻ‡āĻ‰āĻŸāĻŋāĻ˛āĻŋāĻŸāĻŋ

Singlestat āĻ—āĻĄāĻŧ āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ¸āĻŽāĻ¯āĻŧ:

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

Clickhouse āĻ nginx āĻ˛āĻ— āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ Avito āĻĨā§‡āĻ•ā§‡ Nginx-log-collector āĻ‡āĻ‰āĻŸāĻŋāĻ˛āĻŋāĻŸāĻŋ

Singlestat āĻ¸āĻ°ā§āĻŦā§‹āĻšā§āĻš āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ¸āĻŽāĻ¯āĻŧ:

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

Clickhouse āĻ nginx āĻ˛āĻ— āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ Avito āĻĨā§‡āĻ•ā§‡ Nginx-log-collector āĻ‡āĻ‰āĻŸāĻŋāĻ˛āĻŋāĻŸāĻŋ

āĻ—āĻŖāĻ¨āĻž āĻ¸ā§āĻĨāĻŋāĻ¤āĻŋ:

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

Clickhouse āĻ nginx āĻ˛āĻ— āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ Avito āĻĨā§‡āĻ•ā§‡ Nginx-log-collector āĻ‡āĻ‰āĻŸāĻŋāĻ˛āĻŋāĻŸāĻŋ

āĻĒāĻžāĻ‡āĻ¯āĻŧā§‡āĻ° āĻŽāĻ¤ā§‹ āĻĄā§‡āĻŸāĻž āĻ†āĻ‰āĻŸāĻĒā§āĻŸ āĻ•āĻ°āĻ¤ā§‡, āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻĒā§āĻ˛āĻžāĻ—āĻ‡āĻ¨ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĻāĻŦāĻ‚ āĻ—ā§āĻ°āĻžāĻĢāĻ¨āĻž āĻĒā§āĻ¨āĻ°āĻžāĻ¯āĻŧ āĻ˛ā§‹āĻĄ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤

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

āĻĒāĻžāĻ‡ āĻļā§€āĻ°ā§āĻˇ 5 āĻ¸ā§āĻĨāĻŋāĻ¤āĻŋ:

SELECT
    1, /* fake timestamp value */
    status,
    sum(status) AS Reqs
FROM $table
WHERE $timeFilter
GROUP BY status
ORDER BY Reqs desc
LIMIT 5

Clickhouse āĻ nginx āĻ˛āĻ— āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ Avito āĻĨā§‡āĻ•ā§‡ Nginx-log-collector āĻ‡āĻ‰āĻŸāĻŋāĻ˛āĻŋāĻŸāĻŋ

āĻ†āĻ°āĻ“ āĻ†āĻŽāĻŋ āĻ¸ā§āĻ•ā§āĻ°āĻŋāĻ¨āĻļāĻŸ āĻ›āĻžāĻĄāĻŧāĻžāĻ‡ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻĻā§‡āĻŦ:

āĻ—āĻŖāĻ¨āĻž 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

āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ­āĻšā§‹āĻ¸ā§āĻŸā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻŸā§‡āĻŦāĻŋāĻ˛ āĻ—āĻŖāĻ¨āĻž āĻ¸ā§āĻĨāĻŋāĻ¤āĻŋ:

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

āĻĄā§āĻ¯āĻžāĻļāĻŦā§‹āĻ°ā§āĻĄā§‡āĻ° āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻĻā§ƒāĻļā§āĻ¯

Clickhouse āĻ nginx āĻ˛āĻ— āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ Avito āĻĨā§‡āĻ•ā§‡ Nginx-log-collector āĻ‡āĻ‰āĻŸāĻŋāĻ˛āĻŋāĻŸāĻŋ

Clickhouse āĻ nginx āĻ˛āĻ— āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ Avito āĻĨā§‡āĻ•ā§‡ Nginx-log-collector āĻ‡āĻ‰āĻŸāĻŋāĻ˛āĻŋāĻŸāĻŋ

Clickhouse āĻ nginx āĻ˛āĻ— āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ Avito āĻĨā§‡āĻ•ā§‡ Nginx-log-collector āĻ‡āĻ‰āĻŸāĻŋāĻ˛āĻŋāĻŸāĻŋ

avg() āĻāĻŦāĻ‚ āĻ•ā§‹āĻ¯āĻŧāĻžāĻ¨ā§āĻŸāĻžāĻ‡āĻ˛() āĻ¤ā§āĻ˛āĻ¨āĻž āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

āĻ—āĻĄāĻŧ()
Clickhouse āĻ nginx āĻ˛āĻ— āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ Avito āĻĨā§‡āĻ•ā§‡ Nginx-log-collector āĻ‡āĻ‰āĻŸāĻŋāĻ˛āĻŋāĻŸāĻŋ
āĻ•ā§‹āĻ¯āĻŧāĻžāĻ¨ā§āĻŸāĻžāĻ‡āĻ˛()
Clickhouse āĻ nginx āĻ˛āĻ— āĻĒāĻžāĻ āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ Avito āĻĨā§‡āĻ•ā§‡ Nginx-log-collector āĻ‡āĻ‰āĻŸāĻŋāĻ˛āĻŋāĻŸāĻŋ

āĻ‰āĻĒāĻ¸āĻ‚āĻšāĻžāĻ°:

āĻ†āĻļāĻž āĻ•āĻ°āĻŋ āĻ¸āĻŽā§āĻĒā§āĻ°āĻĻāĻžāĻ¯āĻŧāĻŸāĻŋ nginx-log-colector āĻāĻ° āĻŦāĻŋāĻ•āĻžāĻļ/āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻāĻŦāĻ‚ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§‡ āĻœāĻĄāĻŧāĻŋāĻ¤ āĻšāĻŦā§‡āĨ¤
āĻāĻŦāĻ‚ āĻ¯āĻ–āĻ¨ āĻ•ā§‡āĻ‰ nginx-log-collector āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ— āĻ•āĻ°ā§‡, āĻ¤āĻ–āĻ¨ āĻ¸ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻŦāĻ˛ā§‡ āĻĻā§‡āĻŦā§‡ āĻ¸ā§‡ āĻ•āĻ¤āĻŸāĻž āĻĄāĻŋāĻ¸ā§āĻ•, RAM, CPU āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°ā§‡āĻ›ā§‡āĨ¤

āĻŸā§‡āĻ˛āĻŋāĻ—ā§āĻ°āĻžāĻŽ āĻšā§āĻ¯āĻžāĻ¨ā§‡āĻ˛:

āĻŽāĻŋāĻ˛āĻŋāĻ¸ā§‡āĻ•ā§‡āĻ¨ā§āĻĄ:

āĻ•ā§‡ āĻŽāĻŋāĻ˛āĻŋāĻ¸ā§‡āĻ•ā§‡āĻ¨ā§āĻĄ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ¯āĻ¤ā§āĻ¨āĻļā§€āĻ˛, āĻ˛āĻŋāĻ–ā§āĻ¨ āĻŦāĻž āĻ­ā§‹āĻŸ, āĻĻāĻ¯āĻŧāĻž āĻ•āĻ°ā§‡, āĻāĻ‡ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž.

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨