Nginx-log-collector nástroj od Avita pro odesílání logů nginx do Clickhouse

V tomto článku se bude projednávat projekt nginx-log-collector, který bude číst logy nginx a posílat je do klastru Clickhouse. Obvykle se pro logy používá ElasticSearch. Clickhouse vyžaduje méně zdrojů (diskový prostor, RAM, CPU). Clickhouse rychleji zapisuje data. Clickhouse komprimuje data, což činí data na disku ještě kompaktnějšími. Výhody Clickhouse jsou patrné za 2 slajdy z prezentace Jak VK vkládá data do ClickHouse z desítek tisíc serverů.

Nginx-log-collector nástroj od Avita pro odesílání logů nginx do Clickhouse

Nginx-log-collector nástroj od Avita pro odesílání logů nginx do Clickhouse

Pro zobrazení analytiky logů vytvoříme dashboard pro Grafana.

Kdo se zajímá, vítejte pod kat.

Instalujeme nginx, grafana standardním způsobem.

Instalujeme klastr clickhouse pomocí ansible-playbook od Denisa Proskurina.

Vytvoření databáze a tabulek v Clickhouse

V tomto souboru jsou popsány SQL dotazy pro vytvoření databáze a tabulek pro nginx-log-collector v Clickhouse.

Každý dotaz provádíme postupně na každém serveru klastru Clickhouse.

Důležitá poznámka. V tomto řádku je třeba nahradit logs_cluster názvem vašeho klastru z souboru clickhouse_remote_servers.xml mezi "remote_servers" a "shard".

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

Instalace a nastavení nginx-log-collector-rpm

Nginx-log-collector nemá rpm. Zde https://github.com/patsevanton/nginx-log-collector-rpm vytváříme mu rpm. Sestavovat rpm se bude pomocí Fedora Copr

Instalujeme rpm balíček 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

Opraven konfig /etc/nginx-log-collector/config.yaml:

  .......
  upload:
    table: nginx.access_log
    dsn: http://ip-adresa-klastru-clickhouse:8123/

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

Nastavení nginx

Celkový konfig 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;
}

Virtuální hostitel jeden:

vhost1.conf:

upstream backend {
    server ip-adresa-serveru-s-stub_http_server:8080;
    server ip-adresa-serveru-s-stub_http_server:8080;
    server ip-adresa-serveru-s-stub_http_server:8080;
    server ip-adresa-serveru-s-stub_http_server:8080;
    server ip-adresa-serveru-s-stub_http_server:8080;
}

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

Přidáváme do souboru /etc/hosts virtuální hostitele:

ip-adresa-serveru-s-nginx vhost1

Emulátor HTTP serveru

Jako emulátor HTTP serveru využijeme nodejs-stub-server od Maxim Ignatenko

Nodejs-stub-server nemá rpm. Tady https://github.com/patsevanton/nodejs-stub-server vytváříme mu rpm. Sestavovat rpm se bude pomocí Fedora Copr

Instalujeme na upstream nginx rpm balíček nodejs-stub-server

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

Zátěžové testování

Testování provádíme pomocí Apache benchmark.

Instalujeme ho:

yum install -y httpd-tools

Spouštíme testování pomocí Apache benchmark z 5 různých serverů:

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

Nastavení Grafany

Na oficiálních stránkách Grafany nenajdete dashboard.

Proto ho uděláme ručně.

Můj uložený dashboard můžete najít tady.

Také musíte vytvořit proměnnou table s obsahem nginx.access_log.
Nginx-log-collector nástroj od Avita pro odesílání logů nginx do Clickhouse

Singlestat Celkové požadavky:

VYBERTE
 1 jako t,
 počet(*) jako c
 Z $table
 KDE $timeFilter SKUPINA PODLE t

Nginx-log-collector nástroj od Avita pro odesílání logů nginx do Clickhouse

Jednoduchá statistika Neúspěšné požadavky:

VYBERTE
 1 jako t,
 počet(*) jako c
 Z $table
 KDE $timeFilter A status NEPATŘÍ DO (200, 201, 401) SKUPINA PODLE t

Nginx-log-collector nástroj od Avita pro odesílání logů nginx do Clickhouse

Jednoduchá statistika Procento selhání:

VYBERTE
 1 jako t, (suma(status = 500 nebo status = 499) / suma(status = 200 nebo status = 201 nebo status = 401)) * 100 Z $table
 KDE $timeFilter SKUPINA PODLE t

Nginx-log-collector nástroj od Avita pro odesílání logů nginx do Clickhouse

Jednoduchá statistika Průměrný čas odezvy:

VYBERTE
 1, průměr(request_time) Z $table
 KDE $timeFilter SKUPINA PODLE 1

Nginx-log-collector nástroj od Avita pro odesílání logů nginx do Clickhouse

Jednoduchá statistika Maximální čas odezvy:

VYBERTE
 1 jako t, maximální(request_time) jako c
 Z $table
 KDE $timeFilter SKUPINA PODLE t

Nginx-log-collector nástroj od Avita pro odesílání logů nginx do Clickhouse

Počítat stav:

$columns(status, počet(*) jako c) z $table

Nginx-log-collector nástroj od Avita pro odesílání logů nginx do Clickhouse

Pro zobrazení dat jako koláč je nutné nainstalovat plugin a restartovat grafanu.

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

Koláč TOP 5 Stav:

VYBERTE
    1, 	/* falešná časová hodnota */
    status,
    suma(status) AS Reqs
Z $table
KDE $timeFilter
SKUPINA PODLE status
OBJEDNAT PODLE Reqs sestupně
LIMIT 5

Nginx-log-collector nástroj od Avita pro odesílání logů nginx do Clickhouse

Dále budu uvádět dotazy bez screenshotů:

Počítat http_user_agent:

$columns(http_user_agent, počet(*) c) Z $table

Dobrý poměr/Špatný poměr:

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

Časování odezvy:

$rate(průměr(request_time) jako request_time) Z $table

Čas odezvy upstream (čas odezvy 1. upstreamu):

$rate(průměr(arrayElement(upstream_response_time,1)) jako upstream_response_time) Z $table

Tabulka počtu stavů pro všechny vhosty:

$columns(status, počet(*) jako c) z $table

Celkový vzhled dashboardu

Nginx-log-collector nástroj od Avita pro odesílání logů nginx do Clickhouse

Nginx-log-collector nástroj od Avita pro odesílání logů nginx do Clickhouse

Nginx-log-collector nástroj od Avita pro odesílání logů nginx do Clickhouse

Srovnání avg() a quantile()

avg()
Nginx-log-collector nástroj od Avita pro odesílání logů nginx do Clickhouse
quantile()
Nginx-log-collector nástroj od Avita pro odesílání logů nginx do Clickhouse

Výstup:

Doufám, že se komunita zapojí do vývoje/testování a používání nginx-log-collector.
A někdo když implementuje nginx-log-collector, poví kolik ušetřil na disku, RAM, CPU.

Telegram kanály:

Milisekundy:

Komu záleží na milisekundách, napište prosím nebo hlasujte v tomto issue.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster