Utilitas Nginx-log-collector dari Avito untuk mengirim log nginx ke Clickhouse

Artikel ini akan membahas proyek tersebut nginx-log-collector, yang akan membaca log nginx, mengirimkannya ke cluster Clickhouse. Biasanya ElasticSearch digunakan untuk log. Clickhouse membutuhkan lebih sedikit sumber daya (ruang disk, RAM, CPU). Clickhouse menulis data lebih cepat. Clickhouse memampatkan data, yang membuat data pada disk menjadi lebih ringkas. Manfaat Clickhouse dapat dilihat di 2 slide dari laporan tersebut Bagaimana VK memasukkan data ke ClickHouse dari puluhan ribu server.

Utilitas Nginx-log-collector dari Avito untuk mengirim log nginx ke Clickhouse

Utilitas Nginx-log-collector dari Avito untuk mengirim log nginx ke Clickhouse

Untuk melihat analitik berdasarkan log, mari buat dasbor untuk Grafana.

Siapa peduli, selamat datang di bawah kucing.

Instal nginx, grafana dengan cara standar.

Instal cluster clickhouse dengan playbook yang memungkinkan dari Denis Proskurin.

Membuat database dan tabel di Clickhouse

Dalam hal ini mengajukan Kueri SQL untuk membuat database dan tabel untuk nginx-log-collector di Clickhouse dijelaskan.

Kami membuat setiap permintaan secara bergiliran di setiap server cluster Clickhouse.

Catatan penting. Di baris ini, logs_cluster harus diganti dengan nama cluster Anda dari file clickhouse_remote_servers.xml antara "remote_servers" dan "shard".

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

Menginstal dan mengonfigurasi nginx-log-collector-rpm

Nginx-log-collector tidak memiliki rpm. Di Sini https://github.com/patsevanton/nginx-log-collector-rpm buat rpm untuk itu. rpm akan dibangun menggunakan Fedora Kopr

Instal paket rpm 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

Edit konfigurasi /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/

Menyiapkan nginx

Konfigurasi nginx umum:

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

Host virtual satu:

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

Tambahkan host virtual ke file /etc/hosts:

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

Emulator server HTTP

Sebagai emulator server HTTP yang akan kita gunakan nodejs-stub-server dari Maxim Ignatenko

nodejs-stub-server tidak memiliki rpm. Di Sini https://github.com/patsevanton/nodejs-stub-server buat rpm untuk itu. rpm akan dibangun menggunakan Fedora Kopr

Instal paket nodejs-stub-server pada rpm nginx upstream

yum -y install yum-plugin-copr
yum copr enable antonpatsev/nodejs-stub-server
yum -y install stub_http_server
systemctl start stub_http_server

Pengujian Stres

Pengujian dilakukan dengan menggunakan benchmark Apache.

Instal:

yum install -y httpd-tools

Kami memulai pengujian menggunakan benchmark Apache dari 5 server berbeda:

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

Menyiapkan Grafana

Anda tidak akan menemukan dashboard di website resmi Grafana.

Karena itu, kami akan melakukannya dengan tangan.

Anda dapat menemukan dasbor tersimpan saya di sini.

Anda juga perlu membuat variabel tabel dengan konten nginx.access_log.
Utilitas Nginx-log-collector dari Avito untuk mengirim log nginx ke Clickhouse

Permintaan Total Singlestat:

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

Utilitas Nginx-log-collector dari Avito untuk mengirim log nginx ke Clickhouse

Permintaan Gagal Singlestat:

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

Utilitas Nginx-log-collector dari Avito untuk mengirim log nginx ke Clickhouse

Persentase Kegagalan 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

Utilitas Nginx-log-collector dari Avito untuk mengirim log nginx ke Clickhouse

Waktu Respons Rata-Rata Singlestat:

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

Utilitas Nginx-log-collector dari Avito untuk mengirim log nginx ke Clickhouse

Waktu Respons Singlestat Maks:

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

Utilitas Nginx-log-collector dari Avito untuk mengirim log nginx ke Clickhouse

Hitung Status:

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

Utilitas Nginx-log-collector dari Avito untuk mengirim log nginx ke Clickhouse

Untuk mengeluarkan data seperti pie, Anda perlu menginstal plugin dan memuat ulang grafana.

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

Utilitas Nginx-log-collector dari Avito untuk mengirim log nginx ke Clickhouse

Selanjutnya saya akan memberikan permintaan tanpa tangkapan layar:

Hitung http_user_agent:

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

Nilai Baik/Nilai Buruk:

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

waktu respons:

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

Waktu respons hulu (waktu respons hulu ke-1):

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

Tabel Hitung Status untuk semua vhosts:

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

Tampilan umum dasbor

Utilitas Nginx-log-collector dari Avito untuk mengirim log nginx ke Clickhouse

Utilitas Nginx-log-collector dari Avito untuk mengirim log nginx ke Clickhouse

Utilitas Nginx-log-collector dari Avito untuk mengirim log nginx ke Clickhouse

Membandingkan avg() dan kuantil()

rata-rata()
Utilitas Nginx-log-collector dari Avito untuk mengirim log nginx ke Clickhouse
kuantil()
Utilitas Nginx-log-collector dari Avito untuk mengirim log nginx ke Clickhouse

Kesimpulan:

Semoga komunitas ikut terlibat dalam pengembangan/pengujian dan penggunaan nginx-log-collector.
Dan ketika seseorang mengimplementasikan nginx-log-collector, dia akan memberi tahu Anda seberapa banyak dia menghemat disk, RAM, CPU.

Saluran telegram:

Milidetik:

Siapa yang peduli dengan milidetik, tolong tulis atau pilih, dalam hal ini isu.

Sumber: www.habr.com

Tambah komentar