рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рд▓рд╛ рдПрдирдЬреАрдирдХреНрд╕ рд▓реЙрдЧ рдкрд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА рдПрд╡рд┐рдЯреЛрдХрдбреВрди рдПрдирдЬреАрдирдПрдХреНрд╕-рд▓реЙрдЧ-рдХрд▓реЗрдХреНрдЯрд░ рдпреБрдЯрд┐рд▓рд┐рдЯреА

рд╣рд╛ рд▓реЗрдЦ рдкреНрд░рдХрд▓реНрдкрд╛рд╡рд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрд▓ nginx-рд▓реЙрдЧ-рдХрд▓реЗрдХреНрдЯрд░, рдЬреЗ nginx рд▓реЙрдЧ рд╡рд╛рдЪреЗрд▓, рддреНрдпрд╛рдВрдирд╛ рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕ рдХреНрд▓рд╕реНрдЯрд░рд╡рд░ рдкрд╛рдард╡реЗрд▓. рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдЗрд▓рд╛рд╕реНрдЯрд┐рдХрд╕рд░реНрдЪ рд╣реЗ рд▓реЙрдЧрд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рддреЗ. рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рд▓рд╛ рдХрдореА рд╕рдВрд╕рд╛рдзрдиреЗ (рдбрд┐рд╕реНрдХ рд╕реНрдкреЗрд╕, рд░реЕрдо, рд╕реАрдкреАрдпреВ) рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗрдд. рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕ рдбреЗрдЯрд╛ рдЬрд▓рдж рд▓рд┐рд╣рд┐рддреЛ. рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕ рдбреЗрдЯрд╛ рд╕рдВрдХреБрдЪрд┐рдд рдХрд░рддреЗ, рдЬреНрдпрд╛рдореБрд│реЗ рдбрд┐рд╕реНрдХрд╡рд░реАрд▓ рдбреЗрдЯрд╛ рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реЛрддреЛ. рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рдЪреЗ рдлрд╛рдпрджреЗ рдЕрд╣рд╡рд╛рд▓рд╛рддреАрд▓ 2 рд╕реНрд▓рд╛рдЗрдбреНрд╕рдордзреНрдпреЗ рдкрд╛рд╣рд┐рд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд рд╡реНрд╣реАрдХреЗ рд╣рдЬрд╛рд░реЛ рд╕рд░реНрд╡реНрд╣рд░рдордзреВрди рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рдордзреНрдпреЗ рдбреЗрдЯрд╛ рдХрд╕рд╛ рдШрд╛рд▓рддреЛ.

рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рд▓рд╛ рдПрдирдЬреАрдирдХреНрд╕ рд▓реЙрдЧ рдкрд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА рдПрд╡рд┐рдЯреЛрдХрдбреВрди рдПрдирдЬреАрдирдПрдХреНрд╕-рд▓реЙрдЧ-рдХрд▓реЗрдХреНрдЯрд░ рдпреБрдЯрд┐рд▓рд┐рдЯреА

рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рд▓рд╛ рдПрдирдЬреАрдирдХреНрд╕ рд▓реЙрдЧ рдкрд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА рдПрд╡рд┐рдЯреЛрдХрдбреВрди рдПрдирдЬреАрдирдПрдХреНрд╕-рд▓реЙрдЧ-рдХрд▓реЗрдХреНрдЯрд░ рдпреБрдЯрд┐рд▓рд┐рдЯреА

рд▓реЙрдЧрджреНрд╡рд╛рд░реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдгреЗ рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА, Grafana рд╕рд╛рдареА рдбреЕрд╢рдмреЛрд░реНрдб рддрдпрд╛рд░ рдХрд░реВрдпрд╛.

рдХреЛрдг рдХрд╛рд│рдЬреА рдШреЗрддреЗ, рдорд╛рдВрдЬрд░реАрдЪреНрдпрд╛ рдЦрд╛рд▓реА рдЖрдкрд▓реЗ рд╕реНрд╡рд╛рдЧрдд рдЖрд╣реЗ.

рдорд╛рдирдХ рдкрджреНрдзрддреАрдиреЗ nginx, grafana рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛.

рдХрдбреВрди рдЙрддреНрддрд░рджрд╛рдпреА-рдкреНрд▓реЗрдмреБрдХрд╕рд╣ рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕ рдХреНрд▓рд╕реНрдЯрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рд╛ рдбреЗрдирд┐рд╕ рдкреНрд░реЛрд╕реНрдХреБрд░рд┐рди.

рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рдордзреНрдпреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдЖрдгрд┐ рдЯреЗрдмрд▓ рддрдпрд╛рд░ рдХрд░рдгреЗ

рдпрд╛рдордзреНрдпреЗ рдлрд╛рдЗрд▓ Clickhouse рдордзреНрдпреЗ nginx-log-collector рд╕рд╛рдареА рдбреЗрдЯрд╛рдмреЗрд╕ рдЖрдгрд┐ рдЯреЗрдмрд▓реНрд╕ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА 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-рд╕реНрдЯрдм-рд╕рд░реНрд╡реНрд╣рд░ рдкрд╛рд╕реВрди рдореЕрдХреНрд╕рд┐рдо рдЗрдЧреНрдирд╛рдЯреЗрдиреНрдХреЛ

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 рд╡реЗрдмрд╕рд╛рдЗрдЯрд╡рд░ рдбреЕрд╢рдмреЛрд░реНрдб рд╕рд╛рдкрдбрдгрд╛рд░ рдирд╛рд╣реА.

рдореНрд╣рдгреВрди, рдЖрдореНрд╣реА рддреЗ рд╣рд╛рддрд╛рдиреЗ рдХрд░реВ.

рддреБрдореНрд╣реА рдорд╛рдЭрд╛ рд╕реЗрд╡реНрд╣ рдХреЗрд▓реЗрд▓рд╛ рдбреЕрд╢рдмреЛрд░реНрдб рд╢реЛрдзреВ рд╢рдХрддрд╛ рдпреЗрдереЗ.

рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рд╕рд╛рдордЧреНрд░реАрд╕рд╣ рдЯреЗрдмрд▓ рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓ рджреЗрдЦреАрд▓ рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ nginx.access_log.
рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рд▓рд╛ рдПрдирдЬреАрдирдХреНрд╕ рд▓реЙрдЧ рдкрд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА рдПрд╡рд┐рдЯреЛрдХрдбреВрди рдПрдирдЬреАрдирдПрдХреНрд╕-рд▓реЙрдЧ-рдХрд▓реЗрдХреНрдЯрд░ рдпреБрдЯрд┐рд▓рд┐рдЯреА

рд╕рд┐рдВрдЧрд▓рд╕реНрдЯреЕрдЯ рдПрдХреВрдг рд╡рд┐рдирдВрддреНрдпрд╛:

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

рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рд▓рд╛ рдПрдирдЬреАрдирдХреНрд╕ рд▓реЙрдЧ рдкрд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА рдПрд╡рд┐рдЯреЛрдХрдбреВрди рдПрдирдЬреАрдирдПрдХреНрд╕-рд▓реЙрдЧ-рдХрд▓реЗрдХреНрдЯрд░ рдпреБрдЯрд┐рд▓рд┐рдЯреА

рд╕рд┐рдВрдЧрд▓рд╕реНрдЯреЕрдЯ рдЕрдпрд╢рд╕реНрд╡реА рд╡рд┐рдирдВрддреНрдпрд╛:

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

рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рд▓рд╛ рдПрдирдЬреАрдирдХреНрд╕ рд▓реЙрдЧ рдкрд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА рдПрд╡рд┐рдЯреЛрдХрдбреВрди рдПрдирдЬреАрдирдПрдХреНрд╕-рд▓реЙрдЧ-рдХрд▓реЗрдХреНрдЯрд░ рдпреБрдЯрд┐рд▓рд┐рдЯреА

рд╕рд┐рдВрдЧрд▓рд╕реНрдЯреЕрдЯ рдЕрдпрд╢рд╕реНрд╡реА рд╣реЛрдгреНрдпрд╛рдЪреА рдЯрдХреНрдХреЗрд╡рд╛рд░реА:

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

рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рд▓рд╛ рдПрдирдЬреАрдирдХреНрд╕ рд▓реЙрдЧ рдкрд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА рдПрд╡рд┐рдЯреЛрдХрдбреВрди рдПрдирдЬреАрдирдПрдХреНрд╕-рд▓реЙрдЧ-рдХрд▓реЗрдХреНрдЯрд░ рдпреБрдЯрд┐рд▓рд┐рдЯреА

рд╕рд┐рдВрдЧрд▓рд╕реНрдЯреЕрдЯ рд╕рд░рд╛рд╕рд░реА рдкреНрд░рддрд┐рд╕рд╛рдж рд╡реЗрд│:

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

рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рд▓рд╛ рдПрдирдЬреАрдирдХреНрд╕ рд▓реЙрдЧ рдкрд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА рдПрд╡рд┐рдЯреЛрдХрдбреВрди рдПрдирдЬреАрдирдПрдХреНрд╕-рд▓реЙрдЧ-рдХрд▓реЗрдХреНрдЯрд░ рдпреБрдЯрд┐рд▓рд┐рдЯреА

рд╕рд┐рдВрдЧрд▓рд╕реНрдЯреЕрдЯ рдХрдорд╛рд▓ рдкреНрд░рддрд┐рд╕рд╛рдж рд╡реЗрд│:

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

рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рд▓рд╛ рдПрдирдЬреАрдирдХреНрд╕ рд▓реЙрдЧ рдкрд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА рдПрд╡рд┐рдЯреЛрдХрдбреВрди рдПрдирдЬреАрдирдПрдХреНрд╕-рд▓реЙрдЧ-рдХрд▓реЗрдХреНрдЯрд░ рдпреБрдЯрд┐рд▓рд┐рдЯреА

рдЧрдгрдирд╛ рд╕реНрдерд┐рддреА:

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

рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рд▓рд╛ рдПрдирдЬреАрдирдХреНрд╕ рд▓реЙрдЧ рдкрд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА рдПрд╡рд┐рдЯреЛрдХрдбреВрди рдПрдирдЬреАрдирдПрдХреНрд╕-рд▓реЙрдЧ-рдХрд▓реЗрдХреНрдЯрд░ рдпреБрдЯрд┐рд▓рд┐рдЯреА

рдкрд╛рдИ рдкреНрд░рдорд╛рдгреЗ рдбреЗрдЯрд╛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ рдЖрдгрд┐ рдЧреНрд░рд╛рдлрд╛рдирд╛ рд░реАрд▓реЛрдб рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

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

рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рд▓рд╛ рдПрдирдЬреАрдирдХреНрд╕ рд▓реЙрдЧ рдкрд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА рдПрд╡рд┐рдЯреЛрдХрдбреВрди рдПрдирдЬреАрдирдПрдХреНрд╕-рд▓реЙрдЧ-рдХрд▓реЗрдХреНрдЯрд░ рдпреБрдЯрд┐рд▓рд┐рдЯреА

рдкреБрдвреЗ рдореА рд╕реНрдХреНрд░реАрдирд╢реЙрдЯрд╢рд┐рд╡рд╛рдп рд╡рд┐рдирдВрддреНрдпрд╛ рджреЗрдИрди:

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

рд╕рд░реНрд╡ vhosts рд╕рд╛рдареА рд╕рд╛рд░рдгреА рдЧрдгрдирд╛ рд╕реНрдерд┐рддреА:

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

рдбреЕрд╢рдмреЛрд░реНрдбрдЪреЗ рд╕рд╛рдорд╛рдиреНрдп рджреГрд╢реНрдп

рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рд▓рд╛ рдПрдирдЬреАрдирдХреНрд╕ рд▓реЙрдЧ рдкрд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА рдПрд╡рд┐рдЯреЛрдХрдбреВрди рдПрдирдЬреАрдирдПрдХреНрд╕-рд▓реЙрдЧ-рдХрд▓реЗрдХреНрдЯрд░ рдпреБрдЯрд┐рд▓рд┐рдЯреА

рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рд▓рд╛ рдПрдирдЬреАрдирдХреНрд╕ рд▓реЙрдЧ рдкрд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА рдПрд╡рд┐рдЯреЛрдХрдбреВрди рдПрдирдЬреАрдирдПрдХреНрд╕-рд▓реЙрдЧ-рдХрд▓реЗрдХреНрдЯрд░ рдпреБрдЯрд┐рд▓рд┐рдЯреА

рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рд▓рд╛ рдПрдирдЬреАрдирдХреНрд╕ рд▓реЙрдЧ рдкрд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА рдПрд╡рд┐рдЯреЛрдХрдбреВрди рдПрдирдЬреАрдирдПрдХреНрд╕-рд▓реЙрдЧ-рдХрд▓реЗрдХреНрдЯрд░ рдпреБрдЯрд┐рд▓рд┐рдЯреА

рд╕рд░рд╛рд╕рд░реА() рдЖрдгрд┐ рдХреНрд╡рд╛рдВрдЯрд╛рдЗрд▓() рдпрд╛рдВрдЪреА рддреБрд▓рдирд╛ рдХрд░рдгреЗ

рд╕рд░рд╛рд╕рд░реА()
рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рд▓рд╛ рдПрдирдЬреАрдирдХреНрд╕ рд▓реЙрдЧ рдкрд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА рдПрд╡рд┐рдЯреЛрдХрдбреВрди рдПрдирдЬреАрдирдПрдХреНрд╕-рд▓реЙрдЧ-рдХрд▓реЗрдХреНрдЯрд░ рдпреБрдЯрд┐рд▓рд┐рдЯреА
рдкрд░рд┐рдорд╛рдг()
рдХреНрд▓рд┐рдХрд╣рд╛рдКрд╕рд▓рд╛ рдПрдирдЬреАрдирдХреНрд╕ рд▓реЙрдЧ рдкрд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА рдПрд╡рд┐рдЯреЛрдХрдбреВрди рдПрдирдЬреАрдирдПрдХреНрд╕-рд▓реЙрдЧ-рдХрд▓реЗрдХреНрдЯрд░ рдпреБрдЯрд┐рд▓рд┐рдЯреА

рдирд┐рд╖реНрдХрд░реНрд╖:

рдЖрд╢рд╛ рдЖрд╣реЗ рдХреА рд╕рдореБрджрд╛рдп nginx-log-colector рд╡рд┐рдХрд╕рд┐рдд/рдЪрд╛рдЪрдгреА рдЖрдгрд┐ рд╡рд╛рдкрд░рдгреНрдпрд╛рдд рд╕рд╣рднрд╛рдЧреА рд╣реЛрдИрд▓.
рдЖрдгрд┐ рдЬреЗрд╡реНрд╣рд╛ рдХреЛрдгреА nginx-log-collecter рд▓рд╛рдЧреВ рдХрд░рддреЛ рддреЗрд╡реНрд╣рд╛ рддреЛ рддреБрдореНрд╣рд╛рд▓рд╛ рдбрд┐рд╕реНрдХ, RAM, CPU рдХрд┐рддреА рд╕реЗрд╡реНрд╣ рдХреЗрд▓рд╛ рд╣реЗ рд╕рд╛рдВрдЧреЗрд▓.

рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдо рдЪреЕрдиреЗрд▓:

рдорд┐рд▓реАрд╕реЗрдХрдВрдж:

рдорд┐рд▓реАрд╕реЗрдХрдВрджрд╛рдВрдЪреА рдХрд╛рд│рдЬреА рдХреЛрдгрд╛рд▓рд╛ рдЖрд╣реЗ, рдХреГрдкрдпрд╛ рдпрд╛рдд рд▓рд┐рд╣рд╛ рдХрд┐рдВрд╡рд╛ рдордд рджреНрдпрд╛ рд╕рдорд╕реНрдпрд╛.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛