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

Denna artikel kommer att behandla projektet nginx-log-collector, som kommer att lÀsa nginx-loggar och skicka dem till Clickhouse-klustret. Oftast anvÀnds ElasticSearch för loggar. Clickhouse krÀver fÀrre resurser (diskutrymme, RAM, CPU). Clickhouse skriver data snabbare. Clickhouse komprimerar data, vilket gör att datan pÄ disken blir Ànnu mer komprimerad. Fördelarna med Clickhouse syns i de tvÄ bilderna frÄn presentationen Hur VK matar in data i ClickHouse frÄn tiotusentals servrar.

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

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

För att se analysen av loggarna kommer vi att skapa en instrumentpanel för Grafana.

Den som Àr intresserad Àr vÀlkommen att lÀsa vidare.

Vi installerar nginx och grafana pÄ standard sÀtt.

Vi installerar Clickhouse-klustret med hjÀlp av ansible-playbook frÄn Denis Proskurin.

Skapande av databas och tabeller i Clickhouse

I den hÀr filen beskrivs SQL-frÄgor för att skapa databas och tabeller för nginx-log-collector i Clickhouse.

Vi kör varje frÄga sekventiellt pÄ varje server i Clickhouse-klustret.

Viktig notering. I denna rad mÄste logs_cluster ersÀttas med ert klusternamn frÄn filen clickhouse_remote_servers.xml mellan "remote_servers" och "shard".

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

Installation och konfiguration av nginx-log-collector-rpm

Nginx-log-collector har ingen rpm. HÀr https://github.com/patsevanton/nginx-log-collector-rpm skapar vi en rpm för den. RPM kommer att byggas med hjÀlp av Fedora Copr

Vi installerar 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

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

  .......
  upload:
    table: nginx.access_log
    dsn: http://ip-adress-kluster-clickhouse:8123/

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

Konfiguration av nginx

Generell konfiguration av nginx:

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

Virtuell vÀrd en:

vhost1.conf:

upstream backend {
    server server-ip-address-with-stub_http_server:8080;
    server server-ip-address-with-stub_http_server:8080;
    server server-ip-address-with-stub_http_server:8080;
    server server-ip-address-with-stub_http_server:8080;
    server server-ip-address-with-stub_http_server:8080;
}

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

LÀgg till virtuella vÀrdar i filen /etc/hosts:

server-ip-address-with-nginx vhost1

HTTP server emulator

Som HTTP server emulator kommer vi att anvÀnda nodejs-stub-server frÄn Maxim Ignatenko

Nodejs-stub-server har inget rpm. HÀr https://github.com/patsevanton/nodejs-stub-server skapar vi en rpm för den. RPM kommer att byggas med hjÀlp av Fedora Copr

Installerar nodejs-stub-server rpm paket 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

Belastningstestning

Testningen utförs med hjÀlp av Apache benchmark.

Vi installerar det:

yum install -y httpd-tools

Vi startar testningen med hjÀlp av 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

Grafana konfiguration

PĂ„ Grafanas officiella webbplats hittar du ingen dashboard.

DÀrför kommer vi att göra det manuellt.

Min sparade instrumentpanel kan du hitta ). Ett typiskt exempel pÄ anvÀndning:.

Du behöver ocksÄ skapa en variabel table med innehÄllet nginx.access_log.
Nginx-log-collector, ett verktyg frÄn Avito för att skicka nginx-loggar till Clickhouse

Singlestat Totala FörfrÄgningar:

VÄLJ
 1 som t,
 count(*) som c
 FRÅN $table
 DÄR $timeFilter GRUPPERA EFTER t

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

Singlestat Misslyckade FörfrÄgningar:

VÄLJ
 1 som t,
 count(*) som c
 FRÅN $table
 DÄR $timeFilter OCH status INTE I (200, 201, 401) GRUPPERA EFTER t

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

Singlestat Misslyckande Andel:

VÄLJ
 1 som t, (sum(status = 500 eller status = 499) / sum(status = 200 eller status = 201 eller status = 401)) * 100 FRÅN $table
 DÄR $timeFilter GRUPPERA EFTER t

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

Singlestat Genomsnittlig Svarstid:

VÄLJ
 1, avg(request_time) FRÅN $table
 DÄR $timeFilter GRUPPERA EFTER 1

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

Singlestat Max Svarstid:

VÄLJ
 1 som t, max(request_time) som c
 FRÅN $table
 DÄR $timeFilter GRUPPERA EFTER t

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

RĂ€kna Status:

$columns(status, count(*) som c) FRÅN $table

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

För att visa data som ett cirkeldiagram, mÄste du installera pluginet och starta om grafana.

grafana-cli plugins installera grafana-piechart-panel
service grafana-server starta om

Cirkeldiagram Topp 5 Status:

VÄLJ
    1, 
    status,
    sum(status) AS Reqs
FRÅN $table
DÄR $timeFilter
GRUPPERA EFTER status
ORDNA EFTER Reqs desc
BEGRÄNSA 5

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

Vidare kommer jag att ge förfrÄgningar utan skÀrmbilder:

RĂ€kna http_user_agent:

$columns(http_user_agent, count(*) c) FRÅN $table

Bra Rate/DÄlig Rate:

$rate(countIf(status = 200) AS good, countIf(status != 200) AS bad) FRÅN $table

Svarstider:

$rate(avg(request_time) som request_time) FRÅN $table

Upstream svarstid (svarstid frÄn första upstream):

$rate(avg(arrayElement(upstream_response_time, 1)) som upstream_response_time) FRÅN $table

Tabell RÀkna Status för alla vhost:

$columns(status, count(*) som c) FRÅN $table

Översikt av instrumentpanelen

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

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

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

JÀmförelse avg() och quantile()

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

Slutsats:

Jag hoppas att gemenskapen kommer att engagera sig i utveckling/testning och anvÀndning av nginx-log-collector.
Och nÄgon som implementerar nginx-log-collector kommer att berÀtta hur mycket de har sparat i disk, RAM, CPU.

Telegram-kanaler:

Millisekunder:

Om millisekunder Àr viktiga för dig, skriv eller rösta gÀrna i detta problem.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster