Nginx-log-collector-hulpprogramma van Avito voor het verzenden van nginx-logboeken naar Clickhouse

In dit artikel wordt het project besproken nginx-log-collector, die nginx-logboeken zal lezen en deze naar het Clickhouse-cluster zal sturen. Meestal wordt ElasticSearch gebruikt voor logboeken. Clickhouse vereist minder bronnen (schijfruimte, RAM, CPU). Clickhouse registreert gegevens sneller. Clickhouse comprimeert gegevens, waardoor de gegevens op schijf nog compacter worden. De voordelen van Clickhouse zijn zichtbaar in 2 slides uit het rapport Hoe VK gegevens van tienduizenden servers in ClickHouse invoegt.

Nginx-log-collector-hulpprogramma van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Nginx-log-collector-hulpprogramma van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Om analyses op basis van logs te bekijken, zullen we een dashboard voor Grafana maken.

Wat maakt het uit, welkom onder cat.

Installeer nginx, grafana op de standaardmanier.

Installeer clickhouse-cluster met ansible-playbook van Denis Proskurin.

Een database en tabellen maken in Clickhouse

In deze bestand SQL-query's voor het maken van databases en tabellen voor nginx-log-collector in Clickhouse worden beschreven.

We doen elk verzoek beurtelings op elke server van het Clickhouse-cluster.

Belangrijke notitie. In deze regel moet logs_cluster worden vervangen door uw clusternaam uit het bestand clickhouse_remote_servers.xml tussen "remote_servers" en "shard".

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

Nginx-log-collector-rpm installeren en configureren

Nginx-log-collector heeft geen rpm. Hier https://github.com/patsevanton/nginx-log-collector-rpm maak er een toerental voor. rpm zal worden gebouwd met behulp van Fedora Kopr

Installeer het rpm-pakket 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

Bewerk configuratie /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 instellen

Algemene nginx-configuratie:

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

Virtuele host één:

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

Voeg virtuele hosts toe aan het bestand /etc/hosts:

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

HTTP-server-emulator

Als HTTP-serveremulator zullen we gebruiken nodejs-stub-server van Maxim Ignatenko

nodejs-stub-server heeft geen rpm. Hier https://github.com/patsevanton/nodejs-stub-server maak er een toerental voor. rpm zal worden gebouwd met behulp van Fedora Kopr

Installeer nodejs-stub-server-pakket 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 testen

Het testen wordt uitgevoerd met behulp van Apache benchmark.

Installeer het:

yum install -y httpd-tools

We beginnen met testen met behulp van Apache benchmark vanaf 5 verschillende servers:

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 opzetten

Op de officiële Grafana-website vindt u geen dashboard.

Daarom zullen we het met de hand doen.

Je kunt mijn opgeslagen dashboard vinden hier.

U moet ook een tabelvariabele met de inhoud maken nginx.access_log.
Nginx-log-collector-hulpprogramma van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Singlestat Totaal aantal verzoeken:

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

Nginx-log-collector-hulpprogramma van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Singlestat mislukte verzoeken:

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

Nginx-log-collector-hulpprogramma van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Singlestat falend percentage:

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-hulpprogramma van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Singlestat gemiddelde responstijd:

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

Nginx-log-collector-hulpprogramma van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Singlestat maximale responstijd:

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

Nginx-log-collector-hulpprogramma van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Telstatus:

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

Nginx-log-collector-hulpprogramma van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Om gegevens als een taart uit te voeren, moet u de plug-in installeren en grafana opnieuw laden.

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

Taart 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-hulpprogramma van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Verder zal ik verzoeken doen zonder screenshots:

Tel http_user_agent:

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

Goed/slecht tarief:

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

reactietijdstip:

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

Stroomopwaartse responstijd (1e stroomopwaartse responstijd):

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

Tabeltellingsstatus voor alle vhosts:

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

Algemeen overzicht van het dashboard

Nginx-log-collector-hulpprogramma van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Nginx-log-collector-hulpprogramma van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Nginx-log-collector-hulpprogramma van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Avg() en quantile() vergelijken

gemiddelde()
Nginx-log-collector-hulpprogramma van Avito voor het verzenden van nginx-logboeken naar Clickhouse
kwantiel()
Nginx-log-collector-hulpprogramma van Avito voor het verzenden van nginx-logboeken naar Clickhouse

Conclusie:

Hopelijk raakt de community betrokken bij het ontwikkelen/testen en gebruiken van nginx-log-collector.
En wanneer iemand nginx-log-collector implementeert, zal hij je vertellen hoeveel hij schijf, RAM, CPU heeft bespaard.

Telegram-kanalen:

Milliseconden:

Wie geeft er om milliseconden, schrijf of stem hierin alstublieft kwestie.

Bron: www.habr.com

Voeg een reactie