Nginx loglarını Clickhouse-a göndərmək üçün Avito-dan Nginx-log-collector yardım proqramı

Bu məqalə layihəni müzakirə edəcək nginx-log-kollektorunginx qeydlərini oxuyacaq, onları Clickhouse klasterinə göndərin. Adətən ElasticSearch jurnallar üçün istifadə olunur. Clickhouse daha az resurs tələb edir (disk sahəsi, RAM, CPU). Clickhouse məlumatları daha sürətli yazır. Clickhouse məlumatları sıxışdırır, bu da diskdəki məlumatları daha da yığcam edir. Clickhouse-un üstünlüklərini hesabatdan 2 slaydda görmək olar VK on minlərlə serverdən məlumatları ClickHouse-a necə daxil edir.

Nginx loglarını Clickhouse-a göndərmək üçün Avito-dan Nginx-log-collector yardım proqramı

Nginx loglarını Clickhouse-a göndərmək üçün Avito-dan Nginx-log-collector yardım proqramı

Qeydlər üzrə analitikaya baxmaq üçün Grafana üçün idarə paneli yaradaq.

Kimin qayğısına qalır, pişik altında xoş gəlmisiniz.

Nginx, grafana standart şəkildə quraşdırın.

ansible-playbook ilə clickhouse klasterini quraşdırın Denis Proskurin.

Clickhouse-da verilənlər bazası və cədvəllərin yaradılması

Bu da fayl Clickhouse-da nginx-log-collector üçün verilənlər bazası və cədvəllər yaratmaq üçün SQL sorğuları təsvir edilmişdir.

Biz hər sorğunu növbə ilə Clickhouse klasterinin hər bir serverində edirik.

Vacib qeyd. Bu sətirdə logs_cluster "remote_servers" və "shard" arasında clickhouse_remote_servers.xml faylından klaster adınızla əvəz edilməlidir.

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

Nginx-log-collector-rpm quraşdırılması və konfiqurasiyası

Nginx-log-collector-da rpm yoxdur. Budur https://github.com/patsevanton/nginx-log-collector-rpm bunun üçün rpm yaradın. rpm istifadə edərək qurulacaq Fedora Kopr

nginx-log-collector-rpm rpm paketini quraşdırın

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

/etc/nginx-log-collector/config.yaml konfiqurasiyasını redaktə edin:

  .......
  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 qurulması

Ümumi nginx konfiqurasiyası:

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

Virtual host biri:

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

/etc/hosts faylına virtual hostlar əlavə edin:

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

HTTP server emulyatoru

HTTP server emulyatoru olaraq istifadə edəcəyik nodejs-stub-server etibarən Maksim İqnatenko

nodejs-stub-serverdə rpm yoxdur. Budur https://github.com/patsevanton/nodejs-stub-server bunun üçün rpm yaradın. rpm istifadə edərək qurulacaq Fedora Kopr

Yuxarı nginx rpm-də nodejs-stub-server paketini quraşdırın

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 Testi

Test Apache benchmark istifadə edərək həyata keçirilir.

Quraşdırın:

yum install -y httpd-tools

5 fərqli serverdən Apache etalonundan istifadə edərək test etməyə başlayırıq:

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 qurulması

Rəsmi Grafana saytında idarə paneli tapa bilməyəcəksiniz.

Buna görə də bunu əl ilə edəcəyik.

Saxlanmış idarə panelimi tapa bilərsiniz burada.

Siz həmçinin məzmunla cədvəl dəyişəni yaratmalısınız nginx.access_log.
Nginx loglarını Clickhouse-a göndərmək üçün Avito-dan Nginx-log-collector yardım proqramı

Singlestat Total Sorğular:

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

Nginx loglarını Clickhouse-a göndərmək üçün Avito-dan Nginx-log-collector yardım proqramı

Singlestat uğursuz sorğular:

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

Nginx loglarını Clickhouse-a göndərmək üçün Avito-dan Nginx-log-collector yardım proqramı

Tək statistik uğursuzluq faizi:

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 loglarını Clickhouse-a göndərmək üçün Avito-dan Nginx-log-collector yardım proqramı

Singlestat Orta Cavab Vaxtı:

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

Nginx loglarını Clickhouse-a göndərmək üçün Avito-dan Nginx-log-collector yardım proqramı

Singlestat Max Cavab Vaxtı:

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

Nginx loglarını Clickhouse-a göndərmək üçün Avito-dan Nginx-log-collector yardım proqramı

Statusu:

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

Nginx loglarını Clickhouse-a göndərmək üçün Avito-dan Nginx-log-collector yardım proqramı

Pasta kimi məlumatları çıxarmaq üçün plaqini quraşdırmalı və grafananı yenidən yükləməlisiniz.

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

Pie TOP 5 Vəziyyəti:

SELECT
    1, /* fake timestamp value */
    status,
    sum(status) AS Reqs
FROM $table
WHERE $timeFilter
GROUP BY status
ORDER BY Reqs desc
LIMIT 5

Nginx loglarını Clickhouse-a göndərmək üçün Avito-dan Nginx-log-collector yardım proqramı

Bundan əlavə, ekran görüntüləri olmadan sorğular verəcəyəm:

http_user_agent sayın:

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

GoodRate/BadRate:

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

cavab vaxtı:

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

Upstream cavab müddəti (1-ci yuxarı axının cavab vaxtı):

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

Bütün vhostlar üçün Cədvəl Sayının Statusu:

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

İdarə panelinin ümumi görünüşü

Nginx loglarını Clickhouse-a göndərmək üçün Avito-dan Nginx-log-collector yardım proqramı

Nginx loglarını Clickhouse-a göndərmək üçün Avito-dan Nginx-log-collector yardım proqramı

Nginx loglarını Clickhouse-a göndərmək üçün Avito-dan Nginx-log-collector yardım proqramı

avg() və quantile() müqayisəsi

orta()
Nginx loglarını Clickhouse-a göndərmək üçün Avito-dan Nginx-log-collector yardım proqramı
kvantil()
Nginx loglarını Clickhouse-a göndərmək üçün Avito-dan Nginx-log-collector yardım proqramı

Nəticə:

Ümid edirəm ki, icma nginx-log-collector-un işlənib hazırlanmasına/sınağına və istifadəsinə cəlb olunacaq.
Və kimsə nginx-log-collector tətbiq edəndə sizə diskə, RAM-a, CPU-ya nə qədər qənaət etdiyini söyləyəcək.

Telegram kanalları:

Millisaniyələr:

Kimin millisaniyələri maraqlanır, yazın və ya səs verin buraxılış.

Mənbə: www.habr.com

Добавить комментарий