Nginx-log-collector-verktøy fra Avito for å sende nginx-logger til Clickhouse

Denne artikkelen vil diskutere prosjektet nginx-logg-samler, som vil lese nginx-logger og sende dem til Clickhouse-klyngen. Vanligvis brukes ElasticSearch for logger. Clickhouse krever mindre ressurser (diskplass, RAM, CPU). Clickhouse registrerer data raskere. Clickhouse komprimerer data, noe som gjør dataene på disken enda mer kompakte. Fordelene med Clickhouse er synlige i 2 lysbilder fra rapporten Hvordan VK setter inn data i ClickHouse fra titusenvis av servere.

Nginx-log-collector-verktøy fra Avito for å sende nginx-logger til Clickhouse

Nginx-log-collector-verktøy fra Avito for å sende nginx-logger til Clickhouse

For å se analyser basert på logger, vil vi lage et dashbord for Grafana.

Alle som er interessert, velkommen til katt.

Installer nginx, grafana på standard måte.

Installere en clickhouse-klynge ved hjelp av ansible-playbook fra Denis Proskurin.

Opprette databaser og tabeller i Clickhouse

i denne fil SQL-spørringer for å lage databaser og tabeller for nginx-log-collector i Clickhouse er beskrevet.

Vi gjør hver forespørsel en etter en på hver server i Clickhouse-klyngen.

Viktig notat. På denne linjen må logs_cluster erstattes med klyngenavnet ditt fra clickhouse_remote_servers.xml-filen mellom "remote_servers" og "shard".

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

Installere og konfigurere nginx-log-collector-rpm

Nginx-log-collector har ikke en rpm. Her https://github.com/patsevanton/nginx-log-collector-rpm lage rpm for det. rpm vil bli kompilert ved hjelp av Fedora Copr

Installer rpm-pakken 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

Rediger konfigurasjonen /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/

Sette opp nginx

Generell nginx-konfigurasjon:

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

Én virtuell vert:

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

Legg til virtuelle verter i filen /etc/hosts:

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

HTTP-serveremulator

Som en HTTP-serveremulator vil vi bruke nodejs-stub-server fra Maxim Ignatenko

Nodejs-stub-server har ikke en rpm. Her https://github.com/patsevanton/nodejs-stub-server lage rpm for det. rpm vil bli kompilert ved hjelp av Fedora Copr

Installer nodejs-stub-server-pakken på oppstrøms 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

Stresstesting

Vi utfører testing med Apache benchmark.

Installer det:

yum install -y httpd-tools

Vi begynner å teste med Apache benchmark fra 5 forskjellige servere:

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

Setter opp Grafana

Du finner ikke et dashbord på den offisielle Grafana-nettsiden.

Derfor vil vi gjøre det for hånd.

Du kan finne mitt lagrede dashbord her.

Du må også lage en tabellvariabel med innholdet nginx.access_log.
Nginx-log-collector-verktøy fra Avito for å sende nginx-logger til Clickhouse

Singlestat totalt antall forespørsler:

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

Nginx-log-collector-verktøy fra Avito for å sende nginx-logger til Clickhouse

Singlestat mislykkede forespørsler:

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

Nginx-log-collector-verktøy fra Avito for å sende nginx-logger til Clickhouse

Singlestat feilprosent:

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-verktøy fra Avito for å sende nginx-logger til Clickhouse

Singlestat gjennomsnittlig responstid:

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

Nginx-log-collector-verktøy fra Avito for å sende nginx-logger til Clickhouse

Singlestat Maks responstid:

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

Nginx-log-collector-verktøy fra Avito for å sende nginx-logger til Clickhouse

Antall status:

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

Nginx-log-collector-verktøy fra Avito for å sende nginx-logger til Clickhouse

For å sende ut data som en kake, må du installere plugin-en og starte grafana på nytt.

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

Pai 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-verktøy fra Avito for å sende nginx-logger til Clickhouse

Videre vil jeg gi forespørsler uten skjermbilder:

Telle 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

Svartidspunkt:

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

Oppstrøms responstid (første oppstrøms responstid):

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

Tabelltellingsstatus for alle vhost:

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

Generell oversikt over dashbordet

Nginx-log-collector-verktøy fra Avito for å sende nginx-logger til Clickhouse

Nginx-log-collector-verktøy fra Avito for å sende nginx-logger til Clickhouse

Nginx-log-collector-verktøy fra Avito for å sende nginx-logger til Clickhouse

Sammenligning av avg() og quantile()

avg()
Nginx-log-collector-verktøy fra Avito for å sende nginx-logger til Clickhouse
kvantil()
Nginx-log-collector-verktøy fra Avito for å sende nginx-logger til Clickhouse

Konklusjon:

Jeg håper fellesskapet blir involvert i å utvikle/teste og bruke nginx-log-collector.
Og når noen implementerer nginx-log-collector, vil de fortelle deg hvor mye disk, RAM og CPU de har lagret.

Telegram-kanaler:

Millisekunder:

For hvem millisekunder betyr noe, vennligst skriv eller stem i dette utstedelse.

Kilde: www.habr.com

Legg til en kommentar