Nginx-log-collector-verktyg från Avito för att skicka nginx-loggar till Clickhouse

Den här artikeln kommer att diskutera projektet nginx-logg-samlare, som kommer att läsa nginx-loggar och skicka dem till Clickhouse-klustret. Vanligtvis används ElasticSearch för loggar. Clickhouse kräver mindre resurser (diskutrymme, RAM, CPU). Clickhouse registrerar data snabbare. Clickhouse komprimerar data, vilket gör data på disken ännu mer kompakt. Fördelarna med Clickhouse syns i 2 bilder från rapporten Hur VK infogar data i ClickHouse från tiotusentals servrar.

Nginx-log-collector-verktyg från Avito för att skicka nginx-loggar till Clickhouse

Nginx-log-collector-verktyg från Avito för att skicka nginx-loggar till Clickhouse

För att se analyser baserade på loggar kommer vi att skapa en instrumentpanel för Grafana.

Alla som är intresserade, välkomna till katt.

Installera nginx, grafana på standard sätt.

Installera ett klickhuskluster med ansible-playbook från Denis Proskurin.

Skapa databaser och tabeller i Clickhouse

i detta fil SQL-frågor för att skapa databaser och tabeller för nginx-log-collector i Clickhouse beskrivs.

Vi gör varje begäran en efter en på varje server i Clickhouse-klustret.

Viktig notering. På den här raden måste logs_cluster ersättas med ditt klusternamn från filen clickhouse_remote_servers.xml mellan "remote_servers" och "shard".

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

Installera och konfigurera nginx-log-collector-rpm

Nginx-log-collector har inget rpm. Här https://github.com/patsevanton/nginx-log-collector-rpm skapa rpm för det. rpm kommer att kompileras med hjälp av Fedora Copr

Installera rpm-paketet 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

Redigera konfigurationen /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/

Konfigurera nginx

Allmän nginx-konfiguration:

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

En virtuell värd:

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

Lägg till virtuella värdar till filen /etc/hosts:

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

HTTP-serveremulator

Som en HTTP-serveremulator kommer vi att använda nodejs-stub-server från Maxim Ignatenko

Nodejs-stub-server har ingen rpm. Här https://github.com/patsevanton/nodejs-stub-server skapa rpm för det. rpm kommer att kompileras med hjälp av Fedora Copr

Installera paketet nodejs-stub-server på uppströms 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

Stresstestning

Vi utför tester med Apache benchmark.

Installera det:

yum install -y httpd-tools

Vi börjar testa med Apache benchmark från 5 olika servrar:

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

Installerar Grafana

Du hittar ingen instrumentpanel på den officiella Grafana-webbplatsen.

Därför kommer vi att göra det för hand.

Du kan hitta min sparade instrumentpanel här.

Du måste också skapa en tabellvariabel med innehållet nginx.access_log.
Nginx-log-collector-verktyg från Avito för att skicka nginx-loggar till Clickhouse

Singlestat totalt antal förfrågningar:

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

Nginx-log-collector-verktyg från Avito för att skicka nginx-loggar till Clickhouse

Singlestat misslyckade förfrågningar:

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

Nginx-log-collector-verktyg från Avito för att skicka nginx-loggar till Clickhouse

Singlestat misslyckande procent:

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-verktyg från Avito för att skicka nginx-loggar till Clickhouse

Singlestat Genomsnittlig svarstid:

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

Nginx-log-collector-verktyg från Avito för att skicka nginx-loggar till Clickhouse

Singlestat Max svarstid:

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

Nginx-log-collector-verktyg från Avito för att skicka nginx-loggar till Clickhouse

Räknestatus:

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

Nginx-log-collector-verktyg från Avito för att skicka nginx-loggar till Clickhouse

För att mata ut data som en paj måste du installera plugin-programmet och starta om grafana.

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

Paj 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-verktyg från Avito för att skicka nginx-loggar till Clickhouse

Vidare kommer jag att ge förfrågningar utan skärmdumpar:

Räkna 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

Svarstidpunkt:

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

Uppströms svarstid (första uppströms svarstid):

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

Tabellräkningsstatus för alla vhost:

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

Allmän vy av instrumentpanelen

Nginx-log-collector-verktyg från Avito för att skicka nginx-loggar till Clickhouse

Nginx-log-collector-verktyg från Avito för att skicka nginx-loggar till Clickhouse

Nginx-log-collector-verktyg från Avito för att skicka nginx-loggar till Clickhouse

Jämförelse av avg() och quantile()

avg()
Nginx-log-collector-verktyg från Avito för att skicka nginx-loggar till Clickhouse
quantile()
Nginx-log-collector-verktyg från Avito för att skicka nginx-loggar till Clickhouse

Slutsats:

Jag hoppas att communityn kommer att engagera sig i att utveckla/testa och använda nginx-log-collector.
Och när någon implementerar nginx-log-collector, kommer de att berätta hur mycket de sparat på disk, RAM och CPU.

Telegramkanaler:

Millisekunder:

För vem millisekunder spelar roll, skriv eller rösta i detta fråga.

Källa: will.com

Lägg en kommentar