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

Artikel ini akan membahas proyek nginx-log-collector , yang akan membaca log nginx dan mengirimkannya ke kluster Clickhouse. Biasanya untuk log gunakan ElasticSearch. Clickhouse membutuhkan lebih sedikit sumber daya (ruang disk, RAM, CPU). Clickhouse merekam data lebih cepat. Clickhouse memampatkan data, membuat data disk lebih padat. Manfaat Clickhouse terlihat dalam 2 slide dari laporan Bagaimana VK memasukkan data ke dalam ClickHouse dari puluhan ribu server.




Untuk melihat analitik log, buat dasbor untuk Grafana.


Siapa peduli, selamat datang ke kucing.


Instal nginx, grafana dengan cara standar.


Instal kluster clickhouse menggunakan playbook yang dimungkinkan oleh Denis Proskurin .


Membuat Database dan Tabel di Clickhouse


File ini menjelaskan kueri SQL untuk membuat database dan tabel untuk nginx-log-collector di Clickhouse.


Kami membuat setiap permintaan secara bergantian pada setiap server kluster Clickhouse.


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


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

Menginstal dan Mengkonfigurasi 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 dikumpulkan menggunakan Fedora Copr


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 config /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/ 

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

Tuan rumah virtual adalah 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, kita akan menggunakan 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 dikumpulkan menggunakan Fedora Copr


Instal paket nodejs-stub-server pada upstream 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 

Uji beban


Pengujian dilakukan dengan menggunakan benchmark Apache.


Pasang itu:


 yum install -y httpd-tools 

Kami mulai menguji menggunakan tolok ukur Apache dari 5 server yang 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 

Pengaturan Grafana


Di situs web resmi Grafana Anda tidak akan menemukan dasbor.


Karena itu, kami akan menyerahkannya.


Anda dapat menemukan dasbor saya yang disimpan di sini .


Anda juga perlu membuat variabel tabel dengan isi nginx.access_log .


Permintaan Total Singlestat:


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


Permintaan Gagal Singlestat:


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


Persen 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 


Waktu Respons Rata-Rata Singlestat:


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


Singlestat Max Response Time:


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


Status Hitung:


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


Untuk menampilkan data sebagai kue, Anda perlu menginstal plugin dan memulai kembali grafana.


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

Pie 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 


Selanjutnya saya akan memberikan permintaan tanpa tangkapan layar:


Hitung 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 

Waktu Tanggapan:


 $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 Tabel Status untuk semua vhost:


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

Tampilan umum dasbor





Membandingkan avg () dan quantile ()


rata-rata ()

quantile ()


Kesimpulan:


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


Saluran telegram:



Milidetik:


Kepada siapa milidetik itu penting, tulis atau pilih, dalam edisi ini.

Source: https://habr.com/ru/post/id484640/


All Articles