Nginx-log-collector-ilaĵo de Avito por sendi nginx-programojn al Clickhouse

Ĉi tiu artikolo diskutos pri la projekto nginx-log-kolektilo, kiu legos nginx-protokolojn, sendu ilin al la Clickhouse-grupo. Kutime ElasticSearch estas uzata por protokoloj. Clickhouse postulas malpli da rimedoj (diskospaco, RAM, CPU). Clickhouse skribas datumojn pli rapide. Clickhouse kunpremas la datumojn, kio faras la datumojn sur disko eĉ pli kompaktaj. Avantaĝoj de Clickhouse videblas en 2 lumbildoj de la raporto Kiel VK enmetas datumojn en ClickHouse de dekoj de miloj da serviloj.

Nginx-log-collector-ilaĵo de Avito por sendi nginx-programojn al Clickhouse

Nginx-log-collector-ilaĵo de Avito por sendi nginx-programojn al Clickhouse

Por vidi analizojn per protokoloj, ni kreu instrumentpanelon por Grafana.

Kiu zorgas, bonvenon sub kato.

Instalu nginx, grafana laŭ la norma maniero.

Instalu clickhouse cluster kun ansible-playbook de Denis Proskurin.

Kreante datumbazon kaj tabelojn en Clickhouse

En ĉi tio dosiero SQL-demandoj por krei datumbazojn kaj tabelojn por nginx-log-collector en Clickhouse estas priskribitaj.

Ni faras ĉiun peton laŭvice sur ĉiu servilo de la Clickhouse-grupo.

Grava noto. En ĉi tiu linio, logs_cluster devus esti anstataŭigita per via clusternomo de la clickhouse_remote_servers.xml dosiero inter "remote_servers" kaj "shard".

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

Instalado kaj agordo de nginx-log-collector-rpm

Nginx-log-collector ne havas rpm. Jen https://github.com/patsevanton/nginx-log-collector-rpm krei rpm por ĝi. rpm estos konstruita uzante Fedora Copr

Instalu rpm-pakaĵon 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

Redaktu agordon /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/

Agordo de nginx

Ĝenerala nginx-agordo:

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

Virtuala gastiganto unu:

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

Aldonu virtualajn gastigantojn al la /etc/hosts dosiero:

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

HTTP-servila emulilo

Kiel HTTP-servila emulilo ni uzos nodejs-stub-servilo el Maksimo Ignatenko

nodejs-stub-server ne havas rpm. Jen https://github.com/patsevanton/nodejs-stub-server krei rpm por ĝi. rpm estos konstruita uzante Fedora Copr

Instalu nodejs-stub-server pakaĵon sur kontraŭflua 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

Streĉa Testado

Testado estas farita per Apache-komparnormo.

Instalu ĝin:

yum install -y httpd-tools

Ni komencas testi uzante Apache-komparnormon de 5 malsamaj serviloj:

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

Starigante Grafana

Vi ne trovos panelon en la oficiala Grafana retejo.

Tial ni faros ĝin mane.

Vi povas trovi mian konservitan instrumentpanelon tie.

Vi ankaŭ devas krei tabelvariablon kun la enhavo nginx.access_log.
Nginx-log-collector-ilaĵo de Avito por sendi nginx-programojn al Clickhouse

Singlestat Totalaj Petoj:

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

Nginx-log-collector-ilaĵo de Avito por sendi nginx-programojn al Clickhouse

Singlestat Malsukcesaj Petoj:

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

Nginx-log-collector-ilaĵo de Avito por sendi nginx-programojn al Clickhouse

Malsukcesa Procento de Singlestat:

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-ilaĵo de Avito por sendi nginx-programojn al Clickhouse

Meza Respondtempo de Singlestat:

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

Nginx-log-collector-ilaĵo de Avito por sendi nginx-programojn al Clickhouse

Singlestat Maksimuma Respondtempo:

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

Nginx-log-collector-ilaĵo de Avito por sendi nginx-programojn al Clickhouse

Statuso de kalkulo:

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

Nginx-log-collector-ilaĵo de Avito por sendi nginx-programojn al Clickhouse

Por eligi datumojn kiel kukaĵon, vi devas instali la kromprogramon kaj reŝargi grafana.

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

Torto TOP 5 Statuso:

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-ilaĵo de Avito por sendi nginx-programojn al Clickhouse

Plue mi donos petojn sen ekrankopioj:

Nombri http_user_agent:

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

Bona Prezo/Malbona Indico:

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

tempo de respondo:

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

Kontraŭflua respondtempo (respondtempo de la unua kontraŭflua):

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

Tabelo-nombra stato por ĉiuj vhosts:

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

Ĝenerala vido de la panelo

Nginx-log-collector-ilaĵo de Avito por sendi nginx-programojn al Clickhouse

Nginx-log-collector-ilaĵo de Avito por sendi nginx-programojn al Clickhouse

Nginx-log-collector-ilaĵo de Avito por sendi nginx-programojn al Clickhouse

Komparante avg() kaj quantile()

mezumo ()
Nginx-log-collector-ilaĵo de Avito por sendi nginx-programojn al Clickhouse
Kvantilo ()
Nginx-log-collector-ilaĵo de Avito por sendi nginx-programojn al Clickhouse

Konkludo:

Espereble la komunumo okupiĝos pri evoluado/testado kaj uzado de nginx-log-collector.
Kaj kiam iu efektivigas nginx-log-collector, li diros al vi kiom li ŝparis diskon, RAM, CPU.

Telegram-kanaloj:

Milisekundoj:

Kiu zorgas pri milisekundoj, skribu aŭ voĉdoni, bonvolu, en ĉi tio temo.

fonto: www.habr.com

Aldoni komenton