Nginx-log-collector uslužni program iz Avita za slanje nginx dnevnika u Clickhouse

Ovaj članak će raspravljati o projektu nginx-log-collector, koji će čitati nginx dnevnike, poslati ih u Clickhouse klaster. Obično se ElasticSearch koristi za zapise. Clickhouse zahtijeva manje resursa (prostor na disku, RAM, CPU). Clickhouse brže upisuje podatke. Clickhouse komprimira podatke, što podatke na disku čini još kompaktnijim. Prednosti Clickhouse-a mogu se vidjeti na 2 slajda iz izvještaja Kako VK ubacuje podatke u ClickHouse sa desetina hiljada servera.

Nginx-log-collector uslužni program iz Avita za slanje nginx dnevnika u Clickhouse

Nginx-log-collector uslužni program iz Avita za slanje nginx dnevnika u Clickhouse

Za pregled analitike prema zapisnicima, napravimo kontrolnu ploču za Grafanu.

Koga briga, dobrodošao pod mačku.

Instalirajte nginx, grafana na standardni način.

Instalirajte clickhouse klaster sa ansible-playbookom iz Denis Proskurin.

Kreiranje baze podataka i tabela u Clickhouse-u

U ovome fajl Opisani su SQL upiti za kreiranje baza podataka i tabela za nginx-log-collector u Clickhouseu.

Svaki zahtjev pravimo redom na svakom serveru Clickhouse klastera.

Važna napomena. U ovom redu, logs_cluster treba zamijeniti imenom vašeg klastera iz datoteke clickhouse_remote_servers.xml između "remote_servers" i "shard".

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

Instaliranje i konfigurisanje nginx-log-collector-rpm

Nginx-log-collector nema rpm. Evo https://github.com/patsevanton/nginx-log-collector-rpm kreirajte rpm za to. rpm će biti izgrađen pomoću Fedora Copr

Instalirajte rpm paket 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

Uredite konfiguraciju /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/

Postavljanje nginxa

Opća nginx konfiguracija:

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

Virtuelni host jedan:

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

Dodajte virtuelne hostove u /etc/hosts fajl:

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

Emulator HTTP servera

Kao emulator HTTP servera koristićemo nodejs-stub-server iz Maxim Ignatenko

nodejs-stub-server nema rpm. Evo https://github.com/patsevanton/nodejs-stub-server kreirajte rpm za to. rpm će biti izgrađen pomoću Fedora Copr

Instalirajte paket nodejs-stub-server na upstream 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

Testiranje na stres

Testiranje se vrši pomoću Apache benchmark-a.

Instalirajte ga:

yum install -y httpd-tools

Počinjemo testiranje koristeći Apache benchmark sa 5 različitih servera:

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

Postavljanje Grafane

Na službenoj web stranici Grafane nećete pronaći kontrolnu ploču.

Stoga ćemo to uraditi ručno.

Možete pronaći moju sačuvanu kontrolnu tablu ovdje.

Također morate kreirati varijablu tabele sa sadržajem nginx.access_log.
Nginx-log-collector uslužni program iz Avita za slanje nginx dnevnika u Clickhouse

Ukupni pojedinačni zahtjevi:

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

Nginx-log-collector uslužni program iz Avita za slanje nginx dnevnika u Clickhouse

Singlestat neuspjeli zahtjevi:

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

Nginx-log-collector uslužni program iz Avita za slanje nginx dnevnika u Clickhouse

Postotak neuspjeha pojedinačnih statistika:

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 uslužni program iz Avita za slanje nginx dnevnika u Clickhouse

Singlestat prosječno vrijeme odgovora:

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

Nginx-log-collector uslužni program iz Avita za slanje nginx dnevnika u Clickhouse

Maksimalno vrijeme odziva jednog statusa:

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

Nginx-log-collector uslužni program iz Avita za slanje nginx dnevnika u Clickhouse

Status brojanja:

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

Nginx-log-collector uslužni program iz Avita za slanje nginx dnevnika u Clickhouse

Za izlaz podataka kao kolač, morate instalirati dodatak i ponovo učitati grafanu.

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

Pita TOP 5 Status:

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 uslužni program iz Avita za slanje nginx dnevnika u Clickhouse

Dalje ću dati zahtjeve bez snimaka ekrana:

Broj 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

vrijeme odgovora:

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

Vrijeme odgovora uzvodno (vrijeme odgovora 1. uzvodno):

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

Status broja tablica za sve vhostove:

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

Opšti pogled na instrument tablu

Nginx-log-collector uslužni program iz Avita za slanje nginx dnevnika u Clickhouse

Nginx-log-collector uslužni program iz Avita za slanje nginx dnevnika u Clickhouse

Nginx-log-collector uslužni program iz Avita za slanje nginx dnevnika u Clickhouse

Poređenje avg() i quantile()

prosječno()
Nginx-log-collector uslužni program iz Avita za slanje nginx dnevnika u Clickhouse
kvantil()
Nginx-log-collector uslužni program iz Avita za slanje nginx dnevnika u Clickhouse

Zaključak:

Nadamo se da će se zajednica uključiti u razvoj/testiranje i korištenje nginx-log-collector-a.
A kada neko implementira nginx-log-collector, on će vam reći koliko je uštedio disk, RAM, CPU.

Telegram kanali:

Milisekunde:

Koga briga za milisekunde, pišite ili glasajte, molim vas, u ovome problem.

izvor: www.habr.com

Dodajte komentar