Nginx-log-collector værktøjet fra Avito til at sende logs fra nginx til Clickhouse

I denne artikel vil projektet blive gennemgået nginx-log-collector, som vil læse logs fra nginx og sende dem til Clickhouse-klyngen. Normalt bruges ElasticSearch til logs. Clickhouse kræver færre ressourcer (diskplads, RAM, CPU). Clickhouse skriver data hurtigere. Clickhouse komprimerer data, hvilket gør dataene på disken endnu mere kompakte. Fordelene ved Clickhouse kan ses i 2 slides fra præsentationen Hvordan VK indsætter data i ClickHouse fra titusinder af servere.

Nginx-log-collector værktøjet fra Avito til at sende logs fra nginx til Clickhouse

Nginx-log-collector værktøjet fra Avito til at sende logs fra nginx til Clickhouse

For at se analytik om logs vil vi oprette et dashboard til Grafana.

De, der er interesseret, er velkomne til at læse videre.

Vi installerer nginx, grafana på den sædvanlige måde.

Vi installerer en Clickhouse-klynge ved hjælp af ansible-playbook fra Denis Proskurin.

Oprettelse af database og tabeller i Clickhouse

I denne fil beskrives SQL-forespørgslerne til oprettelse af database og tabeller for nginx-log-collector i Clickhouse.

Hver forespørgsel udføres sekventielt på hver server i Clickhouse-klyngen.

Vigtigt bemærkning. I denne linje skal logs_cluster ændres til dit klyngenavn fra filen clickhouse_remote_servers.xml mellem "remote_servers" og "shard".

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

Installation og konfiguration af nginx-log-collector-rpm

Nginx-log-collector har ikke en rpm. Her https://github.com/patsevanton/nginx-log-collector-rpm opretter vi en rpm for det. RPM'en vil blive bygget ved hjælp af Fedora Copr

Installerer rpm-pakken 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

Vi retter konfigurationsfilen /etc/nginx-log-collector/config.yaml:

  .......
  upload:
    table: nginx.access_log
    dsn: http://ip-adressen-til-clickhouse-klyngen:8123/

- tag: "nginx_error:"
  format: error  # access | error
  buffer_size: 1048576
  upload:
    table: nginx.error_log
    dsn: http://ip-adressen-til-clickhouse-klyngen:8123/

Konfiguration af nginx

Den samlede nginx-konfiguration:

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

Virtuel vært én:

vhost1.conf:

upstream backend {
    server ip-adresse-på-server-med-stub_http_server:8080;
    server ip-adresse-på-server-med-stub_http_server:8080;
    server ip-adresse-på-server-med-stub_http_server:8080;
    server ip-adresse-på-server-med-stub_http_server:8080;
    server ip-adresse-på-server-med-stub_http_server:8080;
}

server {
    listen   80;
    server_name vhost1;
    location / {
        proxy_pass http://backend;
    }
}

Tilføj virtuelle værter til filen /etc/hosts:

ip-adresse-på-server-med-nginx vhost1

HTTP server emulator

Som HTTP server emulator vil vi bruge nodejs-stub-server fra Maxim Ignatenko

Nodejs-stub-server har ikke rpm. Her https://github.com/patsevanton/nodejs-stub-server opretter vi en rpm for det. RPM'en vil blive bygget ved hjælp af Fedora Copr

Installerer nodejs-stub-server rpm-pakken på upstream nginx

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

Belastningstest

Testen udføres ved hjælp af Apache benchmark.

Installerer det:

yum install -y httpd-tools

Starter testningen med Apache benchmark fra 5 forskellige servere:

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

Konfiguration af Grafana

På den officielle Grafana hjemmeside finder du ikke dashboardet.

Derfor vil vi gøre det manuelt.

Du kan finde mit gemte dashboard her.

Du skal også oprette en variabel table med indholdet nginx.access_log.
Nginx-log-collector værktøjet fra Avito til at sende logs fra nginx til Clickhouse

Singlestat Totale Anmodninger:

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

Nginx-log-collector værktøjet fra Avito til at sende logs fra nginx til Clickhouse

Singlestat Mislykkede Anmodninger:

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

Nginx-log-collector værktøjet fra Avito til at sende logs fra nginx til Clickhouse

Singlestat Fejlprocent:

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 værktøjet fra Avito til at sende logs fra nginx til Clickhouse

Singlestat Gennemsnitlig svartid:

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

Nginx-log-collector værktøjet fra Avito til at sende logs fra nginx til Clickhouse

Singlestat Maksimal svartid:

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

Nginx-log-collector værktøjet fra Avito til at sende logs fra nginx til Clickhouse

Tæl Status:

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

Nginx-log-collector værktøjet fra Avito til at sende logs fra nginx til Clickhouse

For at vise data som et cirkeldiagram, skal du installere et plugin og genstarte grafana.

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

Cirkeldiagram TOP 5 Status:

SELECT
    1, 
    status,
    sum(status) AS Reqs
FROM $table
WHERE $timeFilter
GROUP BY status
ORDER BY Reqs desc
LIMIT 5

Nginx-log-collector værktøjet fra Avito til at sende logs fra nginx til Clickhouse

Herefter vil jeg præsentere forespørgsler uden skærmbilleder:

Tæl http_user_agent:

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

GodRate/DårligRate:

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

Svar Timing:

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

Upstream svartid (tid til første upstream svar):

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

Tabel Tæl Status for alle vhost:

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

Generelt dashboard layout

Nginx-log-collector værktøjet fra Avito til at sende logs fra nginx til Clickhouse

Nginx-log-collector værktøjet fra Avito til at sende logs fra nginx til Clickhouse

Nginx-log-collector værktøjet fra Avito til at sende logs fra nginx til Clickhouse

Sammenligning af avg() og quantile()

avg()
Nginx-log-collector værktøjet fra Avito til at sende logs fra nginx til Clickhouse
quantile()
Nginx-log-collector værktøjet fra Avito til at sende logs fra nginx til Clickhouse

Output:

Jeg håber, at samfundet vil deltage i udvikling/testing og brugen af nginx-log-collector.
Og at nogen, når de implementerer nginx-log-collector, vil fortælle hvor meget disk, RAM, CPU de har sparet.

Telegram kanaler:

Millisekunder:

For dem, der værdsætter millisekunder, skriv eller stem venligst på dette issue.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster