Nginx-log-Collector Utility vun Avito fir nginx Logbicher op Clickhouse ze schécken

Dësen Artikel wäert de Projet diskutéieren nginx-log-collector, déi nginx Logbicher liesen a se an de Clickhouse Cluster schécken. Normalerweis gëtt ElasticSearch fir Logbicher benotzt. Clickhouse erfuerdert manner Ressourcen (Plaz Plaz, RAM, CPU). Clickhouse records Daten méi séier. Clickhouse kompriméiert Daten, sou datt d'Daten op der Disk nach méi kompakt ginn. D'Virdeeler vum Clickhouse sinn an 2 Rutschen aus dem Bericht ze gesinn Wéi VK setzt Daten an ClickHouse vun Zéngdausende vu Serveren.

Nginx-log-Collector Utility vun Avito fir nginx Logbicher op Clickhouse ze schécken

Nginx-log-Collector Utility vun Avito fir nginx Logbicher op Clickhouse ze schécken

Fir Analyse baséiert op Logbicher ze gesinn, wäerte mir en Dashboard fir Grafana erstellen.

Jiddereen interesséiert, wëllkomm op Kaz.

Installéiert nginx, grafana op de Standard Manéier.

Installatioun vun engem clickhouse Stärekoup mat ansible-playbook aus Denis Proskurin.

Erstellt Datenbanken an Dëscher am Clickhouse

An dësem Fall Fichier SQL Ufroe fir Datenbanken an Dëscher fir nginx-log-Collector am Clickhouse ze kreéieren ginn beschriwwen.

Mir maachen all Ufro een nom aneren op all Server am Clickhouse Cluster.

Wichteg Notiz. An dëser Linn muss logs_cluster mat Ärem Clusternumm vun der clickhouse_remote_servers.xml Datei tëscht "remote_servers" an "shard" ersat ginn.

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

Installéieren a konfiguréieren nginx-log-collector-rpm

Nginx-log-collector huet keen rpm. Hei https://github.com/patsevanton/nginx-log-collector-rpm rpm dofir erstellen. rpm wäert kompiléiert ginn benotzt Fedora Cop

Installéiert den rpm Package 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

Änneren d'Konfiguratioun /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/

nginx opsetzen

Allgemeng nginx Configuratioun:

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

Ee virtuelle Host:

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

Füügt virtuelle Hosten un d'/etc/hosts Datei:

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

HTTP Server Emulator

Als HTTP Server Emulator wäerte mir benotzen nodejs-stub-server от Maxim Ignatenko

Nodejs-stub-Server huet keen rpm. Hei https://github.com/patsevanton/nodejs-stub-server rpm dofir erstellen. rpm wäert kompiléiert ginn benotzt Fedora Cop

Installéiert nodejs-stub-Server Package op 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

Stress Test

Mir maachen Tester mat Apache Benchmark.

Installéiert et:

yum install -y httpd-tools

Mir testen mat Apache Benchmark vu 5 verschiddene Serveren:

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 opbauen

Dir fannt keen Dashboard op der offizieller Grafana Websäit.

Dofir wäerte mir et mat der Hand maachen.

Dir kënnt mäi gespäichert Dashboard fannen hei.

Dir musst och eng Tabellvariabel mam Inhalt erstellen nginx.access_log.
Nginx-log-Collector Utility vun Avito fir nginx Logbicher op Clickhouse ze schécken

Singlestat Total Ufroen:

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

Nginx-log-Collector Utility vun Avito fir nginx Logbicher op Clickhouse ze schécken

Singlestat Ausgefall Ufroen:

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

Nginx-log-Collector Utility vun Avito fir nginx Logbicher op Clickhouse ze schécken

Singlestat Feeler Prozent:

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 Utility vun Avito fir nginx Logbicher op Clickhouse ze schécken

Singlestat Duerchschnëtt Äntwertzäit:

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

Nginx-log-Collector Utility vun Avito fir nginx Logbicher op Clickhouse ze schécken

Singlestat Max Äntwert Zäit:

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

Nginx-log-Collector Utility vun Avito fir nginx Logbicher op Clickhouse ze schécken

Zuel Status:

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

Nginx-log-Collector Utility vun Avito fir nginx Logbicher op Clickhouse ze schécken

Fir Daten auszeginn wéi e Pie, musst Dir de Plugin installéieren an Grafana nei starten.

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

Pie 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 Utility vun Avito fir nginx Logbicher op Clickhouse ze schécken

Weider ginn ech Ufroen ouni Screenshots:

Zielen http_user_agent:

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

GoodRate/BadRate:

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

Äntwert Timing:

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

Upstream Äntwertzäit (1st Upstream Äntwertzäit):

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

Tabellzuel Status fir all vhost:

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

Allgemeng Vue vum Dashboard

Nginx-log-Collector Utility vun Avito fir nginx Logbicher op Clickhouse ze schécken

Nginx-log-Collector Utility vun Avito fir nginx Logbicher op Clickhouse ze schécken

Nginx-log-Collector Utility vun Avito fir nginx Logbicher op Clickhouse ze schécken

Verglach vu avg () a quantile ()

avg()
Nginx-log-Collector Utility vun Avito fir nginx Logbicher op Clickhouse ze schécken
quantile()
Nginx-log-Collector Utility vun Avito fir nginx Logbicher op Clickhouse ze schécken

Fazit:

Ech hoffen d'Gemeinschaft wäert sech un der Entwécklung / Testen a benotzen nginx-log-collector involvéieren.
A wann iergendeen nginx-log-collector implementéiert, wäerte se Iech soen wéi vill se op Disk, RAM an CPU gespuert hunn.

Telegram Channels:

Millisekonnen:

Wien Millisekonnen wichteg ass, schreift w.e.g. oder stëmmt an dësem Fro.

Source: will.com

Setzt e Commentaire