Karsaziya Nginx-log-collector ji Avito ji bo şandina têketinên nginx ji Clickhouse re

Ev gotar dê li ser projeyê nîqaş bike nginx-log-berhevkar, ku dê têketinên nginx bixwînin û wan bişînin koma Clickhouse. Bi gelemperî ElasticSearch ji bo têketin tê bikar anîn. Clickhouse kêmtir çavkaniyên (cihê dîskê, RAM, CPU) hewce dike. Clickhouse daneyan zûtir tomar dike. Clickhouse daneyan berhev dike, daneyên li ser dîskê hêj tevlihevtir dike. Awantajên Clickhouse di 2 slaytên raporê de têne xuyang kirin VK çawa ji deh hezaran serveran daneyan dixe ClickHouse.

Karsaziya Nginx-log-collector ji Avito ji bo şandina têketinên nginx ji Clickhouse re

Karsaziya Nginx-log-collector ji Avito ji bo şandina têketinên nginx ji Clickhouse re

Ji bo dîtina analîtîkên li ser bingeha têketin, em ê ji bo Grafana tabloyek çêbikin.

Her kesê eleqedar, bi xêr hatî pisîkê.

Nginx, grafana bi awayê standard saz bikin.

Sazkirina komek klîkhouse bi karanîna ansible-playbook from Denis Proskurin.

Afirandina databas û tabloyan li Clickhouse

Li vê dosî Pirsên SQL ji bo afirandina databas û tabloyên ji bo nginx-log-collector li Clickhouse têne diyar kirin.

Em her daxwazek yek bi yek li ser her serverek di koma Clickhouse de dikin.

Nîşe girîng. Di vê rêzê de, pêdivî ye ku logs_cluster bi navê koma we ji pelê clickhouse_remote_servers.xml di navbera "remote_servers" û "shard" de were guheztin.

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

Sazkirin û mîhengkirina nginx-log-collector-rpm

Nginx-log-collector rpm nîne. Vir https://github.com/patsevanton/nginx-log-collector-rpm ji bo wê rpm çêbikin. rpm dê bi kar were berhev kirin Fedora Copr

Pakêta rpm nginx-log-collector-rpm saz bikin

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

Veavakirina /etc/nginx-log-collector/config.yaml biguherîne:

  .......
  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/

Sazkirina nginx

Veavakirina nginx ya gelemperî:

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

Yek mêvandarê virtual:

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

Mêvanên virtual li pelê /etc/hosts zêde bikin:

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

Emûlatorê servera HTTP

Em ê wekî emûlatorek servera HTTP bikar bînin nodejs-stub-server ji Maxim Ignatenko

Nodejs-stub-server rpm tune. Vir https://github.com/patsevanton/nodejs-stub-server ji bo wê rpm çêbikin. rpm dê bi kar were berhev kirin Fedora Copr

Pakêta nodejs-stub-server li ser jorîn nginx rpm saz bikin

yum -y install yum-plugin-copr
yum copr enable antonpatsev/nodejs-stub-server
yum -y install stub_http_server
systemctl start stub_http_server

Testkirina Stresê

Em ceribandinê bi karanîna pîvana Apache pêk tînin.

Saz bike:

yum install -y httpd-tools

Em dest bi ceribandinê dikin ku pîvana Apache ji 5 serverên cihêreng bikar tînin:

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

Damezrandina Grafana

Hûn ê li ser malpera fermî ya Grafana dashboardek nabînin.

Ji ber vê yekê, em ê bi destê xwe bikin.

Hûn dikarin tabloya min a tomarkirî bibînin vir.

Her weha hûn hewce ne ku guhêrbarek tabloyê bi naverokê re biafirînin nginx.access_log.
Karsaziya Nginx-log-collector ji Avito ji bo şandina têketinên nginx ji Clickhouse re

Tevahiya Daxwazên Singlestat:

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

Karsaziya Nginx-log-collector ji Avito ji bo şandina têketinên nginx ji Clickhouse re

Daxwazên Serketî yên Singlestat:

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

Karsaziya Nginx-log-collector ji Avito ji bo şandina têketinên nginx ji Clickhouse re

Ji sedî têkçûna yekdestê:

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

Karsaziya Nginx-log-collector ji Avito ji bo şandina têketinên nginx ji Clickhouse re

Demjimêra Bersiva Navîn a Singlestat:

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

Karsaziya Nginx-log-collector ji Avito ji bo şandina têketinên nginx ji Clickhouse re

Dema Bersivê ya Singlestat Max:

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

Karsaziya Nginx-log-collector ji Avito ji bo şandina têketinên nginx ji Clickhouse re

Rewşa hejmartinê:

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

Karsaziya Nginx-log-collector ji Avito ji bo şandina têketinên nginx ji Clickhouse re

Ji bo derxistina daneyan mîna pie, hûn hewce ne ku pêvekê saz bikin û grafana ji nû ve bidin destpêkirin.

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

Rewşa 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

Karsaziya Nginx-log-collector ji Avito ji bo şandina têketinên nginx ji Clickhouse re

Zêdetir ez ê daxwazan bêyî dîmenan bidim:

Hejmara http_user_agent:

$columns(http_user_agent, count(*) c) FROM $table

Rêjeya Baş / Rêjeya Nebaş:

$rate(countIf(status = 200) AS good, countIf(status != 200) AS bad) FROM $table

Demjimêra bersivê:

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

Dema bersivê ya jorîn (dema bersivê ya 1emîn):

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

Rewşa Hejmara Tabloyê ji bo hemî vhost:

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

Dîtina giştî ya dashboardê

Karsaziya Nginx-log-collector ji Avito ji bo şandina têketinên nginx ji Clickhouse re

Karsaziya Nginx-log-collector ji Avito ji bo şandina têketinên nginx ji Clickhouse re

Karsaziya Nginx-log-collector ji Avito ji bo şandina têketinên nginx ji Clickhouse re

Berawirdkirina avg() û quantile()

avg()
Karsaziya Nginx-log-collector ji Avito ji bo şandina têketinên nginx ji Clickhouse re
quantile ()
Karsaziya Nginx-log-collector ji Avito ji bo şandina têketinên nginx ji Clickhouse re

Encam:

Ez hêvî dikim ku civak dê beşdarî pêşkeftin / ceribandin û karanîna nginx-log-collector bibe.
Û gava ku kesek nginx-log-collector bicîh tîne, ew ê ji we re vebêje ka ew çiqas li ser dîsk, RAM, û CPU-yê xilas kiriye.

Kanalên Telegram:

Mîlyoserk:

Ji kê re millisecond girîng in, ji kerema xwe li vê binivîsin an deng bidin pirs.

Source: www.habr.com

Add a comment