Utiliti Nginx-log-collector dari Avito untuk menghantar log nginx ke Clickhouse

Artikel ini akan membincangkan projek tersebut nginx-log-collector, yang akan membaca log nginx, menghantarnya ke kluster Clickhouse. Biasanya ElasticSearch digunakan untuk log. Clickhouse memerlukan lebih sedikit sumber (ruang cakera, RAM, CPU). Clickhouse menulis data dengan lebih pantas. Clickhouse memampatkan data, yang menjadikan data pada cakera lebih padat. Kebaikan Clickhouse boleh dilihat dalam 2 slaid dari laporan tersebut Bagaimana VK memasukkan data ke dalam ClickHouse daripada puluhan ribu pelayan.

Utiliti Nginx-log-collector dari Avito untuk menghantar log nginx ke Clickhouse

Utiliti Nginx-log-collector dari Avito untuk menghantar log nginx ke Clickhouse

Untuk melihat analitis mengikut log, mari buat papan pemuka untuk Grafana.

Siapa peduli, selamat datang di bawah kucing.

Pasang nginx, grafana dengan cara standard.

Pasang kelompok clickhouse dengan ansible-playbook daripada Denis Proskurin.

Mencipta pangkalan data dan jadual dalam Clickhouse

Dalam hal ini fail Pertanyaan SQL untuk mencipta pangkalan data dan jadual untuk nginx-log-collector dalam Clickhouse diterangkan.

Kami membuat setiap permintaan pada gilirannya pada setiap pelayan kluster Clickhouse.

Nota PENTING. Dalam baris ini, logs_cluster hendaklah digantikan dengan nama kluster anda daripada fail clickhouse_remote_servers.xml antara "remote_servers" dan "shard".

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

Memasang dan mengkonfigurasi nginx-log-collector-rpm

Nginx-log-collector tidak mempunyai rpm. Di sini https://github.com/patsevanton/nginx-log-collector-rpm buat rpm untuknya. rpm akan dibina menggunakan Fedora Copr

Pasang pakej 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/

Menyediakan nginx

Konfigurasi nginx am:

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

Hos maya 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 hos maya pada fail /etc/hosts:

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

Emulator pelayan HTTP

Sebagai emulator pelayan HTTP kami akan gunakan nodejs-stub-server daripada Maxim Ignatenko

nodejs-stub-server tidak mempunyai rpm. Di sini https://github.com/patsevanton/nodejs-stub-server buat rpm untuknya. rpm akan dibina menggunakan Fedora Copr

Pasang pakej nodejs-stub-server pada rpm nginx huluan

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

Ujian Tekanan

Pengujian dijalankan menggunakan penanda aras Apache.

Pasangnya:

yum install -y httpd-tools

Kami mula menguji menggunakan penanda aras Apache daripada 5 pelayan berbeza:

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

Menyediakan Grafana

Anda tidak akan menemui papan pemuka di laman web rasmi Grafana.

Oleh itu, kami akan melakukannya dengan tangan.

Anda boleh mencari papan pemuka saya yang disimpan di sini.

Anda juga perlu membuat pembolehubah jadual dengan kandungan nginx.access_log.
Utiliti Nginx-log-collector dari Avito untuk menghantar log nginx ke Clickhouse

Jumlah Permintaan Singlestat:

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

Utiliti Nginx-log-collector dari Avito untuk menghantar log nginx ke Clickhouse

Permintaan Singlestat Gagal:

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

Utiliti Nginx-log-collector dari Avito untuk menghantar log nginx ke Clickhouse

Peratusan Gagal 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

Utiliti Nginx-log-collector dari Avito untuk menghantar log nginx ke Clickhouse

Purata Masa Balas Singlestat:

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

Utiliti Nginx-log-collector dari Avito untuk menghantar log nginx ke Clickhouse

Masa Balas Maks Singlestat:

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

Utiliti Nginx-log-collector dari Avito untuk menghantar log nginx ke Clickhouse

Status Kiraan:

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

Utiliti Nginx-log-collector dari Avito untuk menghantar log nginx ke Clickhouse

Untuk mengeluarkan data seperti pai, anda perlu memasang pemalam dan muat semula grafana.

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

Status TOP 5 pai:

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

Utiliti Nginx-log-collector dari Avito untuk menghantar log nginx ke Clickhouse

Selanjutnya saya akan memberikan permintaan tanpa tangkapan skrin:

Kira http_user_agent:

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

Kadar Baik/Kadar Buruk:

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

masa tindak balas:

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

Masa tindak balas huluan (masa tindak balas huluan pertama):

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

Status Kiraan Jadual untuk semua vhost:

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

Pandangan umum papan pemuka

Utiliti Nginx-log-collector dari Avito untuk menghantar log nginx ke Clickhouse

Utiliti Nginx-log-collector dari Avito untuk menghantar log nginx ke Clickhouse

Utiliti Nginx-log-collector dari Avito untuk menghantar log nginx ke Clickhouse

Membandingkan purata() dan kuantiti()

purata()
Utiliti Nginx-log-collector dari Avito untuk menghantar log nginx ke Clickhouse
kuantiti()
Utiliti Nginx-log-collector dari Avito untuk menghantar log nginx ke Clickhouse

Kesimpulan:

Semoga komuniti akan terlibat dalam membangunkan/menguji dan menggunakan nginx-log-collector.
Dan apabila seseorang melaksanakan nginx-log-collector, dia akan memberitahu anda berapa banyak yang dia simpan cakera, RAM, CPU.

Saluran Telegram:

milisaat:

Siapa yang mengambil berat tentang milisaat, tulis atau undi, sila, dalam ini isu.

Sumber: www.habr.com

Tambah komen