Nginx-log-collector utilīta no Avito, lai nosūtītu nginx žurnālus uz Clickhouse

Šajā rakstā tiks apspriests projekts nginx-log-collector, kas nolasīs nginx žurnālus, nosūtīs tos Clickhouse klasterim. Parasti žurnāliem tiek izmantota ElasticSearch. Clickhouse prasa mazāk resursu (diskā, RAM, CPU). Clickhouse ieraksta datus ātrāk. Clickhouse saspiež datus, kas padara datus diskā vēl kompaktākus. Clickhouse priekšrocības var redzēt 2 pārskata slaidos Kā VK ievieto datus pakalpojumā ClickHouse no desmitiem tūkstošu serveru.

Nginx-log-collector utilīta no Avito, lai nosūtītu nginx žurnālus uz Clickhouse

Nginx-log-collector utilīta no Avito, lai nosūtītu nginx žurnālus uz Clickhouse

Lai skatītu analīzi pēc žurnāliem, izveidosim Grafana informācijas paneli.

Kam tas interesē, laipni lūdzam zem kaķa.

Instalējiet nginx, grafana standarta veidā.

Instalējiet Clickhouse klasteru ar ansible-playbook no Deniss Proskurins.

Datu bāzes un tabulu izveide programmā Clickhouse

Šajā failu Ir aprakstīti SQL vaicājumi datu bāzu un tabulu izveidei nginx-log-collector pakalpojumā Clickhouse.

Mēs veicam katru pieprasījumu pēc kārtas katrā Clickhouse klastera serverī.

Svarīga piezīme. Šajā rindā logs_cluster ir jāaizstāj ar klastera nosaukumu no faila clickhouse_remote_servers.xml starp "remote_servers" un "shard".

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

Nginx-log-collector-rpm instalēšana un konfigurēšana

Nginx-log-collector nav apgr./min. Šeit https://github.com/patsevanton/nginx-log-collector-rpm izveidojiet tam apgriezienus. apgr./min tiks veidots, izmantojot Fedora Copr

Instalējiet rpm pakotni 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

Rediģēt konfigurāciju /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/

Notiek nginx iestatīšana

Vispārējā nginx konfigurācija:

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

Virtuālais resursdators viens:

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

Pievienojiet virtuālos saimniekdatorus failam /etc/hosts:

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

HTTP servera emulators

Mēs izmantosim kā HTTP servera emulatoru nodejs-stub-serveris no Maksims Ignatenko

nodejs-stub-server nav rpm. Šeit https://github.com/patsevanton/nodejs-stub-server izveidojiet tam apgriezienus. apgr./min tiks veidots, izmantojot Fedora Copr

Instalējiet pakotni nodejs-stub-server uz augšup 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

Stresa testēšana

Testēšana tiek veikta, izmantojot Apache etalonu.

Instalējiet to:

yum install -y httpd-tools

Mēs sākam testēšanu, izmantojot Apache etalonu no 5 dažādiem serveriem:

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 iestatīšana

Oficiālajā Grafana vietnē informācijas paneli neatradīsit.

Tāpēc mēs to darīsim ar rokām.

Jūs varat atrast manu saglabāto informācijas paneli šeit.

Ir arī jāizveido tabulas mainīgais ar saturu nginx.access_log.
Nginx-log-collector utilīta no Avito, lai nosūtītu nginx žurnālus uz Clickhouse

Singlestat kopējais pieprasījumu skaits:

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

Nginx-log-collector utilīta no Avito, lai nosūtītu nginx žurnālus uz Clickhouse

Singlestat neizdevušies pieprasījumi:

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

Nginx-log-collector utilīta no Avito, lai nosūtītu nginx žurnālus uz Clickhouse

Singlestat neveiksmju procents:

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 utilīta no Avito, lai nosūtītu nginx žurnālus uz Clickhouse

Singlestat vidējais atbildes laiks:

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

Nginx-log-collector utilīta no Avito, lai nosūtītu nginx žurnālus uz Clickhouse

Singlestat maksimālais reakcijas laiks:

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

Nginx-log-collector utilīta no Avito, lai nosūtītu nginx žurnālus uz Clickhouse

Skaitīšanas statuss:

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

Nginx-log-collector utilīta no Avito, lai nosūtītu nginx žurnālus uz Clickhouse

Lai izvadītu datus kā pīrāgu, jāinstalē spraudnis un atkārtoti jāielādē grafana.

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

Pīrāgu TOP 5 statuss:

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 utilīta no Avito, lai nosūtītu nginx žurnālus uz Clickhouse

Tālāk es sniegšu pieprasījumus bez ekrānuzņēmumiem:

Skaits http_user_agent:

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

GoodRate/BadRate:

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

atbildes laiks:

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

Augšup straumes reakcijas laiks (1. augšpus straumes reakcijas laiks):

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

Tabulu skaita statuss visiem vhosts:

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

Informācijas paneļa vispārīgs skats

Nginx-log-collector utilīta no Avito, lai nosūtītu nginx žurnālus uz Clickhouse

Nginx-log-collector utilīta no Avito, lai nosūtītu nginx žurnālus uz Clickhouse

Nginx-log-collector utilīta no Avito, lai nosūtītu nginx žurnālus uz Clickhouse

Avg() un kvantile() salīdzināšana

vid.()
Nginx-log-collector utilīta no Avito, lai nosūtītu nginx žurnālus uz Clickhouse
kvantile()
Nginx-log-collector utilīta no Avito, lai nosūtītu nginx žurnālus uz Clickhouse

Secinājums:

Cerams, ka kopiena iesaistīsies nginx-log-collector izstrādē/testēšanā un izmantošanā.
Un, kad kāds ieviesīs nginx-log-collector, viņš jums pateiks, cik daudz viņš ir saglabājis disku, RAM, centrālo procesoru.

Telegrammas kanāli:

Milisekundes:

Kam rūp milisekundes, rakstiet vai balsojiet, lūdzu, šajā izdot.

Avots: www.habr.com

Pievieno komentāru