Nginx-log-collector-værktøj fra Avito til at sende nginx-logfiler til Clickhouse

Denne artikel vil diskutere projektet nginx-log-samler, som læser nginx-logfiler og sender dem til Clickhouse-klyngen. Normalt bruges ElasticSearch til logfiler. Clickhouse kræver færre ressourcer (diskplads, RAM, CPU). Clickhouse registrerer data hurtigere. Clickhouse komprimerer data, hvilket gør dataene på disken endnu mere kompakte. Fordelene ved Clickhouse er synlige i 2 slides fra rapporten Hvordan VK indsætter data i ClickHouse fra titusindvis af servere.

Nginx-log-collector-værktøj fra Avito til at sende nginx-logfiler til Clickhouse

Nginx-log-collector-værktøj fra Avito til at sende nginx-logfiler til Clickhouse

For at se analyser baseret på logfiler, vil vi oprette et dashboard til Grafana.

Alle interesserede, velkommen til kat.

Installer nginx, grafana på standard måde.

Installation af en klikhusklynge ved hjælp af ansible-playbook fra Denis Proskurin.

Oprettelse af databaser og tabeller i Clickhouse

i denne fil SQL-forespørgsler til oprettelse af databaser og tabeller til nginx-log-collector i Clickhouse er beskrevet.

Vi laver hver anmodning en efter en på hver server i Clickhouse-klyngen.

Vigtig note. På denne linje skal logs_cluster erstattes med 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 lav rpm til det. rpm vil blive kompileret vha Fedora Copr

Installer 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

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

Opsætning af nginx

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

Én virtuel vært:

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

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

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

HTTP server emulator

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

Nodejs-stub-server har ikke en rpm. Her https://github.com/patsevanton/nodejs-stub-server lav rpm til det. rpm vil blive kompileret vha Fedora Copr

Installer nodejs-stub-server-pakken på 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

Stresstest

Vi udfører test ved hjælp af Apache benchmark.

Installer det:

yum install -y httpd-tools

Vi begynder at teste 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

Opsætning af Grafana

Du finder ikke et dashboard på det officielle Grafana-websted.

Derfor vil vi gøre det i hånden.

Du kan finde mit gemte dashboard her.

Du skal også oprette en tabelvariabel med indholdet nginx.access_log.
Nginx-log-collector-værktøj fra Avito til at sende nginx-logfiler til Clickhouse

Singlestat samlede anmodninger:

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

Nginx-log-collector-værktøj fra Avito til at sende nginx-logfiler 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øj fra Avito til at sende nginx-logfiler 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øj fra Avito til at sende nginx-logfiler til Clickhouse

Singlestat gennemsnitlig responstid:

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

Nginx-log-collector-værktøj fra Avito til at sende nginx-logfiler til Clickhouse

Singlestat Max responstid:

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

Nginx-log-collector-værktøj fra Avito til at sende nginx-logfiler til Clickhouse

Optællingsstatus:

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

Nginx-log-collector-værktøj fra Avito til at sende nginx-logfiler til Clickhouse

For at udlæse data som en kage skal du installere plugin'et og genstarte grafana.

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

Tærte 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-værktøj fra Avito til at sende nginx-logfiler til Clickhouse

Yderligere vil jeg give anmodninger uden skærmbilleder:

Tæl http_bruger_agent:

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

GoodRate/BadRate:

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

Svartidspunkt:

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

Upstream-svartid (1. upstream-svartid):

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

Status for tabeltælling for alle vhost:

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

Generel visning af instrumentbrættet

Nginx-log-collector-værktøj fra Avito til at sende nginx-logfiler til Clickhouse

Nginx-log-collector-værktøj fra Avito til at sende nginx-logfiler til Clickhouse

Nginx-log-collector-værktøj fra Avito til at sende nginx-logfiler til Clickhouse

Sammenligning af avg() og quantile()

gennemsnit()
Nginx-log-collector-værktøj fra Avito til at sende nginx-logfiler til Clickhouse
kvantil()
Nginx-log-collector-værktøj fra Avito til at sende nginx-logfiler til Clickhouse

Konklusion:

Jeg håber, at fællesskabet vil blive involveret i at udvikle/teste og bruge nginx-log-collector.
Og når nogen implementerer nginx-log-collector, vil de fortælle dig, hvor meget de har sparet på disk, RAM og CPU.

Telegram kanaler:

Millisekunder:

For hvem millisekunder betyder noget, bedes du skrive eller stemme i dette spørgsmål.

Kilde: www.habr.com

Tilføj en kommentar