V tomto článku se bude projednávat projekt , 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


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 .
Vytvoření databáze a tabulek v Clickhouse
V tomto 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 vytváříme mu rpm. Sestavovat rpm se bude pomocí
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-collectorOpraven 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 vhost1Emulátor HTTP serveru
Jako emulátor HTTP serveru využijeme od
Nodejs-stub-server nemá rpm. Tady vytváříme mu rpm. Sestavovat rpm se bude pomocí
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_serverZátěžové testování
Testování provádíme pomocí Apache benchmark.
Instalujeme ho:
yum install -y httpd-toolsSpouš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; doneNastavení 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 .
Také musíte vytvořit proměnnou table s obsahem nginx.access_log.

Singlestat Celkové požadavky:
VYBERTE
1 jako t,
počet(*) jako c
Z $table
KDE $timeFilter SKUPINA PODLE t
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
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
Jednoduchá statistika Průměrný čas odezvy:
VYBERTE
1, průměr(request_time) Z $table
KDE $timeFilter SKUPINA PODLE 1
Jednoduchá statistika Maximální čas odezvy:
VYBERTE
1 jako t, maximální(request_time) jako c
Z $table
KDE $timeFilter SKUPINA PODLE t
Počítat stav:
$columns(status, počet(*) jako c) z $table
Pro zobrazení dat jako koláč je nutné nainstalovat plugin a restartovat grafanu.
grafana-cli plugins install grafana-piechart-panel
service grafana-server restartKoláč 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
Dále budu uvádět dotazy bez screenshotů:
Počítat http_user_agent:
$columns(http_user_agent, počet(*) c) Z $tableDobrý 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 $tableTabulka počtu stavů pro všechny vhosty:
$columns(status, počet(*) jako c) z $tableCelkový vzhled dashboardu



Srovnání avg() a quantile()
avg()

quantile()

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 .
Zdroj: habr.com
